[問題]物件的method的design

看板OOAD作者 (hsnugo)時間16年前 (2008/12/08 16:10), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/2 (看更多)
最近在看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 但是像matches應該是Inventory可以做的動作 還是Guitar可以做的動作(Guitar會自己做match??) 又 search 應該是Inventory(存貨的清單)可以做的動作嗎 我想問的是 我們該如果思考哪些哪些class可以有哪些method 哪些method應該是屬於哪些class做的 這問題似乎與 andrew43大大 po的 "不懂如何抽離物件(初學物件導向的問題)"類似 不過我看完回文之後 仍然對於這方面 似懂非懂 是不是有方法可以有系統的design OO的架構呢 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.90.94 ※ 編輯: hsnucsc 來自: 140.113.90.94 (12/08 16:42)

12/08 16:55, , 1F
你覺得是 Player 會旋轉,還是 Sqare 會旋轉 XD
12/08 16:55, 1F
文章代碼(AID): #19FDPSpp (OOAD)
討論串 (同標題文章)
文章代碼(AID): #19FDPSpp (OOAD)