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

正文內(nèi)容

軟件設(shè)計(jì)的五大原則(留存版)

  

【正文】 ()。 } 對(duì)于各個(gè) Shape的派生類,需要實(shí)現(xiàn)具體的排序規(guī)則 Circle類的排序規(guī)則實(shí)現(xiàn)如下: Bool Circle::Precedes(const Shapeamp。 int thisOrd = 1。 3. LisKov替換原則( LSP) ? 陳述: – 子類型( Subtype)必須能夠替換他們的基類型 (Basetype) Barbara Liskov對(duì)原則的陳述: 若對(duì)每個(gè)類型 S的對(duì)象 o1,都存在一個(gè)類型 T的對(duì)象 o2,使得在所有針對(duì) T編寫的程序 P中,用 o1替換 o2后,程序 P的行為功能不變,則 S是 T的子類型。 Point itsTopLeft。 class Square:public Rectangle{ public: void setWidth(double w)。} double getWidth() const{return width。 } 函數(shù) g不能操作 Square的實(shí)例, Square不能替換Rectangle,所以違反了LSP LSP告訴我們: 孤立的看,我們無(wú)法判斷模型的有效性 ——考慮一個(gè)設(shè)計(jì)是否恰當(dāng)時(shí),不能孤立的看待并判斷,應(yīng)該從此設(shè)計(jì)的使用者所作出的假設(shè)來(lái)審視它! 事先的推測(cè)是困難的,我們采用敏捷的思想 ?推遲這個(gè)判斷 ——“一個(gè)模型是否違反 LSP”。 4. 依賴倒置原則( DIP) ? 陳述: – 高層模塊不應(yīng)該依賴于低層模塊。這個(gè)按下是抽象的(不關(guān)心通過(guò)什么樣的機(jī)制去感知): ? 可能是 GUI上的一個(gè)按鈕被鼠標(biāo)單擊 ? 可能是一個(gè)真正的按鈕被手指按下 ? 可能是一個(gè)防盜裝置檢測(cè)到了運(yùn)動(dòng) ? …… – Lamp(燈)根據(jù)指示,收到 turn on消息顯示某種燈光,收到 turn off消息關(guān)閉燈光 ? 可能是計(jì)算機(jī)控制臺(tái)的 LED ? 可能是停車場(chǎng)的日光燈 ? 可能是激光打印機(jī)中的激光 ? …… 應(yīng)該如何設(shè)計(jì)程序來(lái)用 Button控制 Lamp呢? – 一個(gè)不成熟的設(shè)計(jì) Button對(duì)象直接依賴 Lamp對(duì)象,從而: ? Lamp的任何變化都會(huì)影響到Button,導(dǎo)致其改寫或者重新編譯 ? 黑盒方式重用 Button來(lái)控制一個(gè) Motor類變得不可能 B u t t o n+ P o l l ( )L a m p+ T u r n O n ( )+ T u r n O f f ( )class Button{ Lamp * itsLamp。 // void Lamp::turnOn(){ /*codes for turn on a specific device*/ } void Lamp::turnOff(){ /*codes for turn off a specific device*/ } ? 分析: – 上述設(shè)計(jì)使得 Button可以控制所有愿意實(shí)現(xiàn) ButtonServer接口的設(shè)備,甚至是一個(gè)尚未開(kāi)發(fā)出來(lái)的設(shè)備。 ——如果每次子類需要一個(gè)新方法時(shí)它都被加到基類接口中,基類接口將很快變胖。 ? 解決之道(續(xù)): – 使用多繼承 T i m e r i n t e r f a c e T i m e r C l i e n t+ T i m e o u tT i m e d D o o r+ T i m e O u tD o o rClass TimedDoor:public Door, public TimerClient{ public: virtual void DoorTimeOut(int timeOutID)。 class TimerClient{ public: virtual void TimerOut( )。 }。 u2()。 – 基類和派生類在前置條件和后置條件上的關(guān)系是: 如果在派生類中重新申明了基類中已有的成員函數(shù),這個(gè)函數(shù)只能使用相等或更弱的前置條件來(lái)替換原有的前置條件;并且,只能使用相等或更強(qiáng)的后置條件來(lái)替換原有的后置條件。 看起來(lái), 很不錯(cuò)! – 真正的問(wèn)題: void g(Rectangleamp。 doulbe width。} void setHeight(double h){height=h。 double itsRadius。 } ? 通過(guò)上述方法,我們成功地做到了一般情況下 DrawAllShapes函數(shù)對(duì)于順序問(wèn)題的封閉,也使得每個(gè) Shape派生類對(duì)于新的 Shape派生類的創(chuàng)建者或者給予類型的 Shape對(duì)象排序規(guī)則的改變是封閉的。 bool Shape::Precedes(const Shapeamp。 vectorShape*::const_iterator I。 void DrawAllShapes(VectorShape*amp。 }。 public: void ServerFunc()。 class server1{ int serverData。 public: client(serveramp。 }。 – 什么是職責(zé)? 職責(zé)是 “ 變化的原因 ” 。 SER):s(SER) {} void useServer(){ ()。 public: void ServerFunc()。 }。 typedef struct Shape * ShapePointer。 list){ vectorShape*::iterator i。 for(i=()。 s) const{ const char* thisType = typeid(*this).name()。 ? 對(duì)于不同的 Shapes的繪制順序的變化不封閉的唯一部分就是表本身。 }。} double getWidth() const{return width。 double height。 r){ (5)。 ?派生類必須接受基類已經(jīng)接受的一切;并且,派生類不能違反基類已經(jīng)確定的規(guī)則。 } p( ){ g( )。 // class Lamp:public ButtonServer{ public: void turnOn()。 }。 }。 ?該函數(shù)有兩個(gè)參數(shù),一個(gè)是超時(shí)時(shí)間,另一個(gè)是指向TimerClient對(duì)象的指針,此對(duì)象的 TimerOut函數(shù)會(huì)在超時(shí)時(shí)被調(diào)用 我們?nèi)绾螌?TimerClient和 TimedDoor聯(lián)系起來(lái)? 問(wèn)題 一種常見(jiàn)的解決方案如下: T i m e r i n t e r f a c e T i m e r C l i e n tD o o r+ T i m e o u tT i m e d D o o r?問(wèn)題 ——接口污染 在 Door接口中加入新的方法( Timeout),而這個(gè)方法僅僅只為它的一個(gè)子類帶來(lái)好處。 }。 當(dāng)接受到 Poll(輪詢)消息時(shí),判斷其是否被 “ 按下 ” 。在 Jave和 C++標(biāo)準(zhǔn)中尚未支持,我們必須自己考慮。 assert(()==20)。} virtual void setHeight(double h){height=h。} }。 void Draw()const。 – 事實(shí)上在 C++中我們可以在鏈接時(shí)選擇要使用的表。 bool done = false。 i++) (*i)Dr
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1