编程语言
首页 > 编程语言> > python – 在类层次结构中应该编写实例方法?

python – 在类层次结构中应该编写实例方法?

作者:互联网

这是我用于模拟模型的类“层次结构”的一部分(我的代码在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实例方法?

我认为我应该将类Agent的依赖性限制在层次结构中比自身更低的类(即,其实例包含在代理实例中的类).但这意味着移动方法不能在类Agent中,因为它创建了一个依赖于(至少是描述地形等的类的接口) – 因此我不妨向Agent添加对World的引用(因此依赖于World).从软件设计角度来看,这样可以吗?

另一种方法是将方法移动到类World中,它不会导致任何其他依赖.然而,类World将会做几乎所有的工作,在我看来它会违背OOP的主要思想(我理解为不将所有功能集中到一个地方,而是将其包含在相关的地方)类).

性能方面的考虑只是次要问题(我认为两种方法之间的性能不同).

编辑:我误用了上面的“类层次结构”.我没有提到继承层次结构,只是指一堆实例相互包含的类.

解决方法:

你需要考虑的是Single Responsibility Principle.基本上,每个类应该对一个“事物”负责,并且应该完全包含那个责任.而且你应该只继承责任延伸的地方.你应该始终能够说扩展类是父级的100%以及更多(在特定意义上更多).你永远不应该有这样一种情况:孩子是父母的一个子集并且“少”.因此,扩展世界的人并不是一个好的设计,因为世界上有些方面与人无关.

因此,如果我们查看一个示例,您可以将实例方法放在由该特定类的角色决定的级别上.那么,让我们看一个更明确的例子:

class Person:
    name: ""
    birthDate: ""

class PoliceOfficer extends Person:
    badgeNumber: ""

显然这是伪代码,但它展示了正在发生的事情.

现在,你会在哪里添加move()方法?我们可以将它添加到PoliceOfficer,但是我们会打破Person的封装,因为一个人也可以移动.

class Person:
    def move(world):

但是,我们在哪里添加issueTicket()方法?广义人员不能发票,所以如果我们将其添加到Person类,我们就要承担责任.所以相反,我们会把它添加到PoliceOfficer,因为那是有道理的.

至于创建依赖关系,你应该是always favor composition over inheritance.所以在这个意义上,可以有你想要的依赖关系,因为它们都是软依赖关系(好吧,有点).由于move()采用了world(或具有world接口的对象)的实例,因此依赖关系被推出类并进入调用代码.因此,让您的类代码保持相当开放和无依赖性,同时仍然具有生产力.

通常认为硬编码依赖关系是不好的做法.但注入它们(通过依赖注入或组合)通常被认为是一件好事.

总结:将实例方法放在符合逻辑意义的地方.

标签:python,language-agnostic,oop,software-design
来源: https://codeday.me/bug/20190621/1256115.html