思想是解決問題的根本
思想必須轉換成習慣
構建一套完整的思想體系是開發能力成熟的標誌
——《簡單之美》(前言)php
.html
「成功的軟件項目就是那些提交產物達到或超出客戶的預期的項目,並且開發過程符合時間和費用上的要求,結果在面對變化和調整時有彈性。」
——《面向對象分析與設計》(第3版)P.236程序員
——引用《Spring 2.0 技術手冊》林信良算法
框架的目標之一是非侵入性(No intrusive)數據庫
組件能夠直接拿到另外一個應用或框架之中使用編程
增長組件的可重用性(Reusability)segmentfault
管理對象的生成、資源取得、銷燬等生命週期服務器
創建對象與對象之間的依賴關係session
啓動容器後,全部對象直接取用,不用編寫任何一行代碼來產生對象,或是創建對象之間的依賴關係。數據結構
控制反轉 Inversion of Control
依賴關係的轉移
依賴抽象而非實踐
依賴注入 Dependency Injection
沒必要本身在代碼中維護對象的依賴
容器自動根據配置,將依賴注入指定對象
Aspect-oriented programming
面向方面編程
無需修改任何一行程序代碼,將功能加入至原先的應用程序中,也能夠在不修改任何程序的狀況下移除。
表現層:提供服務,顯示信息。
領域層:邏輯,系統中真正的核心。
數據源層:與數據庫、消息系統、事務管理器及其它軟件包通訊。
——《企業應用架構模式》P.14
假設應用程序有儲存需求,若直接在高層的應用程序中調用低層模塊API,致使應用程序對低層模塊產生依賴。
/** * 高層 */ class Business { private $writer; public function __construct() { $this->writer = new FloppyWriter(); } public function save() { $this->writer->saveToFloppy(); } } /** * 低層,軟盤存儲 */ class FloppyWriter { public function saveToFloppy() { echo __METHOD__; } } $biz = new Business(); $biz->save(); // FloppyWriter::saveToFloppy
假設程序要移植到另外一個平臺,而該平臺使用USB磁盤做爲存儲介質,則這個程序沒法直接重用,必須加以修改才行。本例因爲低層變化致使高層也跟着變化,很差的設計。
正如前方提到的
控制反轉 Inversion of Control
依賴關係的轉移
依賴抽象而非實踐
程序不該該依賴於具體的實現,而是要依賴抽像的接口。請看代碼演示
/** * 接口 */ interface IDeviceWriter { public function saveToDevice(); } /** * 高層 */ class Business { /** * @var IDeviceWriter */ private $writer; /** * @param IDeviceWriter $writer */ public function setWriter($writer) { $this->writer = $writer; } public function save() { $this->writer->saveToDevice(); } } /** * 低層,軟盤存儲 */ class