ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-21 14:55:44  阅读:241  来源: 互联网

标签:python language-agnostic oop software-design


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有