类的层面
继承:
面向对象的开发语言中自然少不了继承,有了继承,就可以使子类拥有父类的属性和方法,这也是一种复用,甚至可以说是十分重要的一种复用,子类可以不用将某些方法
委托
在java中类直接调用这个类的static方法,类似c语言中的函数,直接调用就行,这样也是一种类的复用。类似Math.sprt()这种方法。
API层面
API应该做一件事,且做得很好
API应该尽可能小,但不能太小
Implementation不应该影响API
类的设计:尽量减少可变性,遵循LSP原则
方法的设计:不要让客户做任何模块可以做的事情,及时报错
框架层面
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。
前者是从应用方面而后者是从目的方面给出的定义。为了增加代码的复用性,可以使用委派和继承机制。同时,在使用这两种机制增加代码复用的过程中,我们也相应地在不同的类之间增加了关系(委派或继承关系)。而对于一个项目而言,各个不同类之间的依赖关系就可以看作为一个框架。一个大规模的项目可能由许多不同的框架组合而成。
开发者根据 framework的规约,填充自己的代码进去,形成完整系统。通常通过选择性覆盖来扩展框架;或者程序员可以添加专门的用户代码来提供特定的功能—即定义继承了抽象类祖先操作的具体类 Hook方法,它被应用程序覆盖以扩展框架。Hook方法系统地将应用程序域的接口和行为与应用程序在特定上下文中所需的变体解耦。 控制反转:与库或标准用户应用程序不同,控制流不是由调用者决定的,而是由框架决定的。不可修改的框架代码:在接受用户实现的扩展时,框架代码不应该被修改。换句话说,用户可以扩展框架,但不应修改其代码。
常见的框架类似于spring框架这种,spring框架代码不能修改但是拥有DI,IOC,方便用户创建对象,何时创建对象,交给系统来判断,用户只需要使用对象就行了。
框架分为白盒框架和黑盒框架:
白盒框架:
通过子类化和重写方法进行扩展(使用继承);
通用设计模式:模板方法;
子类具有主要方法但对框架进行控制。 允许扩展每一个非私有方法
需要理解父类的实现 一次只进行一次扩展 通常被认为是开发者框架
黑盒框架:
黑盒框架时基于委派的组合方式,是不同对象之间的组合。之所以是黑盒,是因为不用去管对象中的方法是如何实现的,只需关心对象上拥有的方法。这种方式较白盒框架更为灵活,因为可以在运行时动态地传入不同对象,实现不同对象间的动态组合;而继承机制在静态编译时就已经确定好。
学习心得
随着软件的发展,软件的规模与复杂度越来越高,随之而来的就是软件的设计开发与维护成本越来越高,人们在应对软件危机的过程中已经认识到很多时候人们需要与需求的变化作斗争,而复用是应对需求变化的有力武器。
面向过程的软件开发中,复用主要体现在函数这一级,人们将公用的功能写成函数,在不同项目中主要是靠复制粘贴的方式进行复用,随后发展为库函数,复用的方式有了一些改进,这其实也是构件的一个雏形。随着软件规模的扩大,人们引进了面向对象的思想,向对象技术面提供了一种新的认知和表示世界的思想和方法。用对象来作为描写客观世界的基本单元,它包括封装在一起的对象属性和对象操作。面向对象技术是以对象为基础来构建系统的。通过把这些有关联的变量和函数封装在一个对象中,大大的简化了编程的复杂性,提高了程序可读性,并且提供了一种抽象,该抽象是可扩展性的关键。面向对象使得软件的开发与业务逻辑联系进一步加强,使得大规模设计与开发成为可能。在这个过程中,人们在面对类爆炸时,面对需求变化时总结与提炼出了基本的设计模式,设计模式很大程度上是防止人为地把软件设计搞复杂。软件的进一步发展,硬件就应运而生,硬件通常由规约和实现两部构成。
进行软件复用的意义:
1.提高生产率:软件复用最明显的好处在于提高生产率,从而减少开发代价。生产率的提高不仅体现在代码开发阶段。在分析、设计及测试阶段同样可以利用重用来节省开销。
2.减少维护代价:好的复用可以减少软件需要维护的部分。
3.提高互操作性:复用经过检验的构件,减少了可能的错误。基于复用技术生产的软件系统,大多使用相同的接口对外实现通信,因此系统将更为有效地实现与其他系统之间的互操作。
4.支持快速原型:可以快速构造出系统可操作的模型,以获得用户对系统功能的反馈。利用可复用构件可以快速有效地构造出应用程序的原型。
5.减少培训开销:使用一个可复用构件库时,可以减少所需的非正式的开销,因为其中的构件都是工程师所熟悉和精通的。
软件产品是人们的一种精神产品,它来于人们的思维大脑,因此其价值则是它所承载的思想精华。软件产品的价值是无法与实实在在的物品去衡量和比较的,因为软件产品的特殊性就在于,人们可以发挥无限的形象力并赋予软件,其复杂性极大,软件复用自然也是如此。软件复用技术的关键在于领会并灵活运用软件复用思想。因此我们需要掌握其精髓,深刻理解软件复用。