软件构造复习笔记五

1.可复用性的概念

复用的类型
软件复用:最主要的是代码复用,但也有其他方面。

Source code level:methods, statements, etc Module level:class and interface Library level:API Architecture level:framework

白盒复用:源代码可见、可修改和扩展(对应继承)

黑盒复用:源代码不可见,不能修改,只能通过API接口使用(对应委托)

代码复用
即直接复制代码(不推荐)

类的复用
inheritance 继承 delegation 委托

继承能做的事委托也能做,继承要求严格父子关系

框架(framework)
框架:一组具体类、抽象类、及其之间的连接关系

开发者根据framework的规约,填充自己的代码进去,形成完整系统

API和框架的区别:主控端在用户/框架

programming for reuse 面向复用编程:开发出可复用的软件
programming with reuse 基于复用编程:利用已有的可复用软件搭建应用系统

  • 优点
    • 降低成本和开发时间
    • 经过充分的测试,可靠、稳定
    • 标准化,在不同应用中保持一致

 

2. 面向复用的软件构造技术

Liskov Substitution Principle 里氏替换原则(LSP)

  • 子类型多态:客户端可用统一的方式处理不同类型的对象
  • 在可以使用父类的场景,都可以用子类型代替而不会有任何问题
  • 编译强制规则
    • 子类型可以增加方法,但不可删除方法
    • 子类型需要实现抽象类型中的所有未实现方法
    • 协变:子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
    • 逆变:子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
    • 子类型中重写的方法不能抛出额外的异常
  • Also applies to specified behavior (methods):
    • Same or stronger invariants 更强的不变量
    • Same or weaker preconditions 更弱的前置条件
    • Same or stronger postconditions 更强的后置条件

协变 & 反协变

父类型 → 子类型:

  • 协变:返回值和异常不变或越来越具体
  • 逆变(反协变):参数类型要相反地变化,要不变或越来越抽象

注意:Java不支持反协变!Java识别其为重载(而非重写)

数组满足协变。

泛型中的LSP

泛型不满足协变 List<String>不是List<Object>的子类型

Object是所有泛型的父类,List<?>List<Object>的父类

这是因为发生了类型擦除,运行时就不存在泛型了,所有的泛型都被替换为具体的类型。

但是在实际使用的过程中是存在能够处理不同的类型的泛型的需求的,如定义一个方法参数是List<E>类型的,但是要适应不同的类型的E,于是可使用通配符?来解决这个需求:

  • 无类型条件限制:
  • public static void printList(List<?> list) {
    	for (Object elem: list)
    		System.out.print(elem + " ");
    }
  • 当为A类型的父类型

      

public static void printList(List<? super A> list){...}
  • 当为A类型的子类型
public static void printList(List<? extends A> list){...}

        

 

委托(Delegation)

Interface Comparator< T >
int compare(T o1, T o2): Compares its two arguments for order

如果你的ADT需要比较大小,或者要放入Collections或Arrays进行排序,可以实现Comparator接口并且override compare()函数

另一种方法:让ADT实现Comparable接口,然后override compareTo() 方法

与使用Comparator的区别:不需要构建新的Comparator类,比较代码放在ADT内部

  • 一个对象请求另一个对象的功能
  • 通过运行时动态绑定,实现对其他类中代码的动态复用
  • 如果子类只需要复用父类中的一小部分方法,可以通过委托机制调用。
  • 委托是复用的一种常用形式。(CRP原则:尽量使用委托进行复用)
  • Use 使用:通过方法的参数传递(use_a)
  • Association 关联:通过类的属性传递(has_a)
  • “委托”发生在object层面
  • “继承”发生在class层面

composition/aggregation 组合/聚合(可认为是Association的两种具体形态)

聚合运行时可更改绑定对象(较弱的关联)

聚合B类销毁时,A类可能不会销毁(可能还有指向其的指针);组合B类销毁时,A类同时被销毁

白盒框架 & 黑盒框架的原理与实现

  • 黑盒框架
    • 通过实现特定接口进行框架扩展,采用的是delegation机制达到这种目的,通常采用的设计模式是策略模式(Strategy)和观察者模式(Observer);
    • 黑盒所预留的是一个接口,在框架中只调用接口中的方法,而接口中方法的实现就依据派生出的子类型的不同而不同,它的客户端启动的就是框架本身。
  • 白盒框架
    • 通过继承和重写实现功能的扩展,通常的设计模式是模板模式(Template Method);
    • 白盒框架所执行的是框架所写好的代码,只有通过override其方法来实现新的功能,客户端启动的的是第三方开发者派生的子类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值