2009-03-02 28 views
1

假設你有一個類照片:最好的地方值

class Photo 
{ 
    public string Title {get; set;} 
    public string FileExtension {get; set;} 
    public void Save() 
    { 
    // Save to backing store here 
    } 
} 

這將是檢查是否值已正確設置的最佳場所。在屬性設置器或Save方法中。

編輯:如果它是更新方法呢?如果通過PhotoManager添加照片,使用類似PhotoManager.Add(Photo p)的方法,那麼最適合做驗證的地方。

親切的問候,

+0

「設置正確」是什麼意思?請定義「正確」。 – 2009-03-02 12:26:14

+0

正確設置,防止爲對象設置無效值。例如,FileExtension的「null」 – 2009-03-02 12:57:53

回答

2

不要讓您的實例陷入無效狀態:在setter中正確驗證,這就是它的存在。

2

如果這些是唯一的選項,然後在屬性setter。 Separation of concerns指示Save應該保存,而不是其他任何東西。

此外,這是屬性的美麗。它們看起來像字段,但它們可以在後臺字段中獲取和設置值的背後增強邏輯。

0

很難說這麼少的細節。如果您認爲在更新對象時處於無效狀態是有效的,那麼我會說您必須在Save方法中進行驗證。

0

如果我正確理解你的問題,你可以簡單地使用在setter和存儲方法中調用的private boolean Validate(title, fileExtension)方法。如果這個驗證是錯誤的,你可以拋出一個Exception並從那裏處理它。

0
public void Save() 
{ 
    try 
    { 
    // saving 
    } 
    catch(Exception ex) 
    { 
    MessageBox(ex.Message); // roughly 
    } 
} 

public void Save() 
{ 
    if(!IsDataValid) // !(String.IsNullOrEmpty(this.Title) && String.IsNullOrEmpty(this.Extension)) 
    { 
    throw new Exception(); //in fact you need to throw something more concrete 
    } 
    // saving 
} 

而且我可以使用:

public string Title { get; private set; } 

public string Extension { get; private set; } 

public Photo(string title, string extension) 
{ 
    this.Title = title; 
    this.Extension = extension; 
} 
1

這取決於,當你有足夠的數據來檢查正確性:如果FileExtension的正確性不依賴於Title的值和Title的正確性不取決於FileExtension的值,您可以在setters中檢查它們中的每一個。

但是,如果它們中的一個取決於對方的值,而您不知道setter的執行順序是什麼,那麼只有在獲取它們時才需要檢查Title和FileExtension。這可以在保存,或在一些新的檢查方法。

此外,也許在做之前保存您必須檢查是否標題和FileExtenstion設置。

因此,要總結,你可能需要進行以下檢查:

  • 檢查標題的正確性:在Title.set
  • 檢查FileExtension的正確性:在FileExtension.set
  • 檢查Title.set和文件擴展名。在保存
  • 檢查標題和FileExtesion的「共同correcntess」:在保存

關於更新方法:被執行設定據我所知,您會收到一個照片對象與標題和FileExtenstion已經設置。在這種情況下,您必須決定是否相信標題和FileExtension已經在照片中由設置了它們的人員檢查過。如果您信任它,您不必在上面的提案中更改任何內容。但是,如果您不信任,那麼您還必須在保存中檢查Title的正確性和FileExtension的正確性(或者,再次,在一些新的Check方法中)。