2011-11-23 492 views
0

的做法我有一個叫'documentsection'的類,它定義了稍後在HTML中組裝的文檔的一部分。其中包含屬性,以及哪些值是必需的(或有效的)相互依賴。例如:正確的OOP類邏輯的邏輯

a)有一個名爲'section type'的枚舉可以是'view'(在這種情況下,另一個名爲'content'的屬性包含要讀入的文件的路徑/文件名)。或者它可以是「文本」,其中「內容」屬性文本本身被放置在文檔中。

b)另一個名爲'Action'的枚舉類型可以是'append','prepend'或'replacebytag'類型。在最後一種情況下,另一個屬性變得相關,稱爲「tagtoreplace」。如果我們添加/預先添加,則此tagtoreplace屬性可以爲空。

表示這種相互依賴關係的最佳實踐方式是什麼?有幾種方法我能想到的,其中沒有一個美容臭氣:

  • 當調用「生成文檔」的方法,經過屬性,以確保它們符合這一邏輯。

  • 將檢查置於get/set方法中。與此相關的一個問題是,當我將節類型設置爲「查看」時,我可能不會將「內容」屬性設置爲之後的一行或多行 - 因此您無法拒絕在此時設置它的請求。

  • 以某種方式使用不同的屬性來劃分用途 - 例如上面第一個示例中的'content'不應該用於一種情況下的文件路徑和另一種情況下的一堆HTML內容。這對我來說並不適合,但每個人都有不同的屬性似乎過分。

  • 繼承子類,每個子類都具有不同的額外所需屬性集。由於節類型和動作類型可以有各種組合,所以我想不出一種優雅的方式來將所有這些邏輯都燒成這種結構。但我不是OOP大師!

有關最佳方法的任何想法?

謝謝!

+0

我認爲有一個屬性,它的含義取決於另一個不聞的權利。 – svick

+0

我同意 - 問題是,什麼是最好的實踐方式來實現b)項的功能/在需求)和? – Glinkot

回答

2

我會去用以下方法:

interface ISection 
{ 
    void Render(); // or String Render() if you want to return a string 
} 

class ViewSection : ISection 
{ 
    public String Filename { get; set; } 

    public void Render() 
    { 
     // do stuff with Filename and/or return the content of the file 
    } 
} 

class TextSection : ISection 
{ 
    public String Text { get; set; } 

    public void Render() 
    { 
     // do stuff with Text and/or return it 
    } 
} 

class DocumentSection 
{ 
    ISection _section; 

    public void Render() 
    { 
     _section.Render(); 
    } 
} 

然後,您可以輕鬆地創建實施ISection是提供額外的節新類。對於「操作」也是如此,請定義一個IAction接口,並使用您調用的某種RenderPerformAction方法。

+0

我同意。感謝codecaster。 – Glinkot

1

設置屬性不應該對其他屬性產生副作用。

如果您要這樣做,您應該使用一種方法來一次設置所有內容。

+0

我認爲這是一個正確的觀點 - 我正在考慮是具有一組參數化構造函數只允許指定正確的套細節的其他選項。 – Glinkot

0

如果一個屬性是用於文件路徑的,那麼這就是它的意思。如果它是用於內容的,那就是它的意思。當一個財產可以代表兩個不同的事物時,就會發生混淆和錯誤。

我認爲你需要子類。看看abstract factory pattern作爲管理類的創建的一種方式。

+0

謝謝你。我同意每個財產的一個目的的概念,並且子類化可能就是這樣。 – Glinkot

1

我會從文件生成自身獨立的HTML生成。有用於定義文檔的類,然後使用其他類來生成文檔的每個部分。通過這樣做,你可以輕鬆地添加新的格式後(或更容易或者測試文檔建築物或HTML生成)

一)有一個名爲「部分類型」的枚舉它可以是「視圖」(在這種情況下, ,另一個名爲'content'的屬性包含要讀入的文件的路徑/文件名)。或者它可以是「文本」,其中「內容」屬性文本本身被放置在文檔中。

類型屬性通常都是一個設計的氣味。 有一個Section類,您可以爲每種類型的部分派生類。然後只需添加正確的派生類。

b)中有一個稱爲「操作」另一枚舉其可以是類型爲「追加」,「前置」或「replacebytag」。在最後一種情況下,另一個屬性變得相關,稱爲「tagtoreplace」。如果我們添加/預先添加,則此tagtoreplace屬性可以爲空。

我不是跟你如何使用action屬性清晰。

+0

感謝那個jgauffin。 – Glinkot