2014-09-01 56 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