最近在看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的架構呢
謝謝