我担心我添加了太多的接口

big*_*mac 20 c# oop interface

我正在构建我的域模型并继续重构它.像我一样,我发现我喜欢接口,因为它允许我根据接口为具体类型创建可重用的方法/控制器/视图.但是,我发现每次向其中一个域实体添加新属性时都会创建一个接口.

例如,我有一个MemberStatus对象,它继承自一个抽象的Entity对象,该对象又实现了IIdentifiableEntity接口,这意味着它具有Id属性.MemberStatus还实现了INamedEntity接口,这意味着它具有Name属性,IOrderedEntity接口意味着它具有DisplayOrder属性,IHasMembers接口意味着它具有集合成员对象.这是代码:

public class MemberStatus : Entity, INamedEntity, IOrderedEntity, IHasMembers
{
  public string Name { get; set; }
  public float DisplayOrder { get; set; }
  public ICollection<Member> Members { get; set; }
}

public abstract class Entity : IIdentifiableEntity
{
  public int Id { get; set; }
}

public interface IIdentifiableEntity
{
  int Id { get; set; }
}

public interface INamedEntity
{
  string Name { get; set; } 
}

public interface IOrderedEntity
{
  float DisplayOrder { get; set; }
}

public interface IHasMembers
{
  ICollection<Member> Members { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,这似乎工作正常,因为其他类似的对象,如MemberPositionMemberTeam都实现了这些相同的接口,我可以使用我的存储库方法和控制器操作与泛型实现这些接口,并有大量的代码重用.

但是,我担心的是每次向具体对象添加新属性时是否继续添加简单的单属性接口是合适的.例如,假设我想添加一个bool Enabled属性......我应该继续创建一个IEnabled接口吗?我问的原因是一些使用泛型的控制器"初始化器"变得非常长,如下面的代码行所示.这是正常的,最好的做法吗?

public abstract class OrderedCrudController<TEntity> : CrudController<TEntity> where TEntity : Entity, INamedEntity, IOrderedEntity, IHasMembers, new()
Run Code Online (Sandbox Code Playgroud)

Col*_*inE 19

你使用接口的事实是一件好事.但是,您应该问自己,如果我创建一个IEnabled界面,我是否会仅通过该界面引用我的类?即,是否存在我与我的班级互动纯粹通过界面暴露的单一属性的上下文?

此外,您是否可以考虑将与此IEnabled接口的多个实现进行交互的上下文?

如果这两个问题的答案都是"否",那么界面的用途很少.

话虽如此,请不要过于担心!它的伤害很小.


Igb*_*man 15

不要创建您不希望迫切需要的接口.观察YAGNI(你不需要它)的原则.否则你将遇到不必要的复杂代码.