最近在看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的架构呢
谢谢