Re: [問題] 該用什麼design pattern比較好呢??
※ 引述《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
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):