Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口应该有多严格(一个好的接口设计)_C#_Interface_Dependency Injection - Fatal编程技术网

C# 接口应该有多严格(一个好的接口设计)

C# 接口应该有多严格(一个好的接口设计),c#,interface,dependency-injection,C#,Interface,Dependency Injection,我不确定这是否适用于StackOverflow,或者更确切地说,适用于StackOverflowProgrammers@StackExchange. 如果这是我的建议,请在下面的评论中告诉我,我将提出动议:) 无论如何,回到正题。我从来没有使用接口和构造函数/属性依赖注入等进行过太多编程,所以我对它知道得太多了。我主要阅读了一些文章,发现这是一种使我的软件更加灵活和可测试的有趣技术。 因此,我开始重构一个现有的应用程序(C#),我遇到了一个难题,下面两个选择中哪一个更好: 选项1功能中的最低依赖

我不确定这是否适用于StackOverflow,或者更确切地说,适用于StackOverflowProgrammers@StackExchange. 如果这是我的建议,请在下面的评论中告诉我,我将提出动议:)

无论如何,回到正题。我从来没有使用接口和构造函数/属性依赖注入等进行过太多编程,所以我对它知道得太多了。我主要阅读了一些文章,发现这是一种使我的软件更加灵活和可测试的有趣技术。
因此,我开始重构一个现有的应用程序(C#),我遇到了一个难题,下面两个选择中哪一个更好:
选项1功能中的最低依赖性要求。为构造函数留下一些注入(使用接口时的实现决策)

选项2-函数调用中所有必需的依赖项

public interface IDriver
{
    bool Start();
    bool Stop();
    bool Read(ISettings settings, uint[] signal1, uint[] signal2);
}

public class MyDriver : IDriver
{
    //implementation of the interface
}
现在选择2可能是错误的,对吗?因为有些实现实际上可能不需要ISetting来工作。我的IDriver实现目前使用ISettings这一事实并不意味着它将在一年左右的时间内实现,因此合乎逻辑的方法是使用方法1

所以我的问题是:我的接口应该严格到什么程度,如何避免在接口和实现之间混淆?我不希望实现影响我设计接口的方式。
还有,有人知道关于这个话题的好文章吗


谢谢。

除了严格,这是一个合同必要性的问题

您的读取功能是否需要iSetting?可能没有

可以认为它与signal1和signal2变量没有什么不同。在接口的Read方法定义中使用signal1和signal2的原因是,它们是合同的一部分,并且对于接口的每个实现都是必需的,可以用作输入

但是ISettings听起来像是一个特定的实现需要的东西,而其他一些则不需要。(如记录器、缓存管理器、存储库等)


所以你是对的,通常情况下,方法1会更好。它使界面保持干净,仅限于精确的合同输入/输出。

对系统需求的深入研究解决了许多问题,并帮助您更有信心地设计应用程序。所以,首先,你要想得越来越多,直到你能对你要做的事情进行辩论和推理为止

其次,两种方法都可以。正如“拉贾”所指出的,第一个是干净和成功的,我不再重复他所说的。但是考虑一下这种情况:如果以后的代码> IDRiver 需要实现某种程度的配置。然后,将某种设置传递给它们可以解决许多问题。即使目前您认为这是不必要的(我承认这是原则所说的),您也可以提供空设置():


接口应由使用接口的客户端定义和拥有。如前所述,“客户端[…]拥有抽象接口”(第11章)。因此,如果客户仅要求此项工作(您的选项1):


那就应该是接口了。其他一切都是一个实现细节,应该放在构造函数中。

感谢这本书的链接,我可能真的会买它:)感谢您的输入,这就是我所想的-如果我使用接口,这是减少耦合的其他原因之一。感谢您的输入。+1用于回复答案,但是-1您需要投票选出有用的答案(出于很多原因),来吧!
public interface IDriver
{
    bool Start();
    bool Stop();
    bool Read(ISettings settings, uint[] signal1, uint[] signal2);
}

public class MyDriver : IDriver
{
    //implementation of the interface
}
public Driver : IDriver
{
   public bool Read(ISettings settings, uint[] signal1, uint[] signal2)
   {
      if (settings.PreventSomeThing)
      {
         .....
      }

   }
}

public NullSetting : ISetting
{
   public bool PreventSomething = false;   
   ....
}
public interface IDriver
{
    bool Start();
    bool Stop();
    bool Read(uint[] signal1, uint[] signal2);
}