Re: [問題]物件的method的design
※ 引述《hsnucsc (hsnugo)》之銘言:
: 最近在看Head First OOA&D
: 他有一個例子是
: Guitar GuitarSpec Inventory FindGuitar(main的所在)
: ========= ============= =========== ==========
: serialNumber builder guitars inventory
: price model
: GuitarSpec type
: getSerialNumber() getBuilder() addGuitar()
: setprice() getModel() getGuitar()
: getSpec() getType search()
: 原本search()是寫成
: public List search(GuitarSpec searchSpec)
: {
: List matchingGuitars = new LinkedList();
: for(Iterator i = guitars.iterator(); i.hasNext(); )
: {
: Guitar guitar = (Guitar)i.next();
: GuitarSpec = guitar.getSpec();
: if(searchSpec.getBuilder() != guitarSpec.getBuilder())
: continue;
: if(searchSpec.getModel() != guitarSpec.getModel())
: continue;
: if(searchSpec.getType() != guitarSpec.getType())
: continue;
: matchingGuitars.add(guitar);//builder, model, type都一樣的話 就加進list
: }
: return matchingGuitars;
: }
: 但是這樣一來 如果GuitarSpec要加入其他特性 就必須更改Inventory.search()
: 所以他把兩個GuitarSpec的比較
: 委派(delegate)給GuitarSpec
: 於是GuitarSpec多了下面這個method
: public boolean matches(GuitarSpec spec)
: {
: if(builder != spec.getBuilder())
: return false;
: if(model != spec.getModel())
: return false;
: if(type != spec.getType())
: return false;
: if(backWood != spec.getBackWood())
: return false;
: return true;
: }
: =========================================================================
: 我大致上知道
: 通常物件是名詞
: 而他的method則是動詞 是那個物件可以做的動作
: ex: Dog
: ======
: eat()
: drink()
: sleep()
: 但是如果是俄羅斯方塊中的 Sqare
: 應該是sqare 有rotate() 然後我是叫sqare自己旋轉
: 還是說應該是player擁有roate(這個method)去旋轉sqare
Player 會旋轉嗎? Sqare 會旋轉嗎?
看來是 Player 會旋轉 Sqare 而且 Sqare 會旋轉自己。
這樣分析看起來,Player 必須擁有 Sqare 的資訊才有辦法旋轉 Sqare
但是 Sqare 只要旋轉自己就好。
所以將 Sqare 的 rotate 方法放在 Sqare 比較好
優於將 rotate 方法放在 Player。
當 Player 想要旋轉 Sqare 的時候,則委派 Sqare 去做 rotate 即可。
即:
Player Sqare
============ ========
sqare: Sqare rotate()
------------
rotate()
│
└sqare.rotate();
: 但是像matches應該是Inventory可以做的動作
: 還是Guitar可以做的動作(Guitar會自己做match??)
: 又 search 應該是Inventory(存貨的清單)可以做的動作嗎
Inventory 會配對吉他嗎? Guitar 會配對吉他嗎?
看起來是 Inventory 會配對兩個不同的吉他,而且 Guitar 會配對另一個未知的吉他
這樣分析起來 Inventory 必須擁有兩個吉他的資訊才有辦法進行配對。
但是 Guitar 只要讓自己和另一個吉他配對就好。
所以將 matches 放在 Guitar 比較好
優於將 matches 放在 Inventory。
當 Inventory 想要配對兩個吉他的時候,只要委派 Guitar 去做 matches 即可。
: 我想問的是
: 我們該如果思考哪些哪些class可以有哪些method
: 哪些method應該是屬於哪些class做的
: 這問題似乎與 andrew43大大 po的 "不懂如何抽離物件(初學物件導向的問題)"類似
: 不過我看完回文之後 仍然對於這方面 似懂非懂
: 是不是有方法可以有系統的design OO的架構呢
: 謝謝
往下繼續看 Head First OOA&D,看完整就會知道運作流程了。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.247.13
推
12/08 21:26, , 1F
12/08 21:26, 1F
→
12/08 21:30, , 2F
12/08 21:30, 2F
→
12/08 21:31, , 3F
12/08 21:31, 3F
推
12/08 22:28, , 4F
12/08 22:28, 4F
推
12/09 15:09, , 5F
12/09 15:09, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
OOAD 近期熱門文章
PTT數位生活區 即時熱門文章