从类、API、框架三个层面学习如何设计可复用软件实体的具体技术并撰写学习心得

从类、API、框架三个层面学习如何设计可复用软件实体的具体技术并撰写学习心得

从类的层面:

行为子结构;协变与逆变;Liskov替换原则(LSP)

在OOP中设计可复用的类
封装和信息隐藏;继承和重写;多态性,子类型和重载;泛型编程;行为子类型和Liskov替代原则(LSP);组合与委托

从API层面来说

客户端:使用API的代码 插件:定制框架的客户端代码
扩展点:框架内预留的“空白”,开发者开发出符合接口要求的代码(即插件),框架可调用,从而相当于开发者扩展了框架的功能
协议:API和客户端之间预期的交互顺序
回调:框架调用来访问定制功能的插件方法
生命周期方法:根据协议和插件状态按顺序调用的回调方法
建议:始终以开发API的标准面对任何开发任务;
面向“复用”编程而不是面向“应用”编程。
难度:要有足够良好的设计,一旦发布就无法再自由改变。

编写一个API需要考虑以下方面:

(1)API应该做一件事,且做得很好

(2)API应该尽可能小,但不能太小

(3)Implementation不应该影响API

(4)考虑性能后果

API必须与平台和平共存

类的设计:尽量减少可变性,遵循LSP原则

方法的设计:不要让客户做任何模块可以做的事情,及时报错

LSP原则

定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

定义2:所有引用基类的地方必须能透明地使用其子类的对象。

问题由来:
有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后 的功 能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。

解决方案:
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法

LSP依赖于以下限制:
前置条件不能强化
后置条件不能弱化
不变量要保持
子类型方法参数:逆变
子类型方法的返回值:协变
异常类型:协变

 

从框架方面来说
框架分为白盒框架和黑盒框架。
白盒框架:

通过子类化和重写方法进行扩展(使用继承);

通用设计模式:模板方法;

子类具有主要方法但对框架进行控制。

黑盒框架:

通过实现插件接口进行扩展(使用组合/委派);

常用设计模式:Strategy, Observer ;

插件加载机制加载插件并对框架进行控制。

框架与设计模式:

框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。构件通常是代码重用,而设计模式是设计重用,框架则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。 

框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值