【问题标题】:Should extension methods only be used on classes whose code you don't have access to?扩展方法是否应该仅用于您无权访问其代码的类?
【发布时间】:2011-07-26 03:59:36
【问题描述】:

扩展方法是否应该只用于您无权访问其代码的类?

我正在努力想出一个理由来拥有扩展方法而不是使其部分化并将类添加到外部文件中。

我的具体场景如下:我有通过 EF 表示数据库中实体的类。我正在辩论使其呈现部分的类并添加我自己的方法。扩展方法是更有效的替代方法,还是不打算在您可以访问要扩展的类的代码时使用?

【问题讨论】:

  • 当你想为一个可以在多个类中实现的接口添加功能时怎么办? (想到 IEnumerable)
  • 如果你同时拥有(有些类没有源代码,有些类有源代码)和/或你想要实现的一些相当“通用”的功能,并且也可以在其他类上使用,那么将其作为扩展方法实现是一个好事...直接添加方法(当您有权访问时)会更改该类的接口,这并不总是一件好事,尤其是。在从事不同团队使用该类的大型项目时

标签: c# .net extension-methods


【解决方案1】:

典型的反例是接口上的扩展方法,因为即使您控制源,也没有实现。请参阅:Linq。

但是,是的,一般来说,如果你控制了具体类的来源,那么期望直接将功能添加到类而不是使用扩展方法,如果它对实际的功能有意义的话,这并不是不合理的。成为类实例的一部分。

另一方面,回到你的情况,你可能不会考虑这两种方法。您的实体是数据模型,我不会在这些模型中添加 方法,而是在其他地方封装该功能。这些模型的存在是为了封装您的数据,可能使用或反对该数据的逻辑可能在不同的单元中得到更好的服务。但这实际上取决于您的方法正在做什么,并且还假设它们不是一个或多个属性的简单包装器。

【讨论】:

    【解决方案2】:

    除了提供接口扩展的能力之外,我还使用扩展方法将“成员”添加到仅使用类的公共接口工作的类中。因此,如果一个方法需要访问一个私有/受保护的成员,它将成为一个类成员,如果不是扩展方法的话。这使课程本身保持小而专注......

    【讨论】:

      【解决方案3】:

      没有。

      您的课程可能在 90% 的项目中都能正常工作。通过添加扩展方法,您不会“污染”原始类,但仍可以在其他 10% 的项目中利用它。

      【讨论】:

        【解决方案4】:

        扩展方法是否应该只用于您无权访问其代码的类?

        不一定。在某些情况下,扩展方法仍然可以提供帮助。我最近遇到了 xml 序列化程序的问题,它可以序列化一个对象,该对象具有使用 linq / lamba 表达式的方法。将方法移动到扩展方法解决了那个。我也喜欢在 DTO 上使用扩展方法。

        【讨论】:

          【解决方案5】:

          您可能想查看How Non-Member Functions Improve Encapsulation。有一些 C++ 细节,但主要思想也适用于其他 OO 语言。简而言之:类中的方法越少,就越容易了解谁以及如何更改私有类状态。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-10
            • 1970-01-01
            相关资源
            最近更新 更多