Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Oop 您应该将接口相对于其实现者放在哪个命名空间中?_Oop_Interface_Namespaces - Fatal编程技术网

Oop 您应该将接口相对于其实现者放在哪个命名空间中?

Oop 您应该将接口相对于其实现者放在哪个命名空间中?,oop,interface,namespaces,Oop,Interface,Namespaces,具体地说,当您创建接口/实现者对时,并且没有压倒一切的组织问题(例如,按照s#architecture的建议,接口应该放在不同的程序集ie中),您是否有在名称空间/命名方案中组织它们的默认方法 这显然是一个更基于观点的问题,但我认为有些人对此考虑得更多,我们都可以从他们的结论中获益。我通常做的是在我的层次结构的高层创建一个接口名称空间,并将所有接口放在其中(我不会费心在其中嵌套其他名称空间,因为这样我会得到许多只包含一个接口的名称空间) 这正是我过去所采用的方法,我没有遇到太多问题,尽管无可否认

具体地说,当您创建接口/实现者对时,并且没有压倒一切的组织问题(例如,按照s#architecture的建议,接口应该放在不同的程序集ie中),您是否有在名称空间/命名方案中组织它们的默认方法


这显然是一个更基于观点的问题,但我认为有些人对此考虑得更多,我们都可以从他们的结论中获益。

我通常做的是在我的层次结构的高层创建一个接口名称空间,并将所有接口放在其中(我不会费心在其中嵌套其他名称空间,因为这样我会得到许多只包含一个接口的名称空间)


这正是我过去所采用的方法,我没有遇到太多问题,尽管无可否认,这可能会让坐在我的项目中的其他人感到困惑。我很好奇其他人会做什么。

我通常将接口与具体类型保持在同一名称空间中

但是,这只是我的观点,名称空间布局是非常主观的

Animals
|
| - IAnimal
| - Dog
| - Cat
Plants
|
| - IPlant
| - Cactus

通过将一个或两个类型移出主名称空间,您并不会真正获得任何好处,但您确实需要添加一个额外的using语句。

答案取决于您的意图

  • 如果您打算让名称空间的使用者在具体实现上使用接口,我建议您的接口位于顶级名称空间,而实现位于子名称空间
  • 如果使用者要同时使用这两个名称空间,请将它们放在同一名称空间中
  • <> LI>如果接口主要是专门用途的,比如创建新的实现,考虑将它们放在子命名空间中,如设计或组件模型。
我肯定还有其他选择,但与大多数名称空间问题一样,这取决于项目的用例及其包含的类和接口。

(.Net)我倾向于将接口保留在单独的“公共”中因此,我可以在多个应用程序中使用该接口,更常见的是,在我的应用程序的服务器组件中使用该接口

关于名称空间,我将它们保存在BusinessCommon.Interfaces中


我这样做是为了确保我和我的开发人员都不会直接引用实现。

以某种方式分离接口(Eclipse中的项目等)因此,只部署接口很容易。这允许您提供外部API而不提供实现。这允许依赖项目使用最少的外部进行构建。显然,这更适用于较大的项目,但这一概念在所有情况下都很好。

我更喜欢保留我的接口和实现类别在可能的情况下,我为实现类提供内部可见性并提供工厂(通常以静态工厂方法的形式委托给工人类,内部方法允许友元程序集中的单元测试替换生成存根的其他工人)当然,如果具体类需要是公共的——例如,如果它是一个抽象基类,那么这很好;我看不出有任何理由在它自己的命名空间中放置ABC


另一方面,我非常不喜欢.NET的惯例,即在接口名称前面加上字母“I”。(I)Foo接口模型不是ifoo,它只是一个Foo。那么为什么我不能直接称它为Foo呢?然后我会具体地命名实现类,例如AbstractFoo、MemoryOptimizedFoo、SimpleFoo、StubFoo等。我通常将它们分为两个独立的程序集。接口的一个常见原因是要有一系列的对象软件的某些子系统也是如此。例如,我的所有报表都实现了IReport接口。IReport不仅用于打印,还用于预览和选择每个报表的各个选项。最后,我有一个IReport集合,用于用户选择哪些报表(和配置选项)的对话框他们想要印刷

报告驻留在单独的程序集中,IReport、预览引擎、打印引擎、报告选择驻留在各自的核心程序集中和/或UI程序集中

如果使用Factory类返回报表程序集中可用报表的列表,则使用新报表更新软件只需将新报表程序集复制到原始报表程序集上即可。您甚至可以使用反射API仅扫描任何报表程序集中的程序集列表,并构建包含新报表的报表列表嗯

你也可以将这种技术应用到文件中。我自己的软件运行一台金属切割机,所以我们将这种想法用于我们与软件一起销售的形状和配件库


同样,实现核心接口的类应该驻留在一个单独的程序集中,以便您可以将其与软件的其余部分分开更新。

我讨厌在同一名称空间/程序集中发现接口和实现。请不要这样做,如果项目不断发展,重构将是一件痛苦的事情

当我引用一个接口时,我想实现它,而不是得到它的所有实现

我可以接受的是将接口与其依赖类(引用接口的类)放在一起

EDIT:@Josh,我刚刚读了我的最后一句话,它让人困惑!当然,依赖类和实现它的依赖类都引用了接口。为了让我自己清楚,我将举几个例子:

可接受:

namespace A;

   Interface IMyInterface
   {
       void MyMethod();
   }

namespace A;

   Interface MyImplementing : IMyInterface
   {
       public void MyMethod()
       {
           Console.WriteLine("hello world");
       }
   }
接口+实现:

namespace A;

   Interface IMyInterface
   {
       void MyMethod();
   }

namespace A;

   Interface MyDependentClass
   {
       private IMyInterface inject;

       public MyDependentClass(IMyInterface inject)
       {
           this.inject = inject;
       }

       public void DoJob()
       {
           //Bla bla
           inject.MyMethod();
       }
   }
实现类:

namespace B;

   Interface MyImplementing : IMyInterface
   {
       public void MyMethod()
       {
           Console.WriteLine("hello world");
       }
   }
不可接受:

namespace A;

   Interface IMyInterface
   {
       void MyMethod();
   }

namespace A;

   Interface MyImplementing : IMyInterface
   {
       public void MyMethod()
       {
           Console.WriteLine("hello world");
       }
   }
请不要为您的接口创建项目/垃圾!例如:ShittyProject.interfaces。您没有抓住要点

假设您创建了一个为接口保留的DLL(200 MB)。