抽象是软件设计中的重要手段和方法,合理地使用抽象可以提升设计的简单性,改善软件开发的质量。通常在软件设计中使用到两种抽象方法,基于过程的抽象和基于数据的抽象。
过程抽象
基于过程做抽象时,会将待解决的问题分解为一个个小的子问题,每一个子问题分别由一个独立的模块、函数、类等来完成。这种分解策略不仅仅是把一个系统或模块拆分为一个一个的代码块,其意义在于分解出来的模块、函数或者类能够完成一个相对独立的功能,并且能够在其它的系统或模块中被重复引用。
在基于过程的抽象中,不同层次的过程在实现上相互独立;良好抽象的系统在其中某一个部分的实现被替换的情况下,不需要修改设计仍然能正常工作。同时,基于设计良好的抽象,我们可以通过组合的方式,构建出功能更加强大和复杂的系统。
数据抽象
相应地,在基于数据抽象的方法中,我们可以将复杂数据结构的使用和它的构造分离开来,通过使用“抽象数据”的方式,具体数据结构的用户可以通过明确定义的一系列接口对其进行访问和操作。
对于不同的问题,其解决的方式不同,选择的抽象方式也不同。选择合适的抽象方式可以使得软件的设计更加简单、合理。如果选择了不适合问题本质的抽象方式,不仅会影响软件设计的简单性,可能给软件的可维护性带来负面的影响。
数据抽象将数据对象的表示以及数据对象的使用分离开来,隐藏了所描述对象的内部特征,对于外部环境而言是透明的。而外部环境只有通过使用该对象所提供的操作来表现对象的动态特征。在定义具体的数据表示时,不用关心该数据被使用的方式,两者相互独立。
数据的定义和使用分别被称为选择器(selectors)和构造器(constructors),基于选择器和构造器,可以构造出一套新的适用于此领域的新的“语言”,提升业务代码开发中的概念层次。
更多内容,可以参考SICP。