架構師訓練營第 1 期 - 第 02 周總結
編程的歷史
萊布尼茲 (1700年代)
各種事物透過一種邏輯語言進行描述
用一種可執行演算規則的機器進行計算
通用計算機
讀取數據進行計算
數據包含計算的邏輯及數值
計算邏輯 --> 程序
馮諾伊曼 ENIAC
編程 ->將電線編來編去
打孔紙帶引入,提升編程效率
匯編語言 (Assembly)
與機器指令一對一對應
面向機器編程
由程式員自己控制硬件
高級編程語言 (60年代)
使用人類的邏輯思維方式
basic, pascal, fortran, c
面向程序員自己的思維判斷
面向過程編程
耦合度隨系統增大而增大
面向編程語言
依對象之間的交互映射到計算機軟件中
將對象設計出來,將對象間的交互設計出來
編程語言的實質
目的: 用計算機來解決現實問題
過程: 在計算機能理解的 "模型" (解空間)和現實世界(問題空間)之間,建立一種關聯
各類語言的抽象
問題領域
包含宇系統所要解決的問題相關的實物和概念的空間
機器代碼與匯編語言
對基礎機器進行抽象
非結構化高級語言
對計算處理邏輯抽象
結構化高級語言
對問題領域進行一定程度的抽象
面相對象的程序設計
直接表達問題空間內的元素
面向對象編程
面向對象
萬物皆對象
關心的是所要解決問題本身就是對象
程序是對象的集合,他們通過發送消息(程序調用)來告知彼此所要做的事
每個對象都又自己的由其他對象所構成的存儲
每個對象都擁有其類型
某一特定類型的所有對象都可以接收同樣的消息
面向對象編程的三要素
封裝性 (Encapsulation)
隱藏實現細節 (訪問控制)
定義接口
構建對象邊界
繼承性 (Inheritance)
is - a 關係
has -a 關係
實現重用
多態性 (Polyorphism)
後期綁定 (虛函數)
向上轉型 (Up casting)
面向對象編程利用多態特性進行編程
作法
子類實現父類或者接口的抽象方法
程序使用抽象父類或者接口編程
運行時注入不同子類,程序就表現出不同的型態
糟糕的代碼
僵化性 (Rigidity)
每個改動都會迫使對系統其他部分的改動
脆弱性 (Fragility)
每個改動會使系統其他無關的地方出現問題
牢固性 (Immobility)
很難解開系統的糾結,使之成為一些可在其他系統中重用的組件
黏滯性 (Viscosity)
那些可以保持系统設計的方法比那些破壞設計的方法更難應用,就表明設計具有高的黏滯性,作錯誤的事情就很容易
不必要的複雜性 (Needless Complexity)
設計中包含當前沒有用的組成部分
常出現於預測需求變化,並在系統中處理那些潛在變化的代碼時
不必要的重複性 (Needless Repetition)
設計中包含重複的結構
常於 copy, cut, paste 編程時出現
晦澀性 (Opacity)
使用晦澀、費解的方式編寫
面向對象編程原則 (SOLID)
SRP (Single Responsibility Principle)
內聚性原則
一個模塊的組成元素之間的功能相關性
將它與引起一個模塊改變的作用力相聯
一個類,只能有一個引起它變化的原因
一個職責
一個變化的原因
OCP (Open Close Principle)
Open for extension
Close for modification
不需要修改軟件實體(類、模塊、函式等),就能實現功能的擴展
關鍵是抽象,針對抽象接口進行編程
LSP ( Liskov Substitute Principle)
正確繼承的原則
衡量繼承是否合理的原則
在應用場景下,子類必須能夠替換掉它們的基類別,而不會影響程序的運行
ISP (Interface Segregation Principle
不應該強派客戶程序依賴它們不需要的方法
ISP 與 SRP 的關係
ISP 與 SRP 都和 "內聚性" 有關
SRP 指出應該如何設計一個類
只能有一種原因才能促使類發生改變
ISP 指出該如何設計一個接口
從客戶需要出發,強調不要讓客戶看到他們不需要的方法
DIP (Dependency Inversion Principle)
高層模塊不能依賴低層模塊,而是都依賴於抽象接口
抽象不能依賴實現,而是實現依賴抽象
框架設計的基本原則
框架定義一些抽象接口
由我們去實現這些接口
框架只依賴這些接口,不依賴我們的實現
好萊塢原則
Don't call me, I'll call you
Don't call 框架, 框架 will call you
倒轉層次依賴關係
版权声明: 本文为 InfoQ 作者【Panda】的原创文章。
原文链接:【http://xie.infoq.cn/article/10793786192c1879c06bf455d】。未经作者许可,禁止转载。
评论