【发布时间】:2010-10-20 23:51:34
【问题描述】:
有一句名言是这样说的
然后程序代码获取信息 做出决定。面向对象的代码 告诉对象做事。 — 亚历克 锋利
这篇文章的主题正是关于这个。
假设我们正在开发一个游戏,其中我们有一个Game,其中有一个Board。
当面临决定在Board类上实现哪些方法的问题时,我总是想到两种不同的方法:
第一种方法是
用getSize()、getPieceAt(x, y)、setPieceAt(x, y, piece) 填充Board 类。这看起来很合理,并且通常可以在库/框架中找到。 Board 类具有一组想要共享的内部特性,并具有一组允许类的客户端按照他的意愿控制类的方法。客户应该询问他需要的东西并决定做什么。如果他想将所有棋子设置为黑色,他将“手动”迭代它们以实现该目标。
第二种方法是关于
寻找Board 的依赖类,看看他们“告诉”它做什么。 ClassA 想计算有多少块是红色的,所以我会实现一个calculateNumberOfRedPieces()。 ClassB 打算清除Board 上的所有部分(例如,将它们全部设置为NullPiece),所以我将在Board 类中添加一个clearBoard() 方法。这种方法不太通用,但在其他方面允许更大的灵活性。如果我在IBoard 接口后面“隐藏”Board,并决定我想要一个无限大小的板,以第一种方式做,我会被卡住,因为我必须迭代无限数量的物品!另一方面,通过这种方式,我可以做得很好(例如,我可以假设所有片段都为空,而不是包含在哈希表中的片段!)。
所以...
我知道如果我打算创建一个库,我可能会坚持第一种方法,因为它更通用。另一方面,我想知道当我完全控制将使用Board 类的系统时,应该采用哪种方法——当我将同时设计所有将使用Board 的类。目前和将来(如果以后我决定添加依赖于具有不同“愿望”的Board 的新类,第二种方法不会引发问题吗?)。
【问题讨论】:
-
他在问什么更有意义。选项 1、选项 2、选项 3(其他)
-
我不明白(常见的)“面向对象”代码如何不仅仅是带有对象的过程代码。
-
@pst。你说的很对,顶层总是有一个main函数被调用,另外还有静态方法。但是,OO 设计的目标是尽可能多地删除程序代码,使它们更易于管理。