簡體   English   中英

重構:嵌套類還是單獨的類?

[英]Refactoring: Nested class or separate classes?

我目前正在對某些框架類進行一些重構(+添加新功能)。 情況是,我們有一個單一的(類神)類,它執行一堆我們想拆分的邏輯。 該類表示類似財務代碼的驗證規則的內容。 因此,它會驗證人的姓名,生日等。

我要做的是將其分成單個規則,基本上是一個規則,該規則可根據財務代碼驗證該人的名字,另一個規則用於驗證生日,依此類推。 對於程序員來說,最后看起來幾乎是一樣的。 他將執行FiscalCode.GetRules(...)然后在此處傳遞參數,而不是調用FiscalCode規則的龐大構造函數。 然后, GetRules(...)將在內部構造單個規則,並將其作為數組傳遞回去。 這對我們來說是完全正確和正確的。

您的背景非常重要。 現在,我的問題如下。 FiscalCode類(這是我們當前最強大的神類)具有許多實用程序方法,我將要創建更多的單個“規則類”。 我所知道的是,我仍然需要FiscalCode類來執行GetRules(...)事情(這對於程序員來說是保持不變的,而不是他們必須做一個全新的事情)。

我想到兩個選擇:

  1. 創建我的新規則類並訪問FiscalCode類的公共靜態實用程序方法
  2. 創建我的新規則類作為FiscalCode類的內部嵌套類,因為我已經訪問了實用程序方法(因此無需公開我的實用程序方法)

我已經很喜歡,但我想先聽聽你們中一些人的意見。

謝謝

當您的方法成為“實用方法”時,您需要使它們成為靜態和公共的,但可能需要將FiscalCode重命名為FiscalCodeUtil。 因此,很明顯它包含哪種方法。

我還建議對規范模式進行回顧,該規范為如何處理此類問題提供了一些指導。 這篇文章還提供了一些C#示例。

建議的規范模式將引導您轉向選擇#1。

這些實用程序方法對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM