我有一个名为Contact
的课程和一个名为Account
我有一个名为public static Account GetAccount(Contact c) {...}
这种方法的最佳位置在哪里?我应该关注哪些设计模式?
A)使用Contact类
B)使用帐户类
C)在两个类中都可以访问该方法
D)其他地方?
答案 0 :(得分:1)
你的问题可能有很多好的答案。我会抓住一个答案,但它会将我的个人偏见融入其中。
在OOP中,您通常不会看到全局可访问的功能,与所有类断开连接但可用。 (静态方法可能是全局可用的,但它们仍然与特定类相关联)。要跟进dkatzel的回答,OOP中的常见模式是实例管理器。您有一个类或实例,可以访问数据库,文件存储,REST服务或保存Contact或Account对象以供将来使用的其他位置。
您可能正在使用Python项目的持久性框架。也许是这样的:https://docs.djangoproject.com/en/dev/topics/db/managers/
一些持久性框架创建了方便的方法实例方法,如Contact.getAccount() - 将getAccount消息发送给联系人,该方法返回关联的Account对象。 ......或者开发人员可以自己添加这些方便的方法。
另一种便利方法可以存在于类的静态方面。例如,Account类可以具有静态getAccountForContact()方法,该方法返回给定Contact对象的特定帐户。此方法将访问实例管理器并使用联系对象中的信息来查找正确的帐户。
通常,您不会向名为getAccountForContact()的Contact类添加静态方法。相反,您将在Contact上创建一个名为getAccount()的实例方法。然后,此方法可以调用Account.getAccountForContact()并传递" self"作为参数。 (或直接与实例管理员交谈)。
我的指导原则通常都是干的 - 不要重复自己。我选择了消除最多复制粘贴代码的选项。
答案 1 :(得分:1)
如果您以这种方式定义方法,它与您的任何一个类都没有真正的联系。您也可以将它放在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中,通常建议您尽可能避免使用全局函数。如果你想要一个静态函数,我会把它放在一个单独的类中。
答案 2 :(得分:0)
这取决于从联系人到帐户的查找方式,但我会投票将其放入使用Repository
模式的新类中。
Repository repo = ...
Account account = repo.getAccount(contact);
通过这种方式,您可以拥有多个Repository实现,这些实现可以查找数据库中的信息,HTTP请求或内部映射等,您不必修改使用存储库的代码。
答案 3 :(得分:0)
我的投票是针对新课程,特别是如果该函数返回现有帐户对象。也就是说,如果你有一个Contact实例的集合和一个Account实例的集合,并且这个函数将一个映射到另一个,那么使用一个新类来封装这个映射。
否则,如果Contact
返回从模板填写的新帐户,则GetAccount
上的方法可能有意义。如果GetAccount
类似于Account类的工厂方法,或者如果Account类只是一个记录类型(其实例的生命周期绑定到Contact
的实例),那么这将成立。< / p>
作为Account
的一部分,我认为这有意义的唯一方法是它是否有意义作为构造函数。