2014-09-01 55 views
1

我試圖以更好的方式組織我的職能和班級。目前,我有以下的初級班(注:所有這些類有很多的性質和功能,但對於澄清起見,我把它們洗乾淨所有的距離):爲我的C#項目提供更好的班級組織

internal class Class0{ } 

internal class Class1: Class0 { } 

internal class Class2: Class1 
{ 
    List<Class1> mainDataStructure; 
} 

我上面提到的類的組織非常好,但我主要關注的是下課。

public class Class3: Class2 
{ 
    InsertClass anInstance = new InsertClass(); 

    public void Insert(Item item) 
    { 
     anInstance.mainDataStructure = mainDataStructure; 
     anInstance.Insert(item); 
    } 
} 

internal class InsertClass 
{ 
    List<Class1> mainDataStructure; 

    internal void Insert(Item item) 
    { 
     // adds item to mainDataStructure. 

     // some clean-ups using following function 
     // how to clean-up ? User will define it. 
     CleanUp(); 
    } 

    // a function that use should implement 
    // define it as: 
    internal abstract string CleanUp(); 
    // or as: 
    internal Func<string> CleanUp(); 
} 

所以,當你發現,我的問題出現了,當我試圖定義一些類(例如,Class4)操縱我的mainDataStructure。我所能做的(就像我在這裏所做的那樣)是將mainDataStructure傳遞給操縱它的類。雖然它有效,但對我來說它看起來並不高雅。我想知道是否有可能以更好的方式重組我的Class3Class4

此外,操縱mainDataStructure(例如Class4)的類有一些功能,應由最終用戶定義......我完全停留在那裏!如果我將函數定義爲abstract,則用戶必須繼承該類並在子類中定義abstract函數,或者如果我使用委託人Func<>定義它們,則用戶必須通過函數定義。這些解決方案的主要關注點是該課程的可達性水平!我高度贊同公衆只有Class3。因此,繼承是沒有問題的,對於委託,新組織應該有一種方法將功能定義從Class3傳遞到Class4

我很感謝這個項目組織的任何幫助。

分類解釋
該項目是一個信息檢索項目。 mainDataStructure存儲信息。 Class3是有點用戶界面。用戶通過獲取這個類的一個實例來開始交互;並且通過該實例做所有事情(例如,添加新的信息,檢索,統計等)。 Class4mainDataStructure添加新信息。 Class5檢索存儲信息之間的某種相似性。 Class6得到一些mainDataStructure(例如,右尾概率) 等的統計數據等等。

例:增加一個新的信息項 使用Class3的實例,並調用public void Add(Item item)。然後該方法將使用Class4的實例和它的internal void Add(Item item)方法來處理所有新項目插入過程。參見修改的上述代碼

+0

您的示例代碼不能幫助我理解您的問題,我不完全明白您要完成的任務。據我所知,你沒有通過數據結構。看來你正在設置一個屬性,然後調用一個函數來執行某些操作?嘗試閱讀關於依賴注入,控制反轉和純函數/關注分離的內容。 – AlexanderBrevig 2014-09-01 06:06:54

+0

這是有點意見我認爲,但你的問題不太清楚。想到的兩件事是接口而不是抽象,還有一些依賴注入,所以你可以將你想要的東西傳遞給類。 – Noctis 2014-09-01 06:08:19

+0

代碼組織和設計模式中的例子幾乎從來沒有ABC XYZ foobar,但從汽車,自行車,員工,客戶等方面來看,我從comp sci課程中學到了經驗。 – 2014-09-01 06:15:53

回答

1

我提出一個Factory與例如,一個Strategy

public interface MainDataStructureManipulations { 
    // define all needed functions here. 
} 

public abstract class Class3 { 
    static Class3 getInstanceWith(MainDataStructureManipulations strategy) { 
     return new Class4(strategy); 
    } 

    private Class3() {} 
} 

internal class Class4 : Class3 { 
    MainDataStructureManipulations strategy; 
    public Class4(MainDataStructureManipulations strategy) { 
     this.strategy = strategy; 
    } 
} 

你甚至不需要額外的Class4如果您所有的戰略需求都覆蓋着MainDataStructureManipulations


Factory是一種爲您創建對象實例的方法。最重要的是,只要它實現了工廠指定的基類,就不必確切知道這個實例是哪個類。在上面這種情況下,您不必公開Class4,庫的用戶也不會看到它,但可以與實例進行交互,就像從派生自Class3的類的任何實例一樣。

策略用簡單的方法封裝了功能。我選擇它是因爲它看起來非常適合你的描述,但我可能錯了。一個策略只是持有交互方法,如果你想存儲狀態,也許另一種模式會更合適。如果您告訴我們您真的想要做什麼,我們可以提供更詳細的建議。

+0

您的建議似乎很有趣;然而,我並不清楚,也許是因爲我不熟悉Factory和Strategy。你介意請澄清一下嗎? – Hamed 2014-09-01 06:17:18