【问题标题】:Where to put methods that interact with multiple classes在哪里放置与多个类交互的方法
【发布时间】:2014-06-30 17:13:41
【问题描述】:

我有一个名为 Contact 的课程和一个名为 Account 的课程

我有一个方法叫public static Account GetAccount(Contact c) {...}

放置这种方法的最佳位置在哪里?我应该查看哪些设计模式?

A) 使用 Contact 类

B) 使用 Account 类

C) 在两个类中都可以访问该方法

D) 其他地方?

【问题讨论】:

    标签: oop design-patterns


    【解决方案1】:

    您的问题可能有很多很好的答案。我会尝试一个答案,但它会包含我的个人偏见。

    在 OOP 中,您通常看不到全局可访问的函数,这些函数与它们断开连接,但对所有类都可用。 (静态方法可能是全局可用的,但它们仍然与特定的类相关联)。为了跟进 dkatzel 的回答,OOP 中的一个常见模式是 instance manager。您有一个类或实例提供对数据库、文件存储、REST 服务或保存联系人或帐户对象以供将来使用的其他位置的访问。

    您可能在 Python 项目中使用了持久性框架。也许是这样的:https://docs.djangoproject.com/en/dev/topics/db/managers/

    一些持久性框架创建了方便的方法实例方法,例如 Contact.getAccount() —— 将 getAccount 消息发送给联系人,该方法返回关联的 Account 对象。 ...或者开发人员可以自己添加这些便利方法。

    另一种方便的方法可以存在于类的静态端。例如,Account 类可以有一个静态 getAccountForContact() 方法,该方法返回给定 Contact 对象的特定帐户。此方法将访问实例管理器并使用联系人对象中的信息来查找正确的帐户。

    通常您不会向 Contact 类添加名为 getAccountForContact() 的静态方法。相反,您将在 Contact 上创建一个名为 getAccount() 的实例方法。然后此方法可以调用 Account.getAccountForContact() 并将“self”作为参数传入。 (或直接与实例管理员交谈)。

    我的指导原则通常是 DRY - 不要重复自己。我选择消除最多复制和粘贴代码的选项。

    【讨论】:

      【解决方案2】:

      如果您以这种方式定义您的方法,那么它与您的任何一个类都没有真正的联系。你也可以把它放在Util 类中:

      public class AccountUtil{
          public static Account getAccount(Contact c){ ... }
          // you can put other methods here, e.g.
          public static Contact getContact(Account a){ ... }
      }
      

      这遵循在实用程序类中对静态函数进行分组的模式,例如 Java / C# 中的 Math

      如果您想以一种清晰的方式将函数绑定到一个类,请考虑这样设计您的类:

      public class Contact{
          public Account getAccount(){ ... } // returns the Account of this Contact
          // other methods
      }
      

      在 OOP 中,通常建议您尽可能避免使用全局函数。如果你仍然想要一个静态函数,我会把它放在一个单独的类中。

      【讨论】:

        【解决方案3】:

        这取决于从联系人到帐户的查找是如何发生的,但我会投票支持将其放入使用 Repository 模式的新类中。

        Repository repo = ...
        
        Account account = repo.getAccount(contact);
        

        这样,您可以拥有多个存储库实现,从数据库、HTTP 请求或内部映射等中查找信息,而您不必修改使用存储库的代码。

        【讨论】:

          【解决方案4】:

          我投票支持一个新类,特别是如果该函数返回一个现有的帐户对象。也就是说,如果您有一组 Contact 实例和一组 Account 实例,并且此函数将一个映射到另一个,请使用一个新类来封装此映射。

          否则,如果GetAccount 返回从模板填写的新帐户,则作为Contact 上的方法可能是有意义的。如果 GetAccount 类似于 Account 类的工厂方法,或者如果 Account 类只是一个记录类型(其实例的生命周期绑定到 Contact 的实例),这将成立。

          我认为这作为Account 的一部分有意义的唯一方法是它作为构造函数是否有意义。

          【讨论】:

            猜你喜欢
            • 2011-06-01
            • 2019-11-05
            • 2017-04-12
            • 2010-12-10
            • 1970-01-01
            • 2012-11-11
            • 1970-01-01
            • 2014-05-07
            • 1970-01-01
            相关资源
            最近更新 更多