面向复用的软件构造技术

1.为什么要进行软件复用

        软件复用可以降低成本和开发时间,通过缩短软件生产周期(软件开发速度更快,人员更少)来提高软件生产率。且经过充分测试的软件,可靠、稳定,复用已经存在一段时间并经过调试的功能是构建稳定子系统的基础。复用还可以维持标准化,符合规则、连贯的设计。

2.可重用组件的级别和形态

        可复用最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用。白盒复用是指源代码可见,可修改和扩的复用,当代码本身可用时重用代码。通常需要某种修改或适应,您可以定制模块以适应特定情况,这允许在更多情况下重用,增加了代码的复杂性。需要对组件内部的内在知识有一定了解。黑盒复用是指源代码不可见,不能修改,通过提供一些“胶水”以组合现有代码的形式进行复用,但不必更改代码本身,通常是因为无法访问代码,只能通过API接口来使用。

2.1源代码复用

        源代码重用是最低级别的复用,存在的维护问题是需要在多个地方更正代码,太多代码要处理(很多版本),且过程中出错的风险高,可能需要了解所使用软件的工作原理,需要访问源代码。

2.2模块级复用:类/接口

        类是代码重用的原子单元,不需要了解最细致的代码,类文件或jar/zip,只需要包含在类路径中,可以使用javap工具获得一个类的公共方法头。Java提供了一种名为继承的代码重用方法,类扩展现有类的属性/行为,此外,它们可能会覆盖现有的行为。委派是指一个对象依赖于另一个对象来实现其功能的子集(一个实体将某些东西传递给另一个实体)。例如,排序器将功能委托给一些比较器,明智的委托可以实现代码重用。

2.3库级复用:API/包

        什么是库?库就是一组提供可重用功能的类和方法(api)。而框架:可是重用的骨架代码,其支持定制到应用程序中。框架调用回客户端代码应用了所谓的好莱坞原则:“不要打电话给我们。我们会给你打电话的。”

 

2.4系统级复用:框架

        框架是包含抽象类和具体类的集合以及每个类之间的接口的子系统设计,可以说其只有骨架而无血肉。框架是一种抽象,其中提供通用功能的软件可以通过附加的用户编写的代码选择性地更改,从而提供特定于应用程序的软件。开发者需要根据framework的规约,填充自己的代码进去,形成完整系统。

        可以将framework看作是更大规模的API复用,除了提供可复用的API,还将这些模块之间的关系都确定下来,形成了整体应用的领域复用Framework作为主 程序加以执行,执 行过程中调用开发者所写的程序,而开发者根据 Framework预留的接口所写的程序。

3.里氏替换原则(LSP)

        在创建复用程序时,ADT和OOP都要符合LSP原则。符合LSP原则的类型成为行为子类型。具体来说,行为子类型需要满足如下条件:

        子类型需要实现抽象类型中的所有未实现方法;子类型中重写的方法必须有相同类型的返回值或者符合co-variance(协变)的返回值;子类型中重写的方法必须使用同样类型的参数或者符合contra-variance(逆变)的参数;子类型中重写的方法不能抛出额外的异常,应当抛出相同或者符合co-variance的异常;且子类型的前置条件需要更弱,后置条件需要更强,不变量需要变强或者不变。

3.1协变

协变指的是父类型到子类型应当有越来越具体的specific,而返回值类型应当不变或变得更具体,异常的类型也是如此。

3.2逆变

        逆变指的是父类型到子类型应当具有越来越具体specific,但参数类型要与协变相反的变化,要不变或越来越抽象。

目前Java中遇到协变和逆变改变参数、返回值、异常类型,都当作重载处理。

 

4.总结

        这里的重点主要是LSP,要能够判断各种情况下的子类是否都符合LSP,且要能判别清楚泛型的子类只有使用通配符<?>才行。希望对你起到帮助,欢迎讨论和提出问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值