内聚的极限: 软件开发的不确定性原理

高内聚是有极限的. 当代码在一个维度上高度内聚的时候, 在其它维度上是发散的. -- 代码内聚设计的不确定性原理

 

大家都知道量子力学的不确定性原理: 在微观世界里, 有几对物理量不能同时精确的测定, 包括速度与位置, 以及能量与时间. 比如当我们精确的测定一个粒子的速度使其误差很小的时候, 我们对其位置的测量误差从0到正无穷都有可能, 换句话说, 此时粒子可能位于宇宙的任何地方, 这里的极限就是二者误差的乘积总是大于一个被称为普朗克常数的数. 

代码的设计有时会感到同样的张力: 无法做到完全的内聚. 当代码在一个维度上高度内聚的时候, 在其它维度上是发散的或耦合的. 无论是逻辑设计还是物理设计.

 

看一个代码逻辑设计的例子, 就是结构和行为.

当代码在结构上内聚的时候, 在行为上是发散的. 主流的面向对象编程范式是按照结构优化的, 看一下你的代码中的class的名字, 大都是名词, 是一个事物, 表达了What the system is. 但这个系统具有什么样的行为, 能做什么事, What the system does, 却被切片, 分散到系统的各个角落. 我们或许能说出系统的静态结构是什么样子, 却要花费更多的精力才能搞清楚系统做了什么, 能做什么, 结构间的交互是什么样子.

面向过程的编程范式是按照行为优化的. 过程的名字通常是动词, 表达了 What the system does. 系统的静态结构则被掩藏在了行为之后

DCI有助于解决代码逻辑设计的内聚问题.

 

一个代码物理设计的例子, 就是按照业务还是技术架构层次来划分模块和目录结构

当我们按照feature来划分目录结构的时候, 相同的技术架构层次的代码会被分到不同的目录中. 比如数据访问层的代码会分散到各个feature的目录中.

当我们按照技术层次架构来划分目录的时候, 同一个feature的代码会被分到不同目录中, 而同一个目录中会包含多个feature的代码. 比如流行的MVC框架的缺省目录结构都是所有的controller放在一起, 所有的model放在一起等等. 当我需要看一个feature的完整实现时, 需要从不同目录中挑出不同文件来查看.

现在的编程语言是基于文本的, 或者其实也是基于文件系统的. 文件系统是一棵树, 每个叶子节点只能隶属于一个父节点, 树的结构只能按照一个维度优化. 语言本身的元数据也不够丰富. 这些都限制了能够生成各种视图的IDE的出现

 

这应该只是约束理论的一个实例.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python获取window共享目录列表_利用Python获取DICOM RTstructure勾画列表

在《利用Python打开DICOM CT文件》一文中,我们利用pydicom.dcmread()读取了CT图像。本文中我们将修改load_scan()函数来读取RTstructure文件并获取勾画列表1. 打开Jupyter notebook,导入需要的科学包import numpy as npimport mathimport pydicomimport …

sublime 自定义快捷键

[{ "keys": ["altspace"], "command": "auto_complete" }, // 自动提示、补全{ "keys": ["ctrlalti"], "command": "reindent" }, //整理代码快捷键{ "keys": ["f12"…

Ubuntu中安装、生成、导入、导出、Python3虚拟环境

1.安装Ubuntu虚拟环境、以及可以支持虚拟环境的模块 sudo apt install virtualenv sudo apt install virtualenvwrapper 安装完成之后,进入home目录,输入命令ls -al查看是否出现.virtualenvs目录,如果没有则手动创建.virtualenvs目录 重要…

Coursera课程 Programming Languages, Part C 总结

碎言碎语 和前面的 ML 和 Racket 感觉明显不一样了,一边学着一边觉得这真是一门奇怪的语言,有着各种奇怪的语法,不过真的算是一个奇妙的体验(相比前面的两门语言,Ruby 的学习资源多了不少)。week 1 的作业直…

如何判断网络是否进入拥塞状态

通过观察网络的吞吐量与网络负载间的关系 如果随着网络负载的增加,网络的吞吐量明显小于正常的吞吐量,那么网络就进入例如轻度拥塞的状况。 如果网络得吞吐量随着网络负载的增大反而下降,那么网络就可能进入拥塞状态。 如果网络的负载继续…

如何拷贝工程_如何将premiere的工程及素材文件打包?

我们在剪辑视频的时候经常会遇到素材丢失的情况,或者说需要换地方或换电脑继续剪辑。特别是以前做的视频现在需要修改一些地方,然后打开工程文件会发现素材丢失,如图:这种情况要不就是素材已经删除,要不就是素材改变了…

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置&#…

使用pip安装virtualenv时出现问题

使用pip出现问题 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安装pip fxd0…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html(),如果当前元素没有兄弟元素还…

拥塞控制中的开环和闭环控制

拥塞控制是很难设计的,因为它是一个动态的问题,许多情况下,甚至正式拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。从控制理论的角度来看拥塞控制这个问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时…

c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...

这个实例是一个能提高分析能力的实例,这个实例主要用到for语句,关键是如何确定其中变量的范围。求一个正整数的所有因子先来看看编程结果演示:编程演示输出结果编程如下:#include/*引用预处理命令,预处理包含stdio.h的头文件*/mai…

【简明笔记】循环条件的优化

[javascript] view plaincopy/* * 优化循环 */ //优化前 for(var i0; i < items.length; i){ //判断条件&#xff1a;(1)i<items.length; (2)i<items.length true; process(items[i]); } //优化后 var count items.length; //把length属性放在局…

ubuntu18.04安装mysql数据库

mysql安装参考&#xff1a; https://www.cnblogs.com/opsprobe/p/9126864.html 文中写的很详细&#xff0c;但是未进行初始密码的修改&#xff0c;初始密码修改参考文章&#xff1a; https://blog.csdn.net/qq_38737992/article/details/81090373

第四次Scrum编码冲刺!!!!

第四次Scrum编码冲刺&#xff01;&#xff01;&#xff01;&#xff01; 一、总体任务&#xff1a; 本次冲刺是完成对图书馆管理系统的最后三个功能的实现------管理员对用户授权、用户注销和用户查询 二、个人任务及完成情况&#xff1a; 本人本次的任务是实现对删除用户功能以…

Spring Cloud Edgware新特性之八:Zuul回退的改进

为什么80%的码农都做不了架构师&#xff1f;>>> Spring Cloud Edgware对Hystrix回退的逻辑进行了一些改进。本文将信息探讨新旧版本的回退操作&#xff0c;并分析的原因及改进后的优势。 Dalston及更低版本 对于Dalston及更低版本&#xff0c;要想为Zuul提供回退&a…

因特网 以太网 互联网的含义及区别

互联网是Internet的意译&#xff0c;因特网是Internet的音译&#xff0c;两者是等同的&#xff0c;是一个全世界范围的广域网。目前应用最为广泛的一类局域网是总线局域网-以太网。以太网的核心技术是它的随机争用型介质访问控制方法&#xff0c;即带有冲突检测的载波侦听多路访…

idea插件导出_Intellij IDEA 中我一直在用的几个插件

提前声明一下&#xff0c;今天这篇文章是在我家的那台 Mac 机子上写的&#xff0c;但是文中使用的快捷键还是主要针对于 Windows 平台「由于我的大多数读者在使用该系统&#xff0c;我是有多么爱你们&#xff5e;&#xff5e;&#xff5e;」。接上一篇《谈谈我与 Intellij IDEA…

打开.md格式文件的方式

我们平常偶尔会收到后缀为*.md的文件&#xff0c; md是简称&#xff0c;它的全名为MARKDOWN。MARKDOWN是一种标记语言软件&#xff0c;下载安装MarkdownPad2即可打开。 具体安装参考文章&#xff1a;MarkdownPad2安装汉化与注册码 https://blog.csdn.net/weixin_40612082/art…

吃透理财三句话人人都能成百万富翁

财专家告诉我们&#xff1a;理财的最佳方式并非追求高超的金融投资技巧&#xff0c;只要你掌握正确的理财观念&#xff0c;并且持之以恒&#xff0c;若干年之后——人人都能成为百万富翁。我每月到企业举办一小时的免费“理财讲座”&#xff0c;一直都很受员工们的欢迎。讲座内…

Apache - Storm

一、Apache Storm Storm是一个分布式的&#xff0c;可靠的&#xff0c;容错的数据流处理系统。Storm集群的输入流由一个被称作spout的组件管理&#xff0c;spout把数据传递给bolt&#xff0c;bolt要么把数据保存到某种存储器&#xff0c;要么把数据传递给其它的bolt。一个Stor…