为我的C#项目提供更好的类组织

时间:2014-09-01 05:59:16

标签: c# class code-organization

我试图以更好的方式组织我的功能和课程。目前我有以下主要类(注意:所有这些类都有很多属性和功能,但为了澄清,我将它们全部清除掉):

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。因此,继承是不可能的,对于委托,新组织应该有一种方法将函数定义从Class4内传递给Class3

我感谢这个项目组织的任何帮助。

班级解释
该项目是一个信息检索项目。 mainDataStructure存储信息。 Class3是一种用户界面。用户通过获取此类的实例来开始交互;并通过该实例执行所有操作(例如,添加新信息,检索,统计信息等)。 Class4mainDataStructure添加了新信息。 Class5检索存储信息之间的某种相似性。 Class6获取mainDataStructure的一些统计信息(例如,右尾概率) 等等。

示例:添加新信息项 使用Class3的实例并调用public void Add(Item item)。然后,此方法将使用Class4及其internal void Add(Item item)方法的实例来处理所有新项目插入过程。见上面修改过的代码

1 个答案:

答案 0 :(得分: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,并且库的用户也将永远不会看到它,但是可以与实例交互,就像从{{派生的类的任何实例一样1}}。

策略使用简单方法封装功能。我选择它是因为它似乎非常适合你的描述,但我可能错了。策略只保存交互方法,如果你想存储状态,可能另一种模式更合适。如果你告诉我们你真正想做什么,我们可以提供更详细的建议。