目录
一、为什么需要复用:
-“The drive to create reusable rather than transitory artifacts has aesthetic and intellectual as well as economic motivations and is part of man’s desire for immortality.
– It distinguishes man from other creatures and civilized from primitive societies” (Wegner, 1989).
1.降低成本和开发时间
2.经过充分测试,可靠、稳定
3.标准化,在不同应用中保持一致
二、复用方式:
1.源代码级别的复用
2.模块级别的复用:类/抽象类/接口
3.库级别的复用:API/包
4.系统级别的复用:框架
三、框架:
一组具体类、抽象类、及其之间的连接关系
将framework看作是更大规模的API复用,除了提供可复用的API,还将这 些模块之间的关系都确定下来,形成了整体应用的领域复用
白盒框架:通过代码层面的继承进行框架拓展
黑盒框架:通过实现特定接口/delegation进行框架扩展
四、LSP:
子类型可以增加方法,但不可删
子类型需要实现抽象类型中的所有未实现方法
子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
子类型中重写的方法不能抛出额外的异常
协变:
父类型->子类型:
越来越具体specific
返回值类型:不变或变得更具体
异常的类型:也是如此
反协变:(在java中遇到此类情况,当作overload来看待)
父类型->子类型:越来越具体specific
参数类型:要相反的变化,不变或越来越抽象
数组的子类型化:
泛型的子类型化:
通配符使用场景:
If you are writing a method that can be implemented using functionality provided in the Object class.
When the code is using methods in the generic class that don't depend on the type parameter. For example, List.size or List.clear.
In fact, Class is so often used because most of the methods in Class do not depend on T