OO设计 - 将特定于实例的功能与特定于类的功能分开

时间:2009-02-17 19:45:52

标签: oop design-patterns

给定一个在语义上应该是某个类型的对象的类,但是还有多个操作来操作 on 对象的类型,那么最好的方法(模式?)是什么?在这种情况下组织班级?我发现当开发人员创建对象但正在考虑程序性思维时,这种情况很常见。

示例:

Class User {
  private m_userData;
  function User() {}
  function GetUserData() {}

  function KillAllUsers(){}
  function MaimAllUsers(){}
}

4 个答案:

答案 0 :(得分:4)

从您的描述中不太清楚,但似乎“KillAllUsers”和“MainAllUsers”方法正在对一组用户进行操作。我建议创建一个自定义UserCollection,将这些方法作为实例方法创建,或者将它们创建为静态并传入一组用户。在现代领域模型术语中,您将处理UserRepository。

答案 1 :(得分:4)

我宁愿将这两个目的分成User和UserManager类。 IMO可以更清楚地分离类应该做什么。

编辑:正确观察Dunk时,应用程序中的实际名称不应该是UserManager,而是更具描述性的实际目的。通常,您会找到要使用的功能的设计模式,因此该类的名称将由该模式提供。这可能会导致诸如UserRepository或UserFactory等名称。

答案 2 :(得分:1)

抽象出要对对象执行的操作,例如通过创建接口。然后您可以稍后担心如何提供实际逻辑的实现。

通常,在处理对象集合时,例如,键入User,它将是将实现它的User本身,而是另一个对象,例如UserService。如果绝对希望它在类级别上可用,则可以定义一个返回接口类型和默认实现的静态方法。

答案 3 :(得分:0)

像killAllUsers()或MaimAllUsers()这样的方法只是封装了预期的操作“什么”,它的交互方面的不完整信息特别是“谁”。你可以.kill()或.maim()一个User实例,但需要有人(JackTheReaper)打算对用户这样做,因此kill()和maim()是JackTheReaper和User之间的交互, killAllUsers()中由“All”表示的意图的一部分是JackTheReaper类如何管理所有用户的引用的责任。基本上,这里的技巧是抽象的类型级功能,作为与实体的交互

相关问题