freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

軟件設計的五大原則(更新版)

2025-09-23 23:47上一頁面

下一頁面
  

【正文】 const Shapeamp。 Point itsCenter。d) 會導致錯誤 顯然 D對于 f是脆弱的。 } return thisOrd argOrd。 !done。 char* Shape::typeOrderTable[] = { typeid(Circle).name(), typeid(Square).name(), 0 }。 } 這個程序符合 OCP嗎?? 利用 “ 數據驅動 ” 的方法獲得封閉性 include typeinfo include string include iostream using namespace std。 sort((), (), LesspShape*())。 virtual bool Precedes(const Shapeamp。 }。 break。 CPoint itsTopLeft。 struct Shape{ ShapeType itsType。 class server:public ClientInterface{ int serverData。 } }。 }。如果我們想要讓 client調用一個新的 server類,那么我們不得不修改 client的源代碼 ?從而帶來編譯、鏈接、部署等一系列的問題。 s。這是我們不希望的,但是有時候卻是必須的。 virtual void recv( ) =0。一個職責的變化可能會虛弱或者抑止這個類完成其它職責的能力 – 多職責將導致 脆弱 性的臭味 Rectangle + draw( ) +area( ):double Computational Geometry Application Graphical Application GUI Rectangle類具有兩個職責: 1. 計算矩形面積的數學模型 2. 將矩形在一個圖形設備上描述出來 ? 示例 1: – Rectangle類違反了 SRP,具有兩個職能 ——計算面積和繪制矩形 – 這種對 SRP的違反將導致兩個方面的問題: ? 包含不必要的代碼 – 一個應用可能希望使用 Retangle類計算矩形的面積,但是卻被迫將繪制矩形相關的代碼也包含進來 ? 一些邏輯上毫無關聯的原因可能導致應用失敗 – 如果 GraphicalApplication的需求發(fā)生了變化,從而對 Rectangle類進行了修改。 – 上面的例子可能存在兩種變化的方式: ? 連接和通信可能獨立變化 在這種情況下,應該將職責分開。除了 main以外,其他所有程序都不需要知道這個函數的存在。 } }。 public: client(serveramp。 }。 public: client(ClientInterface amp。 c l i e n t i n t e r f a c e C l i e n t I n t e r f a c es e r v e r– 例子 1(續(xù)) ? 一個問題: 為什么上述的 ClientInterface這個類要取這么個名字,叫做 AbastractServer豈不更好?? 其實這里面蘊含了一個思想: ——client類中更多的描述了高層的策略,而 Server類中是對這些策略的一種具體實現。 double itsRadius。 void DrawAllShapes(ShapePointer list[], int n){ int i。 } }} – 例子 2(續(xù)) ? 批判 這個程序不符合 OCP,如果需要處理的幾何圖形中再加入 “ 三角形 ”將引發(fā)大量的修改 – 僵化的 增加 Triangle會導致 Shape、 Square、 Circle以及 DrawAllShapes的重新編譯和部署 – 脆弱的 因為存在大量的既難以查找又難以理解的 Switch和 If語句,修改稍有不慎,程序就會莫明其妙的出錯 – 牢固的 想在一個程序中復用 DrawAllShapes,都必須帶上 Circle、 Square,即使那個程序不需要他們 – 例子 2(續(xù)) ? 修改后的設計 class Shape{ public: virtual void Draw() const=0。 for(i=()。 s) {return Precedes(s)。 i!=()。) const。 const char* argType = typeid(s).name()。 if (strcmp(tableEntry, argType) == 0) argOrd = i??梢园驯矸胖迷谝粋€單獨的模塊中,和所有其他模塊隔離,因此對于表的改動不會影響其他任何模塊。}。 struct Square:public Shape{ Square():Shape(square){ }。 else if (==Shape::circle) static_castconst Circleamp。} double getHeight() const{return height。 void Square::setHeight(double h){ Rectangle::setWidth(h)。 public: virtual void setWidth(double w){width=w。 void Square::setWidth(double w){ Rectangle::setWidth(w)。 (4)??蛻舸a的編寫者可以通過契約獲悉行為的依賴方式。 – 在一些語言中明確的支持契約,例如 Eiffel,你申明它們,運行時系統(tǒng)會自動的檢查。高層依賴低層將導致: ? 難以復用。 } ? 層次化 (續(xù)): – 更好的理解 P o l i c yP o l i c y L a y e r i n t e r f a c e P o l i c y S e r v i c e I n t e r f a c eM e c h a n i s mP o l i c y L a y e r i n t e r f a c e P o l i c y S e r v i c e I n t e r f a c eU t i l i t yU t i l i t y L a y e r– 依賴關系倒置 下層的實現,依賴于上層的接口 – 接口所有權倒置 客戶擁有接口,而服務者則從這些接口派生 – 依賴不倒置的開發(fā) ? 自頂向下首先設計整個軟件的分解結構 ? 然后首先實現下層的功能 ? 再實現上層的功能,并使上層調用下層函數 – 依賴倒置的開發(fā) ? 首先設計上層需要調用的接口,并實現上層 ? 然后低層類從上層接口派生,實現低層 ?接口屬于上層 L e v e l 1L e v e l 2L e v e l 3? 示例 1( Button與 Lamp): – Button(開關)感知外界的變化。 public: void poll( )。 void turnOff()。 virtual void Unlock( )=0。 ?如果一個對象希望得到超時通知,它可以調用 Timer的 Register函數。 }
點擊復制文檔內容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1