2014-02-17 28 views
1

我有一些集成(如Salesforce),我想隱藏在與產品無關的包裝(如CrmService類而不是SalesforceService類)後面。創建包裝來隱藏數據結構的實現細節

看起來很簡單,我可以創建一個CrmService類並使用SalesforceService類作爲CrmService中的實現細節,但是,存在一個問題。 SalesforceService使用一些例外和枚舉。如果我的CrmService拋出SalesforceException或者您被要求使用Salesforce枚舉,那將會很奇怪。

任何想法如何我可以完成我想幹淨的?

編輯:目前爲例外情況,我趕上Salesforce之一,並拋出我自己的自定義之一。雖然我不確定我應該爲枚舉做些什麼。我想我可以將Salesforce枚舉映射到我自己的與提供者無關的列表,但我正在尋找一種通用解決方案,可能比必須執行此映射更清晰。如果這是我的只有選項(來映射它們),那麼沒關係,只是試圖獲得想法。

+1

難道你不能只抓住SalesForceExceptions並拋出自己的自定義異常? – Nick

+0

@Nick yup,關於枚舉的任何想法雖然? 編輯:btw,生病編輯我的問題說,這是我目前正在做的例外。我希望有一個更好的方法來設計這個一般。 – tau

+2

不幸的是,除了映射枚舉之外,我沒有任何建議。不是最漂亮的,不是,但它有效。 – Nick

回答

1

簡短的回答是,你在正確的軌道上,有一個通過Law of Demeter通讀。

的基本概念是,給定對象應承擔的 越少越好關於結構或別的 (包括其子組件)性質,按照 「信息隱藏」的原則。

德米特法則的好處是,由此產生的 軟件往往是更易於維護和適應性。由於對象 較少依賴於其他對象的內部結構,因此可以更改對象容器,而無需重新調用其調用者。

雖然它也可能導致必須寫很多包裝 方法傳播調用組件;在某些情況下,這可能會增加明顯的時間和空間開銷。

所以你看到你正在遵循一個很好的練習,我一般會遵循自己的做法,但這需要付出一些努力。

是的,你將不得不趕上並拋出你自己的例外情況,並映射枚舉,請求和響應,它有很多前期工作,但如果你在幾年內必須更換Salesforce,那麼你將被視爲英雄。

與所有軟件開發一樣,如果您認爲您可能永遠不會更換銷售團隊,您需要付出努力與獲得的收益相比較?那真的需要嗎? ...爲你決定。

+1

我同意你的建議 – tau

1

要利用好OOP的做法,我想創建一個小接口ICrm與您所有的CRM的具有共同的基本成員。該界面將包括典型的方法,如MakePayment(),GetPayments(), CheckOrder()等。另外創建您需要的Enums,例如OrderStatusErrorType

然後創建並實現您實現界面的特定類,例如class CrmSalesForce : ICrm。在這裏,您可以將具體的細節轉換爲特定的CRM(在這種情況下爲SalesForce)到您的通用ICrm。如果必須(http://msdn.microsoft.com/en-us/library/kxydatf9(v=vs.110).aspx),枚舉可以轉換爲字符串,反之亦然。

然後,作爲最後一步,創建CrmService類,並在它依賴注入http://msdn.microsoft.com/en-us/library/ff921152.aspx)使用,就是這樣,通過一個類型的ICrm作爲其構造函數的參數(或方法,如果你喜歡)。這樣,您可以保持您的CrmService類的內聚性和獨立性,因此您可以創建和使用不同的Crm,而無需更改大部分代碼。

+0

我在其他地方使用這種模式,但在我們的應用程序已經安裝的情況下,它不適合在這裏。儘管謝謝你的建議! – tau