【问题标题】:Would you implement an interface for 1 class or 2 interface for 2 classes你会为 1 个类实现一个接口还是为 2 个类实现 2 个接口
【发布时间】:2012-07-15 09:42:23
【问题描述】:

当你看到这个接口时,你会把它分成 2 个接口和 2 个具体类吗? 或者你会创建 1 个接口和 1 个类。

对我来说,为 2 个方法创建另一个接口和类似乎是一种开销,但是很好......

另一个想法如何处理这种情况?

public interface IUnitDataProvider
{
        // Testplan methods
        IEnumerable<Unit> GetTestplanRootUnits(int templateId, int testplanId);        

        // Template methods
        IEnumerable<Unit> GetTemplateRootUnits(int templateId);
        void AddUnit(Unit unit);
        void DeleteUnit(int unitId);
        bool UnitExists(string unitName, int templateId);

        // Mutual methods
        IEnumerable<Unit> GetChildrenUnits(int templateId, int parentId);
}

【问题讨论】:

  • 将另一个接口视为开销是新事物
  • 您应该根据应用程序设计的需要创建尽可能多的接口——就这么简单。
  • 是的,但这是不久前的事了。感谢 Oded 的提醒。

标签: c# class interface


【解决方案1】:

您应该提出一个问题“为什么我们需要将接口拆分为 2 个单独的类和 2 个具体类”。但是,如果它使您了解业务逻辑,则可以这样做。

从软件度量的角度来看,您拥有的凝聚力越强,您获得的类设计就越强大。有许多论文证明了这个假设。你可以参考这个链接Introduce contents of cohesion metric

在你的情况下,我认为你应该把它分成两个接口来处理模板测试和测试计划。

【讨论】:

  • @你会把相互的 GetChildrenUnits 方法放在哪里?在每个接口中执行代码 2 次?没有...
【解决方案2】:

您应该为您必须面对的每个问题创建一个接口,并为您为此类问题创建的每个解决方案创建一个类。我将实现 IUnitDataProvider 的类实现为facade,通过更多的接口和类在内部解决问题。但是对于外观,您的界面似乎是正确的。我看到的唯一问题是,如果 TestPlan (和 GetTestplanRootUnits )冷藏到您的测试用例,我认为将它放在“域”接口中不是一个好主意。可以将测试用例所需的东西放在问题域的接口或类中,只要您需要的东西确实存在并且在问题域中本身就有意义,在忘记测试需要它之后。如果您在问题域中找不到它,并且找不到不包含 Test something 的名称,那么您可能应该考虑该事物存在于哪个问题域中,并为它创建另一个接口和类您正在解决该领域的问题。

【讨论】:

  • 一个外观将几种方法的复杂性/细节捆绑到一个方法中。这种模式与我的问题有什么关系?
  • 据我所知,我认为你的问题太大了,一个班级无法完全解决。您似乎有一种 CRUD 的单位,它支持其中的某种树。我认为这对于单个班级来说太过分了。
  • 您也有同样的问题:您会将相互的 GetChildrenUnits 方法放在哪里?在每个接口中执行代码 2 次?没有...
  • 你能解释一下你在做什么的整个背景吗?你在解决什么“现实生活中的问题”?
  • 噗……这需要时间。您是否需要对技术问题进行真实的描述?你可以说为相互实现创建一个 UnitBaseDataProvider 类。
猜你喜欢
  • 2014-09-16
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多