Re: [問題] 該用什麼design pattern比較好呢??

看板C_and_CPP作者 (高金素箍)時間12年前 (2011/09/01 05:09), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《rosemary0401 (靠,為什麼沒考上榜首)》之銘言: : 我希望能用一個class來管理A, B, C, D, E這5個物件, : A, B, C, D, E這5個物件有共通的函數, : 比方說他們都需要create、get、delete,但他們所有的功能也不盡相同, : 比方說C物件還需要show和change, : class CMyClass{ : public: : CreateA(); : GetA(); : DeleteA(); : CreateB(); : GetB(); : DeleteB(); : CreateC(); : GetC(); : DeleteC(); : ChangeC(); : ShowC(); : //.....bla bla : }; : 這5個物件可能會同時存在,也有可能只存在4個。 : 其中C物件可能會是C1, C2, C3, C4,... 其中之一,可以讓使用者選擇, : 如果選了C1就不能選擇C2, : 而且未來可能會增加到C5, C6, ...,或是減少到只剩C1和C2, : 簡言之,C的種類可能會發生變化。 : 這樣的需求要用甚麼design pattern比較好呢? 一開始我以為 CMyClass 是個 Factory, 但後來發現它其實更像一 個 Collection, 在問怎麼實作之前, 你應該先了解: 「要做的東西是什麼」 而板友沒人比你清楚這點, 所以都只能隔空抓藥而已, 它應可簡化 成這樣: class CMyClass { public: GetA(); GetB(); GetC(); GetC1(); GetC2(); }; 你問我怎樣讓使用者可以選擇只留 C1 不要其他的? 很可惜C++沒辦 法在執行的時候更改類別介面, 所以就改用參數傳遞吧! class CMyClass { public: enum Key{ A, B, C, C1, C2 }; Get( Key key ); }; 這會面臨擴充的問題, 所以Key我會選擇用字串, 而每個物件則是用 map存起來, 剛好你說道「這5個物件有共通的函數」,所以整合起來 會容易些: struct CommonBase { public: virtual ~CommonBase() { } public: virtual void Create() = 0; public: virtual void Delete() = 0; }; 以上類別定義了對物件操作的規範, 我會這樣做的原因是思考了: 「沒有人比物件它自己本身更了解它該如何被建構」 這邊不需要friend關係, 因為 CMyClass沒有權力也沒本事知道太多 建置/摧毀的細節, 如果它有, 應該改命名為 'God'. 另一個為 Cx 等物件特製的介面則會長這樣: struct ParticularBase : public CommonBase { public: virtual ~ParticularBase(){ } public: virtual void Show() = 0; public: virtual void Change() = 0; }; 介面的繼承表示了實作責任的增加, 而不是可操作的增加, 記住這 點可以讓你在做類別設計時讓繼承樹偏向簡單而不是隱晦難懂. 當然切換不同層次的介面, 轉型是必要的, 一個簡單的實作如下: http://codepad.org/e3XSzvlp 這邊還需要考慮到物件生命週期的問題, 我將它們的關係設定為 composition, 假如物件的製程大致相同, 則類別數不會跟物件數 成正比. 另一個語意層面的問題 // (自己)從monitor中取出C物件並將其建構出來 monitor.Get("C")->Create(); vs // 由monitor來建構C物件 monitor.CreateC(); 我這邊假設你的 Create()是指:C++物件 可提供服務的物件 這 個轉換. 但是該動作在呼叫背景不一樣所代表意義也不同, 雖然都可以達成 相同效果, 但是在更改類別設計時, 隱藏的類別責任是參考因素之 一, 不宜忽略, 還需選擇適當的語意來實現. 小提醒 不清楚面對的問題為何, 就算找到能用的設計模式, 也一定用得不 , 套用設計模式還關係到未來的維護, 不只是為了當下做得出來 而已, 有時使用設計模式只會把問題複雜化, 沒有必然的好處. -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (09/01 10:27)

09/01 11:45, , 1F
有神快拜!
09/01 11:45, 1F

09/01 11:52, , 2F
請問在class Monitor的36、37行另外定義是因為方便
09/01 11:52, 2F

09/01 11:52, , 3F
管理嗎?
09/01 11:52, 3F

09/01 14:44, , 4F
抽象化 + 方便切換實作
09/01 14:44, 4F

09/01 14:46, , 5F
感謝
09/01 14:46, 5F
文章代碼(AID): #1ENgCcZN (C_and_CPP)
文章代碼(AID): #1ENgCcZN (C_and_CPP)