內聚的極限: 軟件開發的不確定性原理

高內聚是有極限的. 當代碼在一個維度上高度內聚的時候, 在其它維度上是發散的. -- 代碼內聚設計的不確定性原理

?

大家都知道量子力學的不確定性原理: 在微觀世界里, 有幾對物理量不能同時精確的測定, 包括速度與位置, 以及能量與時間. 比如當我們精確的測定一個粒子的速度使其誤差很小的時候, 我們對其位置的測量誤差從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.pswp.cn/news/453011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453011.shtml
英文地址,請注明出處:http://en.pswp.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…