扩展方法应该只用于那些你不能访问的代码的类吗?
本文关键字:访问 代码 不能 方法 只用于 那些 扩展 | 更新日期: 2023-09-27 18:03:36
扩展方法是否应该仅用于您无法访问其代码的类?
我正在努力想出一个有扩展方法的理由,而不是使它成为部分并在外部文件中添加类。
我的具体场景如下:我有通过EF表示数据库中的实体的类。我正在考虑让它呈现的类是局部的,并添加我自己的方法。扩展方法是一种更有效的替代方法,还是当您可以访问正在扩展的类的代码时不打算使用它们?
典型的反例是接口上的扩展方法,因为即使您控制了源代码,也没有实现。看:Linq .
但是,是的,一般来说,如果您控制了具体类的源,那么期望直接向类添加功能而不是使用扩展方法并不是不合理的,如果功能实际上是类实例的一部分是有意义的。
另一方面,回到你的情况,你可能会考虑两种方法。您的实体是数据模型,我不会向这些模型添加方法,而是将该功能封装在其他地方。这些模型的存在是为了封装数据,使用或反对该数据的逻辑可能在不同的单元中得到更好的服务。但这实际上取决于你的方法在做什么,并且假设它们不是对一个或多个属性的简单包装,例如
除了提供接口扩展的能力之外,我还使用扩展方法向仅使用类的公共接口工作的类添加'成员'。因此,如果一个方法需要访问私有/受保护的成员,它将成为类成员,如果不是扩展方法的话。
No.
你可能有一个类在你90%的项目中工作得很好。通过添加扩展方法,您不会"污染"原始类,但仍然可以在其他10%的项目中利用它。
扩展方法应该只在你不能访问的类上使用吗?
不一定。在某些情况下,扩展方法仍然可以提供帮助。我最近遇到了xml序列化器的一个问题,它可以序列化一个对象,该对象有一个使用linq/lamba表达式的方法。将方法移动到解析的扩展方法。我也喜欢在dto上使用扩展方法
您可能想看看非成员函数如何改进封装。有一些c++的细节,但主要思想也适用于其他OO语言。简而言之:类中的方法越少,就越容易理解谁以及如何更改私有类状态。