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

正文內(nèi)容

軟件設(shè)計(jì)的五大原則(專業(yè)版)

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

下一頁面
  

【正文】 }。 virtual void Unlock( )=0。 public: void poll( )。高層依賴低層將導(dǎo)致: ? 難以復(fù)用??蛻舸a的編寫者可以通過契約獲悉行為的依賴方式。 void Square::setWidth(double w){ Rectangle::setWidth(w)。 void Square::setHeight(double h){ Rectangle::setWidth(h)。 else if (==Shape::circle) static_castconst Circleamp。}。 if (strcmp(tableEntry, argType) == 0) argOrd = i。) const。 s) {return Precedes(s)。 } }} – 例子 2(續(xù)) ? 批判 這個(gè)程序不符合 OCP,如果需要處理的幾何圖形中再加入 “ 三角形 ”將引發(fā)大量的修改 – 僵化的 增加 Triangle會(huì)導(dǎo)致 Shape、 Square、 Circle以及 DrawAllShapes的重新編譯和部署 – 脆弱的 因?yàn)榇嬖诖罅康募入y以查找又難以理解的 Switch和 If語句,修改稍有不慎,程序就會(huì)莫明其妙的出錯(cuò) – 牢固的 想在一個(gè)程序中復(fù)用 DrawAllShapes,都必須帶上 Circle、 Square,即使那個(gè)程序不需要他們 – 例子 2(續(xù)) ? 修改后的設(shè)計(jì) class Shape{ public: virtual void Draw() const=0。 double itsRadius。 public: client(ClientInterface amp。 public: client(serveramp。除了 main以外,其他所有程序都不需要知道這個(gè)函數(shù)的存在。一個(gè)職責(zé)的變化可能會(huì)虛弱或者抑止這個(gè)類完成其它職責(zé)的能力 – 多職責(zé)將導(dǎo)致 脆弱 性的臭味 Rectangle + draw( ) +area( ):double Computational Geometry Application Graphical Application GUI Rectangle類具有兩個(gè)職責(zé): 1. 計(jì)算矩形面積的數(shù)學(xué)模型 2. 將矩形在一個(gè)圖形設(shè)備上描述出來 ? 示例 1: – Rectangle類違反了 SRP,具有兩個(gè)職能 ——計(jì)算面積和繪制矩形 – 這種對(duì) SRP的違反將導(dǎo)致兩個(gè)方面的問題: ? 包含不必要的代碼 – 一個(gè)應(yīng)用可能希望使用 Retangle類計(jì)算矩形的面積,但是卻被迫將繪制矩形相關(guān)的代碼也包含進(jìn)來 ? 一些邏輯上毫無關(guān)聯(lián)的原因可能導(dǎo)致應(yīng)用失敗 – 如果 GraphicalApplication的需求發(fā)生了變化,從而對(duì) Rectangle類進(jìn)行了修改。這是我們不希望的,但是有時(shí)候卻是必須的。如果我們想要讓 client調(diào)用一個(gè)新的 server類,那么我們不得不修改 client的源代碼 ?從而帶來編譯、鏈接、部署等一系列的問題。 } }。 struct Shape{ ShapeType itsType。 break。 virtual bool Precedes(const Shapeamp。 } 這個(gè)程序符合 OCP嗎?? 利用 “ 數(shù)據(jù)驅(qū)動(dòng) ” 的方法獲得封閉性 include typeinfo include string include iostream using namespace std。 !done。d) 會(huì)導(dǎo)致錯(cuò)誤 顯然 D對(duì)于 f是脆弱的。 void DrawShape(const Shapeamp。 void Square::setWidth(double w){ Rectangle::setWidth(w)。 class Square:public Rectangle{ public: void setWidth(double w)。 ?而行為可以依賴客戶程序做出合理的假設(shè)。細(xì)節(jié)應(yīng)該依賴于抽象。 ButtonServer提供一些抽象的方法, Button類通過這些接口可以開啟或關(guān)掉一些東西。 Button依賴于 ButtonServer接口,但是接口并不依賴于 Button,也就是說任何知道如何操作 ButtonServer接口的對(duì)象都可以操作 Lamp。 class TimerClient{ public: virtual void TimerOut(int timeOutId )。 public: DoorTimerAdapter(TimedDooramp。 ? Door可以加鎖、解鎖、而且可以感知自己是開還是關(guān); ? Door是抽象基類,客戶程序可以依賴于抽象而不是具體的實(shí)現(xiàn) 增加功能 如果門打開時(shí)間過長(zhǎng),它就會(huì)報(bào)警。 else if((/* mechanism for detecting turnOff mand */) bsturnOff( )。低層通常是易變的。 ? 基于契約(和約)的設(shè)計(jì) ——DBC( Deign by Contract)(續(xù)) – 例如: 在上面的例子中, Rectangle::SetWidth(double w)的后置條件可以看作是: assert((itsWidth==w) amp。 void Square::setHeight(double h){ Rectangle::setWidth(h)。 R e c ta n g leS q u a r e– 問題的第一步分析: ? 看下面這個(gè)函數(shù) void f(Rectangleamp。 doulbe width。 struct Circle:public Shape{ Circle():Shape(circle){ }。 (thisOrd 0)) done = true。 } private: static char* typeOrderTable[]。} } void DrawAllShapes(vectorShape*amp。 }。 struct Square{ ShapeType itsType。 class ClientInterface{ virtual void ServerFunc()=0。 class server{ int serverData。將這兩個(gè)職責(zé)耦合在一起,將導(dǎo)致每次因?yàn)闃I(yè)務(wù)規(guī)則變化調(diào)整Employee類時(shí),所有持久化部分的代碼也要跟著變化 2. 開放封閉原則( OCP) ? 陳述: – 軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是可以擴(kuò)展的,同時(shí)還可以是不必修改的,更確切的說,函數(shù)實(shí)體應(yīng)該: ( 1)對(duì)擴(kuò)展是開放的 當(dāng)應(yīng)用的需求變化時(shí),我們可以對(duì)模塊進(jìn)行擴(kuò)展,使其具有滿足改變的新的行為 ——即,我們可以改變模塊的功能 ( 2)對(duì)更改是封閉的 對(duì)模塊進(jìn)行擴(kuò)展時(shí),不必改動(dòng)已有的源代碼或二進(jìn)制代碼。 virtual void hangup( ) =0。 ? 連接和通信同時(shí)變化 這種情況下,不必將職責(zé)分開。 public: void ServerFunc()。 s。 ?OCP原則其實(shí)是要求我們清晰的區(qū)分策略和策略的具體實(shí)現(xiàn)形式。in。i++) (*i)Draw
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1