看板 OOAD 關於我們 聯絡資訊
※ 引述《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
hsnucsc :謝謝您的回答 12/08 21:26
hsnucsc :但是我們在寫的時候 難道該寫好架構後 再改成委派嗎 12/08 21:30
hsnucsc :怎麼去思考怎樣的method適合委派 有時候有點confuse 12/08 21:31
tinlans :那本書後面會講 SRP 和 CRC card 吧,先讀讀看? 12/08 22:28
hsnucsc :soga 謝謝 12/09 15:09