zoukankan      html  css  js  c++  java
  • 5.2 Construction for Reuse

    一.设计可复用的类

     

    需要的知识:

    代码的封闭性与信息隐藏

    继承与重写

    参数多态与重载

    泛型编程

     

    上面的第三章已经介绍过了,这一节介绍如下内容:

     

    行为子类型与Liskov替换原则(LSP)

    组合与委托

     

    (1)行为子类型与Liskov替换原则(LSP)

    子类型多态:客户端可用统一的方式处理不同类型的对象

     

    LSP:静态检查的标准:

    子类型可以增加方法,但不可删

    子类型需要实现抽象类型中的所有未实现方法

    子类型中重写的方法必须有相同或子类型的返回值

    子类型中重写的方法必须使用同样类型的参数

    子类型中重写的方法不能抛出额外的异常

     

    LSP:子类型方法有更具体的行为:

    更强的不变量

    更弱的前置条件

    更强的后置条件

     

    Example 1:

    子类满足相同的不变量(自身随意增加不变量)

    重写的方法满足相同的前置条件和后置条件

    故满足LSP

     

    总结LSP(强行自类型化)需要满足的限制条件为:

    1. 前置条件不能强化

    2. 后置条件不能弱化

    3. 不变量要保持(或增强)

    4. 子类型方法参数:逆变

    5. 子类型方法的返回值:协变

    6. 子类型不能抛出新的异常,除了异常类型:协变

     

    介绍协变:

    父类型——子类型:越来越具体specific返回值类型:不变或变得更具体(即后置条件变强)

    异常的类型:也是如此。

     

    介绍反协变、逆变:

    父类型——子类型:越来越具体specific

    参数类型:要相反的变化,要不变或越来越抽象(即前置条件变弱)

    但是反协变、逆变在java中的重写静态类型检查中是被不被允许的,除非它是重载

     

    介绍数组的协变:

    基于Java的自类型化规则,父类数组 T[] 可以包含T 或T的子类

    下面报错的原因是myNumber指向的还是一个Integer[] 而不是Number[]

     

    二.设计系统级复用的 libraries 与frameworks

     

    libraries 与frameworks的不同之处:

    Library: 一组类和方法提供可复用的功能。

    Frameworks:可复用的类似骨架的代码,能够别定制以适应不同的应用,并且它回调客户端的代码。

    之所以library 和framework 被称为系统层面的复用,是因为它们不仅定义了1 个可复用的接口/ 类,而是将某个完整系统中的所有可复用的接口/ 类都实现出来,并且定义了这些类之间的交互关系、调用关系,从而形成了系统整体的“架构”

     

    术语介绍:

    API: Application Programming Interface, 一个library或 framework的接口

    Client: 客户端:使用API的代码

    Plugin: 插件:定制框架方法功能的客户端代码

    Extension point:框架内预留的“空白”,开发者开发出符合接口要求的代码( 即plugin) , 框架可调用,从而相当于开发者扩展了框架的功能

    Protocol:协议:API与客户端之间的相互作用

    Callback: 回调:框架将要调用适应客户端需求的插件

    Lifecycle method: 依据协议与插件的状态,回调的方法会按照一定的顺序

     

    (1) API 的设计

    为什么说API的设计很重要?

    API 是程序员最重要的资产和“荣耀”,吸引外部用户,提高声誉。

     

    一个好的应用编程接口(API)应该具备的特点:

    1. 容易学

    2. 容易使用,甚至不需要文档

    3. 难以误用

    4. 容易读,原来的代码不需要改变

    5. 完全能够满足要求

    6. 易于应对新的变化

    7. 对使用者合适

     

    ①API 应该集中将一件事情完成好

    功能需要向客户解释清楚

     

    ②API 应该尽可能的小规模

    1. 要满足客户的所有需求

    2. 可以添加功能,但不要修改原来的代码

    3. 概念的说明会占大部分

     

    ③实现过于细节影响 API的功能

    1. 实现过于细节对API有害

    2. 可能会造成信息泄露

    3. 尽可能的实现信息隐藏

     

    ④文档说明很重要

    1. 每个类,方法,接口,构造器,参数,异常都要有注释说明

    2. 方法的前置条件,后置条件,与其他的效果

    3. 标注线程的安全性

     

    ⑤考虑执行的结果

    1. 不好的决策会限制执行

    2. 不要忽略API而选择直接执行

    3. 好的设计有好的执行效果

    4. 坏的API决策对执行效果影响很真实而且一直很真实

     

    ⑥API要与运行平台很好的匹配

    1. 使API常规化

    2. 利用对API有利的特性

    3. 了解避免API的陷阱错误

    4. 不要直译API

     

    ⑦类的设计

    1. 变量尽可能的做到不变

    2. 子类要满足LSP原则

  • 相关阅读:
    App界面设计利器Sketch 精选案例合集
    破解有道词典在线翻译接口--python
    欧几里得算法/欧几里得扩展算法-python
    深浅拷贝--python(预习中随手写的。因为当时很无聊。。。)
    为tomcat动态添加jndi数据源信息
    四个年头
    使用Node.JS访问Hyperledger Fabric的gRPC服务
    Hyperledger fabric Client Node.js Hello World示例程序
    在IBM Bluemix上部署Hyperledger应用
    Hyperledger区块数据的访问
  • 原文地址:https://www.cnblogs.com/hitszr/p/9173474.html
Copyright © 2011-2022 走看看