写可维护的代码

要有代码

有人也许为认为,代码不再是问题,我们正在临近代码的终结点,代码就会自动产生出来,不需要人工编写? 但事实是我们可以创造各种与需求接近的语言,可以创造帮助把需求解析和汇整为正式结构的各种工具,但是这些工具也需要代码的,语言也是需要翻译的,类似于java与javac(c++编写)的关系,所以代码永存。

要有可维护的代码

三个月编写,三年维护。 更多的时候程序是在被阅读,而不是在被编写 没有完工一说,修改程序的投入会远大于最初编写程序的投入 程序的阅读者需要理解程序-既从细节上,也从概念上。有时他们从细节开始,逐渐理解概念;有时他们从概念开始逐渐理解细节。

什么是可维护性高的代码

软件质量

ISO/IEC 25010

ISO/IEC 25010.pdf

软件质量模型

可维护性

  子特性 定义 英文原版定义
可维护性 模块化 模块化的程度,模块间松耦合程度,改动一个模块对其他模块影响的程度。 degree to which a system or computer program is composed of discrete components such that a change to one component has minimal impact on other components.
  可重用性 方法、类、模块等代码可以被复用的程度 degree to which an asset can be used in more than one system, or in building other assets.
  易分析性 评估系统打算改变其各个部分中的一个或多个的影响的成本和效率;诊断软件中的缺陷或失效原因的成本和效率;识别待修改部分成本和效率 degree of effectiveness and efficiency with which it is possible to assess the impact on a product or system of an intended change to one or more of its parts, or to diagnose a product for deficiencies or causes of failures, or to identify parts to be modified.
  可变性 系统可以被低成本高效率的修改,而不会引入缺陷和降低现有系统产品质量的程度 degree to which a product or system can be effectively and efficiently modified without introducing defects or degrading existing product quality.
  易测性 建立系统测试标准的成本和效率;测试可以运行来反映这些测试标准的程度 degree of effectiveness and efficiency with which test criteria can be established for a system, product or component and tests can be performed to determine whether those criteria have been met.

如何写可维护性高的代码

命名 提供不多不少、正确的信息

注释

方法

用消息作为基本的控制流机制等于承认了变化是程序的基本状态(概念与细节)

原则
模式

原则

类间

原则
设计模式

public class MtpCompositeLogic extends CompositeLogic {

@Override
protected void registerAllLogic() {
    registerLogic(InsuranceLogicUnit.class);
    registerLogic(PersistenceCompositeLogic.class);
    registerLogic(ACKSuccessLogicUnit.class);
    registerLogic(CloseOrderLogicUnit.class);
    registerLogic(OperationLogLogicUnit.class);
    registerLogic(CreatedEventLogicUnit.class);
    registerLogic(HiveLogLogic.class);
} }

public class PersistenceCompositeLogic extends CompositeLogic {

@Override
protected void registerAllLogic() {
    registerLogic(UserIdMapPersistenceLogicUnit.class);
    registerLogic(OrderExtendsPersistenceLogicUnit.class);
    registerLogic(OrderMultiLevelPersistenceLogicUnit.class);
    registerLogic(ContactPersistenceLogicUnit.class);
    registerLogic(VisitorsPersistenceLogicUnit.class);
    registerLogic(BookInfoPersistenceLogicUnit.class);
    registerLogic(OrderUserRelationPersistenceLogicUnit.class);
    registerLogic(BookGoodInfoPersistenceLogicUnit.class);
    registerLogic(InsurancePersistenceLogicUnit.class);
    registerLogic(MtpNotifyStatusManagePersistenceLogicUnit.class);
}

@Override
@Transactional
public void doLogic(DataPushContext context) {
    super.doLogic(context);
} } ``` * 门面 用户界面层和应用层的解耦 (门票的徒有其表)

IDEA重构快捷键

快捷键 作用
OPT + ENTER 显示意图动作和快速修复
CTRL + OPT + H 查找方法调用mark
SHIFT + F6 重命名
CMD + OPT + M 修改方法签名
CMD + OPT + V 提取方法
CMD + OPT + C 提取常量

消除一切可消除的黄色!!!

模块/系统

原则

建模
  1. 共享模型
  2. 模型存在内部和外部两种表示形式
  3. 同一个名字在不同的限界上下文有着完全不同的含义,术语只有在限界上下文内才有意义
  4. 微服务应该清晰的和限界上下文保持一致,服务边界应和领域的限界上下文保持一致
集成
  1. 客户端库
  2. 禁止数据库集成
  3. 版本管理(http、rpc)
    • 尽可能延迟
    • 语义化的版本管理
  4. 用户界面
分层
现有order分层
* api层
* biz层
* service层
* dao层
阿里巴巴开发手册分层
领域驱动设计分层
模型穿透问题

领域驱动的分层

参考

ISO/IEC 25010:2011

完整诠释软件质量

聊聊clean code

一些软件设计的原则

优质代码十诫

IOC 与 好莱坞原则

编程中的命名设计那点事

实现模式

重构

代码整洁之道