2012-09-28 64 views
0

我有一個執行資源密集型調用來填充其數據的類。標準的東西。下面是一個簡化版本...爲資源密集型設置的類進行適當設計

public class Foo1 { 
    private bool _IsLoaded; 
    private string _Prop; 
    private string _Prop2; 

    public string Prop1 { 
     get { 
      ResourceIntensiveCall(); 
      return _Prop1; 
     } 
    } 

    public string Prop2 { 
     get { 
      ResourceIntensiveCall(); 
      return _Prop2; 
     } 
    } 

    private void ResourceIntensiveCall() { 
     if ((!_IsLoaded)) { 
      // Do processing... 
      _IsLoaded = true; 
     } 
     _Prop1 = "something"; 
     _Prop2 = "stuff"; 
    } 
} 

這工作得很好,但違反了Microsoft.Design規則UsePropertiesWhereAppropriate因爲屬性正在做的工作太多了(雖然是間接的)。

我可以將調用移至構造函數,但違反了在構造函數中執行太多工作的規則。

我可以使用函數來代替屬性,但是如果你有很多函數,這會讓你覺得很麻煩。無論如何,只有第一次客戶電話才能完成真正的工作。

我可以使用客戶端代碼在訪問任何屬性前必須調用的公共Init()方法,但這是一個設計禁忌,因爲它使類太脆弱。

我曾考慮過使用Foo1Factory來新建Foo1對象並標記Foo1構造函數Internal以防止世界繞過我的工廠。

什麼被認爲是這種情況下適當的設計?

回答

0

我可以將調用移至構造函數,但違反了在構造函數中執行太多工作的規則。

無論如何,只有第一次客戶電話才能完成任何實際工作。

看到你似乎只需要做的通話一次每個實例(我的假設 - 可能是一次全過程),我會做它在構造函數中的其他選項是雪上加霜。

屬性或方法中的重複代碼違反了DRY,並且Init方法將會被某人忘記。

0

我最終什麼事做的是提取我的屬性變成DataTransferObject:

public class Foo1Return { 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

Foo1只是有,做計算並返回DTO的方法:

public class Foo1 { 
    public Foo1Return GetFoo1Results() { 
     // Do processing... 
     Foo1Return output = new Foo1Return(); 
     output.Prop1 = "something"; 
     output.Prop2 = "stuff"; 
     return output; 
    } 
} 

示例客戶端代碼:

Foo1 obj = new Foo1(); 
Foo1Results results = obj.GetFoo1Results();