高内聚是有极限的. 当代码在一个维度上高度内聚的时候, 在其它维度上是发散的. -- 代码内聚设计的不确定性原理
大家都知道量子力学的不确定性原理: 在微观世界里, 有几对物理量不能同时精确的测定, 包括速度与位置, 以及能量与时间. 比如当我们精确的测定一个粒子的速度使其误差很小的时候, 我们对其位置的测量误差从0到正无穷都有可能, 换句话说, 此时粒子可能位于宇宙的任何地方, 这里的极限就是二者误差的乘积总是大于一个被称为普朗克常数的数.
代码的设计有时会感到同样的张力: 无法做到完全的内聚. 当代码在一个维度上高度内聚的时候, 在其它维度上是发散的或耦合的. 无论是逻辑设计还是物理设计.
看一个代码逻辑设计的例子, 就是结构和行为.
当代码在结构上内聚的时候, 在行为上是发散的. 主流的面向对象编程范式是按照结构优化的, 看一下你的代码中的class的名字, 大都是名词, 是一个事物, 表达了What the system is. 但这个系统具有什么样的行为, 能做什么事, What the system does, 却被切片, 分散到系统的各个角落. 我们或许能说出系统的静态结构是什么样子, 却要花费更多的精力才能搞清楚系统做了什么, 能做什么, 结构间的交互是什么样子.
面向过程的编程范式是按照行为优化的. 过程的名字通常是动词, 表达了 What the system does. 系统的静态结构则被掩藏在了行为之后
DCI有助于解决代码逻辑设计的内聚问题.
一个代码物理设计的例子, 就是按照业务还是技术架构层次来划分模块和目录结构
当我们按照feature来划分目录结构的时候, 相同的技术架构层次的代码会被分到不同的目录中. 比如数据访问层的代码会分散到各个feature的目录中.
当我们按照技术层次架构来划分目录的时候, 同一个feature的代码会被分到不同目录中, 而同一个目录中会包含多个feature的代码. 比如流行的MVC框架的缺省目录结构都是所有的controller放在一起, 所有的model放在一起等等. 当我需要看一个feature的完整实现时, 需要从不同目录中挑出不同文件来查看.
现在的编程语言是基于文本的, 或者其实也是基于文件系统的. 文件系统是一棵树, 每个叶子节点只能隶属于一个父节点, 树的结构只能按照一个维度优化. 语言本身的元数据也不够丰富. 这些都限制了能够生成各种视图的IDE的出现
这应该只是约束理论的一个实例.
分享到:
相关推荐
- 从低到高:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚。 - 功能内聚表示模块完成单一明确的任务。 7. **软件测试技术分类** - 软件测试是发现软件错误的过程,常见的测试类型包括...
《敏捷软件开发原则、模式与实践》是一本深入探讨敏捷开发方法论的著作,它强调在快速变化的需求和不确定性中,如何高效地进行软件开发。C#源码的提供为读者提供了实际操作的可能,帮助理解理论在实际项目中的应用。...
- **知识点**: 模块化设计原则包括高内聚(即模块内部紧密相关)、低耦合(即模块间松散连接)。这些原则有助于提高软件的可维护性和可扩展性。 35. **可维护性评估** - **知识点**: 在系统设计阶段,评估软件的...
模块的内聚性类型包括偶然内聚、逻辑内聚、过程内聚、通信内聚、顺序内聚、功能内聚,功能内聚是最理想的。 可行性研究报告涉及技术、经济、法律、市场和操作等方面的分析。 系统设计内容涵盖硬件、软件、网络和...
6. **软件开发过程的独特性**:软件开发过程不同于传统工业产品的制造,具有迭代性、复杂性、不确定性等特点。这要求我们采用专门的质量保证方法和工具,例如软件质量管理、测试策略等。 7. **测试设计员的职责**:...
- 自动验证:测试用例作为代码的文档,帮助理解代码功能,减少错误和不确定性。 **3. 黑盒测试与白盒测试** 黑盒测试关注的是软件功能的表现,不涉及内部结构。白盒测试,又称结构测试,侧重于代码的执行路径和...
模块是软件的基本组成单位,模块化是将软件划分为独立的、可复用的模块,模块独立性强调模块间的低耦合和高内聚;逆向工程是分析现有软件以获取其设计信息的过程;黑盒测试法关注软件的功能,不考虑内部结构。 分析...
模块独立性是衡量设计质量的重要指标,内聚和耦合是评估模块独立性的两个关键准则。模块的控制范围包括自身及其所有从属模块,确保模块间的关系清晰,有助于降低复杂性。 软件测试是确保软件质量的关键环节。测试...
综上所述,敏捷思维和XP方法学在架构设计中提供了一种灵活且高效的方式,以适应现代软件开发的快节奏和不确定性。通过这些实践,团队能够更好地管理复杂性,提高生产力,同时保持高质量的软件输出。
螺旋模型不适于大型软件开发,因为它强调风险分析,对于小型或中型项目更为合适。 36. **喷泉模型**: 喷泉模型适合面向对象的开发,强调迭代和灵活应对需求变化。 37. **模块设计**: 完善模块的功能不能改进...
选项B“与其它系统有接口”虽然确实存在,但并不是软件开发的独特特性,很多物理产品也有类似的需求。选项C“软件产品的不可见性”正确,软件通常是无形的,其内部结构和运作机制对于终端用户来说是不可见的。选项D...
信息是消除不确定性的东西,是经济和社会活动的重要组成部分,是生产要素之一。 5. **TCP与UDP**:TCP(传输控制协议)和UDP(用户数据报协议)都是传输层的协议,但TCP是面向连接的,提供可靠的数据传输服务,而...
当黏聚性及保水性最佳且混凝土坍落度最大的时候,对应的砂率是合理的。 3. 大体积混凝土浇筑方法:大体积混凝土浇筑通常采用全面分层法、分段分层法或斜面分层法,以确保混凝土内部和表面的温度控制。 4. 预应力混...
这一研究旨在提供一种简便、省时且易于操作的方法,对岩石抗剪强度参数——粘聚力(C)和内摩擦角(φ)进行计算,并绘制相关的莫尔应力圆图。 知识点一:岩石三轴试验原理 三轴试验是在控制围压(σ3)和轴压(σ1...