我呼籲Account
如果把與多個類
一個名爲Contact
和一類交互的方法和我有一個名爲方法public static Account GetAccount(Contact c) {...}
哪裏是把這個方法最好的地方?我應該看什麼設計模式?
A)與接觸類
B)隨着Account類
C)有兩個類別
d)別的地方訪問的方法是什麼?
我呼籲Account
如果把與多個類
一個名爲Contact
和一類交互的方法和我有一個名爲方法public static Account GetAccount(Contact c) {...}
哪裏是把這個方法最好的地方?我應該看什麼設計模式?
A)與接觸類
B)隨着Account類
C)有兩個類別
d)別的地方訪問的方法是什麼?
您的問題可能有很多很好的答案。我會試着回答一個問題,但這會讓我產生個人偏見。
在OOP中,您通常看不到全局可訪問的)函數,與所有類都斷開連接但可用。 (靜態方法可能是全局可用的,但它們仍然與特定的類綁定)。爲了跟進dkatzel的回答,OOP中常見的模式是實例管理器。您有一個類或實例提供對數據庫,文件存儲,REST服務或其他聯繫人或帳戶對象保存以供將來使用的其他位置的訪問權限。
您可能會在您的Python項目中使用持久性框架。也許是這樣的:https://docs.djangoproject.com/en/dev/topics/db/managers/
一些持久性框架建立的便利方法實例方法,如Contact.getAccount() - 發送getAccount消息的聯繫人,並且該方法返回相關的帳戶對象。 ...或者開發人員可以自己添加這些種便利方法。
另一種方便的方法可以生活在一個類的靜態的一面。例如,Account類可以有一個靜態getAccountForContact()方法,該方法返回給定Contact對象的特定帳戶。此方法將訪問實例管理器並使用聯繫人對象中的信息查找正確的帳戶。
通常情況下,您不會將靜態方法添加到名爲getAccountForContact()的Contact類。相反,你會在名爲getAccount()的Contact上創建一個實例方法。然後這個方法可以調用Account.getAccountForContact()並傳入「self」作爲參數。 (或直接與實例管理器交談)。
我的指導原則通常是幹 - 不要重複自己。我選擇了消除最複製粘貼代碼的選項。
這取決於如何從聯繫人帳戶查找發生,但我會投票將其放入使用Repository
模式的新類中。
Repository repo = ...
Account account = repo.getAccount(contact);
這樣,你可以有一個查詢從數據庫中的信息,或通過HTTP請求或內部映射等,你不必修改使用該庫的代碼庫多implemtations。
我的投票是針對一個新的類,特別是如果該函數返回一個現有的賬戶對象。也就是說,如果您有一個Contact實例集合和一個Account實例集合,並且此函數將一個映射到另一個,則使用一個新類來封裝此映射。
否則,如果GetAccount
返回從模板填入的新帳戶,則它可能作爲Contact
上的方法有意義。如果GetAccount
類似於Account類的工廠方法,或者如果Account類只是一個記錄類型(其實例的生存期綁定到Contact
的實例),則這將保持不變。
我認爲這是有意義的作爲Account
的一部分的唯一方法是如果它作爲構造函數有意義。
如果你用這種方式定義你的方法,它並不真正與你的任何類相關聯。你可以也把它放在一個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
的格局。
如果你想以明確的方式將功能結合到一類,考慮設計這樣的類:
在OOP中,通常建議您避免可能的情況下使用全局函數。如果你想要一個靜態函數,我會把它放在一個單獨的類中。