Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在何处放置与多个类交互的方法_Oop_Design Patterns - Fatal编程技术网

Oop 在何处放置与多个类交互的方法

Oop 在何处放置与多个类交互的方法,oop,design-patterns,Oop,Design Patterns,我有一个名为Contact的类和一个名为Account 我有一个方法叫做publicstaticaccountgetaccount(contactc){…} 这种方法最好放在哪里?我应该看什么样的设计模式 A) 接触类 B) 使用Account类 C) 使该方法在两个类中都可访问 D) 在其他地方?这取决于从联系人到帐户的查找是如何进行的,但我会投票支持将其放入一个使用存储库模式的新类中 Repository repo = ... Account account = repo.getAccou

我有一个名为
Contact
的类和一个名为
Account

我有一个方法叫做
publicstaticaccountgetaccount(contactc){…}

这种方法最好放在哪里?我应该看什么样的设计模式

A) 接触类

B) 使用Account类

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


D) 在其他地方?

这取决于从联系人到帐户的查找是如何进行的,但我会投票支持将其放入一个使用
存储库
模式的新类中

Repository repo = ...

Account account = repo.getAccount(contact);

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

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

否则,如果
GetAccount
返回一个从模板中填写的新帐户,那么它作为
Contact
上的方法可能是有意义的。如果
GetAccount
类似于Account类的工厂方法,或者Account类只是一种记录类型(其实例的生存期绑定到
联系人的实例上),则此选项适用


作为
帐户的一部分,我认为这是有意义的唯一方式,就是它作为构造函数是否有意义。

对于您的问题,可能有很多好的答案。我会尝试一个答案,但这会让我的个人偏见根深蒂固

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

您可能正在Python项目中使用持久性框架。也许是这样的:

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

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

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


我的指导原则通常是干巴巴的——不要重复你自己。我选择的选项消除了大部分复制粘贴代码。

如果以这种方式定义方法,那么它实际上与两个类都没有联系。您还可以将其放在
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中,通常建议尽可能避免使用全局函数。如果你想要一个静态函数,我会把它放在一个单独的类中