[英]Refactoring: Nested class or separate classes?
我目前正在對某些框架類進行一些重構(+添加新功能)。 情況是,我們有一個單一的(類神)類,它執行一堆我們想拆分的邏輯。 該類表示類似財務代碼的驗證規則的內容。 因此,它會驗證人的姓名,生日等。
我要做的是將其分成單個規則,基本上是一個規則,該規則可根據財務代碼驗證該人的名字,另一個規則用於驗證生日,依此類推。 對於程序員來說,最后看起來幾乎是一樣的。 他將執行FiscalCode.GetRules(...)
然后在此處傳遞參數,而不是調用FiscalCode規則的龐大構造函數。 然后, GetRules(...)
將在內部構造單個規則,並將其作為數組傳遞回去。 這對我們來說是完全正確和正確的。
您的背景非常重要。 現在,我的問題如下。 FiscalCode類(這是我們當前最強大的神類)具有許多實用程序方法,我將要創建更多的單個“規則類”。 我所知道的是,我仍然需要FiscalCode類來執行GetRules(...)
事情(這對於程序員來說是保持不變的,而不是他們必須做一個全新的事情)。
我想到兩個選擇:
我已經很喜歡,但我想先聽聽你們中一些人的意見。
謝謝
當您的方法成為“實用方法”時,您需要使它們成為靜態和公共的,但可能需要將FiscalCode重命名為FiscalCodeUtil。 因此,很明顯它包含哪種方法。
這些實用程序方法對FiscalCode類或規則類有什么依賴性? 他們保持狀態嗎?
如果沒有任何依賴關系,我建議將這些實用程序方法移至單獨的類,並在適當的情況下將FiscalCode類或規則類調用到這些方法中。
對於您提供的選項,1)和2)之間的唯一區別是規則類對於不使用它們的類是否可見。 我認為那不是真正的重要目標。 當我使用C ++時,我一直都在擔心……那是浪費時間。
IMO,您應該選擇第一個選項,因為那樣您就可以將新創建的類公開給外界,並且可以編寫可在其他地方重用的代碼。 如果您選擇第二個選項,那么您將創建非常專業的類。 您的外部代碼甚至可能不知道它的存在,但這對於封裝很有用。 不過,在某些時候,您仍可以決定在較大類的范圍之外使用專用規則,對於這種情況,最好選擇第一種方法。 不過您選擇什么呢?
如果在FiscalCode
類之外不使用該類,則使其嵌套。 重要的是將這一新類的職責從FiscalCode
; 那么它所處的位置就變成了一個單純的選擇問題。 當新類獲得更多的依賴時,您可以將其設為外部類。
我會這樣(我不太擅長OOP,所以要加一點鹽):
規則類(嵌套在FiscalCode中)實現了一個IRule接口,該接口公開了規則方法(例如Validate(),無論返回類型如何,都會使您的船浮起)。 FiscalCode具有一個AddRule()方法,該方法管理內部規則集合並返回對self的引用,以允許方法鏈接:
FiscalCode fc = new FiscalCode();
fc.AddRule(new RuleClass1(<params specific to RuleClass1>)
.AddRule(new RuleClass2(<params specific to RuleClass2>)
...
此外,FiscalCode具有Validate()方法,該方法可循環訪問每個規則的Validate()並管理錯誤。
IMO這非常容易使用,並且仍然允許嵌套規則類訪問FiscalCode的實用程序方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.