Re: [問題]物件的method的design

作者: H45 (!H45)   2008-12-08 17:08:01
※ 引述《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()

Links booklink

Contact Us: admin [ a t ] ucptt.com