2017-10-19 152 views
2

我有以下設計問題:如何將您的代碼與特定的客戶代碼分開?

我有許多面向對象的源代碼(C++),我們的客戶希望對我們的代碼進行特定的更改以適應他們的需求。這裏非常簡單的例子:

void somefunction() { 
    // do something 
} 

之後我插入了客戶的功能願望:

void somefunction() { 
    // do something 
    setFlag(5000); 
} 

這看起來沒有那麼糟糕,但我們有要設置許多自己的標誌值很多客戶代碼中的不同位置。代碼變得越來越混亂。我如何將這些客戶代碼與我的源代碼分開?有沒有設計模式?對付這種

回答

2

一種策略是拉細節「向上」從這個類的「頂」,在這裏可以設置或配置正確。

我的意思是:

  1. 獲取具體設置了之類的。將其作爲構造函數中的參數,或者創建不同的子類或類等。

  2. 使依賴於此的所有其他對象僅取決於接口,因此他們不知道這些設置或選項。

  3. 在「頂部」,方法main()或某些建造商或工廠,一切都插在一起,您可以插入特定客戶所需的確切參數或實施。

恐怕沒有(正確)的方式來重構這些類,將所有這些細節都拉到一個地方。

有解決方法,就像在所有這些地方得到的配置值,或者只是創建不同的版本不同的分支,但這些並不真正形成規模,並會導致我的經驗,維護問題。

2

這是一個非常普遍的問題,所以答案是相當普遍的。 You want your software to be open for extensions, but closed for modifications。有許多方法可以實現這種不同程度的開放性,從簡單的參數到架構級框架和模式。許多設計模式,例如Template methodStrategy處理這類問題。從本質上講,您可以插入自定義行爲,在代碼中提供掛鉤或佔位符。

在現代C++中,一些模式,或者他們與顯性課程的實施,都有點過時,可以用lambda函數,而不是替代。標準庫中也有很多例子,例如在STL容器中使用分配器。分配器讓你,作爲STL的客戶,改變內存分配和釋放的方式。

0

爲了限制不受控制的代碼編寫,您應該考慮向您的客戶公開一個強大的基類(以接口或抽象類的形式),其中一些(或全部)方法關閉以進行修改。
然後,每一個客戶將擴展基類行爲實施或繼承它。簡而言之,在我看來,每個客戶都對應一個子類CustomerA,CustomerB等等。這樣,您將劃分每個客戶編寫的代碼。
在我看來,可以修改的基類方法應該是一個非常有限的集合,或者更好的是沒有。如果可能的話,添加的行爲應該只保留在派生類中的添加方法中;通過這種方式,您將避免不可修改的方法的不受控制的修改。