[英]Liskov Substitution Principle and Redundant Methods
我有一个称为IRepository的接口。 该接口定义了一组通用方法,例如:
IQueryable<T> Get<T>() where T : class;
void Add<T>(T obj) where T : class;
void Update<T>(T obj) where T : class;
void SaveChanges();
然后,我有一个实现此接口的类。 此类实际上使用Entity Framework来实现这些方法。 但是,由于实体框架跟踪对检索到的实体所做的更改,因此方法更新是多余的,因此我只获取所需的实体,对其进行更新,然后调用SaveChanges。 但是在将来,我可能想用其他方法代替此IRepository的具体实现。 可能不会像实体框架那样跟踪更改。 所以我在想将update方法保留在接口中,但是在我对该接口的具体实现中,只是将方法保留在其中但什么也不做。 例如
public void Update<T>(T obj) where T : class
{
}
这似乎符合Liskov替代原则,我可以用其他方法代替接口的实现。 只是可能不一定需要实际实现接口上定义的所有方法。
这是一个好方法。 我当时认为还可以,甚至在IRepository的实现中将该方法标记为过时,说明为什么在此实现中过时了。
拥有一个不执行任何操作的update方法,并在整个应用程序中调用此方法似乎有点奇怪,即使它实际上并未执行任何操作。 但是,如果我们将IRepository的实现更改为确实需要更新方法的实现,则可以用它代替不需要任何代码更改。
恕我直言,在大多数情况下都没有实现的接口方法告诉我接口的范围太宽。
您可以从基本存储库界面中删除更新方法,并将其单独添加到从基本接口继承的IUpdatableRepository中。 然后,需要更新的具体类可以实现IUpdatableRepository接口。
这可能不完全是您想要的,但是您明白了……
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.