如何减少代码的量

简介:

我始终认为,代码应作为架构的一部分,不如此,不足以表达代码质量的重要性。我知道,这与传统学院派对架构的定义是相悖的。一般认为,架构是描述设计蓝图的宏观过程,然而,敏捷方法的逐步普遍,却慢慢开始颠覆这种事前设计的论调,代码不仅要体现架构的原则与思想,还要通过代码对架构施加影响,甚至利用代码来补充与完善架构。

Yourdon与Constantine认为软件系统的整体成本等于开发成本加维护成本,而后者成本远远大于开发成本。维护成本包括理解、变更、测试与部署的成本。其中,所谓“理解”主要还在于维护人员如何理解代码,尤其是当变更发生时。只有清晰的代码结构,才有助于我们理解系统;也只有清晰的代码结构,才能提高代码质量。所以,我认为代码是纳米架构(Nano Architecture)的一部分。

在将代码提升到一定高度之后,再让我们来看看如何改善代码质量。除了需保持代码的清晰与可读性之外,代码的数量也开始获得了人们的关注。InfoQ最近发表了新闻《代码是债务,越少越好》,根据精益方法中的库存得到减少代码数量的结论。《修改代码的艺术》(英文书名Working Effectively with Legacy Code)的作者Michael Feathers最善于处理遗留代码,他认为“代码也是我们持有的库存,并且需要最小化。”这篇新闻中摘录的观点都是警示之语,唤起了我们对代码数量的关注。

就本人而言,我认为减少代码量的最佳做法莫过于提高代码的重用性。《程序员修炼之道》中认为,重复的类型包括: 
1、强加的重复 
2、无意的重复 
3、无耐性的重复 
4、开发者之间的重复

综合而论,我认为导致代码重复的原因有三个: 
1、懒惰,所以能够容忍不好的代码; 
2、技能不足,常常会出现不必要的重复代码; 
3、缺乏沟通,团队之间协作不够,因而重复制造轮子。

重用的关键是保持合适的粒度,以及对关系的解耦。粒度表现在方法级,就是需要编写许多小的方法,找到类中可以重复调用的职责,抽取为单独的方法。类级的粒度可以采用辅助类,也可以通过寻找共性,以泛化的方式提取共性特征。对于模块级,则主要需考虑模块的复用原则,合理解除模块之间的依赖关系。

之所以出现很多糟糕混乱的遗留代码,主要原因还是在于职责的分配与分离做得不够好。职责的分配不准确,就可能导致代码结构不清晰,而职责的分离做得不好,就可能导致代码的重复。在经历了太多维护遗留代码的工作后,我往往发现这些遗留代码都没有做好模块的划分,而是率意为之,有时候甚至会出现一个庞大的项目,包含了数据访问、业务逻辑与界面表现等所有对象,这意味着它没有合理的分层架构。我现在在设计和开发时,非常注意对模块的划分,尽量避免模块之间的双向依赖与循环依赖。同时,还要站着发布的角度来思考模块的划分与定义。在编码时,我会思考类的归属,要让其放到合适的位置,既表达出它的职责,又不会产生纠缠不清的依赖。

我们还可以通过用例识别重用。在用例图中,存在包含、扩展与泛化关系的用例,都可能是潜在的重用点。







本文转自wayfarer51CTO博客,原文链接:http://blog.51cto.com/wayfarer/590002,如需转载请自行联系原作者

相关文章
|
数据采集 存储 监控
大数据的数据来源 - 数据采集的方式(数据接入的方式)
大数据处理关键技术一般包括:大数据采集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据展现和应用(大数据检索、大数据可视化、大数据应用、大数据安全等)。下面主要介绍下大数据采集
6903 0
|
机器学习/深度学习 人工智能 PyTorch
|
6月前
|
安全 应用服务中间件 网络安全
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
468 0
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
573 13
|
安全 网络协议 网络安全
端口转发:解锁网络访问的新维度
端口转发技术,简化网络数据流,用于家庭至企业服务器场景。它隐藏内部网络服务,提供远程访问、个人网站公开、NAT穿透及安全的VPN连接。设置涉及路由器管理界面,添加转发规则,但需注意安全风险,仅开放必要端口并加强内部安全措施。了解和善用端口转发,提升网络服务可达性与安全性。
969 5
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
568 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
存储 Cloud Native NoSQL
etcd 的简介以及发展历史
## 一、简介 etcd 是一个开源、分布式、一致性的键值存储系统。它是由 CoreOS(后来被 Red Hat 收购)开发的,旨在提供一个可靠的分布式协调服务。etcd 通常用于在分布式系统中进行配置管理、服务发现、分布式锁、选举等任务。 etcd 的特点包括: - **分布式一致性**:基于 Raft 共识算法,etcd 确保数据在分布式环境中的一致性和可靠性。 - **键值存储**:提供类似于 NoSQL 数据库的键值对存储功能。 - **高可用性**:通过多节点部署、自动故障转移等方式提高服务的可用性。 - **易于使用**:提供简单的 HTTP 和 gRPC API 进行数据操
360 1
|
存储 缓存 安全
应用层代理和传输层代理
应用层代理和传输层代理
410 1
|
算法 测试技术 数据处理
【C++ 设计思路】优化C++项目:高效解耦库接口的实战指南
【C++ 设计思路】优化C++项目:高效解耦库接口的实战指南
398 5
|
算法 调度 数据库
【C++20 新特性 Calendar (C++20) − Time zone (C++20)】时间的艺术与科学: C++中的现代日期和时区处理
【C++20 新特性 Calendar (C++20) − Time zone (C++20)】时间的艺术与科学: C++中的现代日期和时区处理
703 3