这是我用于模拟模型的类“层次结构”的一部分(我的代码是用 Python 编写的,但我认为我的问题与语言无关):
class World:
# highest-level class, which "knows" everything about the model
# most likely will have just one instance
# contains (e.g., in a dictionary) references to all the instances of class Agent
class Agent:
# each instance represents an agent
# an agent can, among other things, move around according to certain rules
# movement depends on the internal state of the agent,
# but also on the terrain and other information not stored in the Agent instance
问题:我应该把它放在哪里move
实例方法?
我想我应该限制对class Agent
到层次结构中比其自身低的类(即,其实例包含在Agent
实例)。但这意味着move
方法不能位于class Agent
因为它创建了对描述地形等的类(至少是其接口)的依赖 - 所以我不妨添加Agent
对(并因此依赖于)的引用World
。从软件设计的角度来看这可以吗?
另一种方法是放置方法move
in class World
,它不会导致任何额外的依赖关系。然而,class World
然后将完成几乎所有的工作,在我看来,这违背了 OOP 的主要思想(我的理解是不要将所有功能堆积到一个地方,而是将其包含在相关的类中)。
性能考虑只是次要问题(而且我认为两种方法之间的性能不会有差异)。
编辑:我误用了上面的“类层次结构”一词。我指的不是继承层次结构,而是指一组实例相互包含的类。
你需要考虑的是单一责任原则 http://en.wikipedia.org/wiki/Single_responsibility_principle。基本上,每个类应该负责一件“事情”,并且应该完全封装该职责。而且你应该只继承责任延伸的地方。您应该始终能够说扩展类是父类的 100% 甚至更多(特定意义上的更多)。你永远不应该出现孩子是父母的子集并且“较少”的情况。因此,人扩展世界并不是一个好的设计,因为世界的某些方面与人无关。
因此,如果我们看一个示例,您会将实例方法放在由该特定类的角色决定的级别上。那么,让我们看一个更明确的例子:
class Person:
name: ""
birthDate: ""
class PoliceOfficer extends Person:
badgeNumber: ""
显然这是伪代码,但它演示了正在发生的事情。
现在,您将在哪里添加move()
方法?我们可以将其添加到PoliceOfficer
,但是我们会打破封装Person
因为人也是可以移动的。
class Person:
def move(world):
但是,我们在哪里添加一个issueTicket()
方法?广义的Person
无法开票,所以如果我们将其添加到Person
类,我们就违反了它的责任。因此,我们将其添加到PoliceOfficer
,因为这就是有意义的地方。
至于创建依赖关系,您应该总是倾向于组合而不是继承 https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance。因此,从这个意义上说,可以有任意数量的依赖项,因为它们都是软依赖项(嗯,有点)。自从move()
举一个例子world
(或具有世界接口的对象),依赖关系被推出类并进入调用代码。因此,这可以让您的类的代码保持相当开放和无依赖性,同时仍然保持高效。
通常认为对依赖项进行硬编码是不好的做法。但注入它们(通过依赖注入或组合)通常被视为一件好事。
总之:将实例方法放在逻辑上有意义的地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)