如果说软件开发有什么真理的话,我想,那一定就是SOC(Separation of concerns,中文翻译叫关注点分离)。SOC原则,就是在软件开发中,通过各种手段,将问题的各个关注点分开。我已经记不得第一次在什么时候什么地方听说这一原则的,当时看一下就忘掉了。可是随着对软件开发的体会的加深,SOC这个概念不断的在我的脑海中浮现,以致于我把它当作软件开发的真理!
问题太过于复杂,要解决问题需要关注的点太多,而程序员的能力是有限的,不能同时关注于问题的各个方面。正如程序员的记忆力相对于计算机知识来说那么有限一样,程序员解决问题的能力相对于要解决的问题的复杂性也是一样的非常有限。计算机知识太多而且不断进化,计算机程序也太复杂,而且还在不断的复杂化。记得有一本记算机图书中,用这样一个例子来对比程序和传统行业复杂性的差别有多大,说一架精密的波音客机,所有的部件加在一起,总共只有2万个,而GCC编译器,光全局变量就有40万之多,可见程序有多复杂。另一方面,人类的注意力所能同时关注的点又是相当的少的。举个简单的例子,一般人很难同时左右手分别划圆划方,就是因为我们的大脑很难同时关注于两只手,让两只手分别做自己的事。因此,做为普通人的程序员面对这种复杂性时,必须采用某些方法把问题分解成若干部分,这样程序员可以同一时刻只关注于问题的某些方面或部分,如果分解后的部分还是太复杂,那就再划分下去,直到使复杂问题变成一个个的简单问题。这就是关注点分离原则。这一准则,并不是计算机界的发明,只不过在计算机界显得更加的重要。
实现关注点分离的方法主要有两种,一种是标准化,另一种是抽象与包装。
标准化就是制定一套标准,让使用者都遵守它,将人们的行为统一起来,这样使用标准的人就不用担心别人会有很多种不同的实现,使自己的程序不能和别人的配合。Java EE就是一个标准的大集合。如果所有的应用服务器的开发者和应用的开发者都按照标准来做,那么应用开发者就不用关心不同的应用服务器有什么差别,服务器的开发者也不用担心应用开发者开发的应用有什么差别。每个开发都只需要关注于标准本身和他所在做的事情就行了。就像是开发镙丝钉的人只专注于开发镙丝钉就行了,而不用关注镙帽是怎么生产的,反正镙帽和镙丝钉按标来就一定能合得上。也就是因为标准具有这样的威力,所有计算机界有很多标准。
不断地把程序的某些部分抽像差包装起来,也是实现关注点分离的好方法。一旦一个函数被抽像出来并实现了,那么使用函数的人就不用关心这个函数是如何实现的,同样的,一旦一个类被抽像并实现了,类的使用者也不用再关注于这个类的内部是如何实现的。诸如组件,分层,面向服务,等等这些概念都是在不同的层次上做抽像和包装,以使得使用者不用关心它的内部实现细节。
每一个程序员都应当理解SOC,并在实践中遵循这一真理。当你在编程的过程中,一时搞不清程序的每一个细节,你可以只关注于主干,把程序的主干写出来,再逐一关注每个分支。这是一种自上而下的方法。如果主干也搞不清,那可以先关注于分支,写出分支,再不断地组合这些分支成为主干,这是一种自下而上的方法。时刻考虑着,是不是要把这一段程序抽像成一个方法,或者类,是不是那样会更好。如果不这样去想去做,要么面对问题无从下手,写不出什么来,要么只会写出面条似的拖沓冗长的代码。不会用SOC,摆在面前的永远是复杂得不能解决的问题。