作者H45 (!H45)
看板OOAD
标题Re: [问题]物件的method的design
时间Mon Dec 8 17:08:01 2008
※ 引述《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
1F:推 hsnucsc :谢谢您的回答 12/08 21:26
2F:→ hsnucsc :但是我们在写的时候 难道该写好架构後 再改成委派吗 12/08 21:30
3F:→ hsnucsc :怎麽去思考怎样的method适合委派 有时候有点confuse 12/08 21:31
4F:推 tinlans :那本书後面会讲 SRP 和 CRC card 吧,先读读看? 12/08 22:28
5F:推 hsnucsc :soga 谢谢 12/09 15:09