首页 / 知识
关于c#:扩展接口模式
2023-04-12 00:39:00

Extension interface patterns.Net 3.5中的新扩展允许从接口中拆分功能。 例如在.Net 2.0中
可以(在3.5中)变为:
在我看来,这对于许多接口来说是一种更好的机制。他们不再需要抽象库来共享此代码,并且代码在功能上相同。这可以使代码更易于维护且更易于测试。 唯一的缺点是抽象库实现可以是虚拟的,但是可以解决(实例方法是否可以隐藏具有相同名称的扩展方法?这样做会混淆代码吗?) 还有其他原因不定期使用此模式吗? 澄清:
是的,我看到扩展方法的趋势是到处都有它们。我在使用.Net值类型时要特别小心,而无需进行大量同行审查(我认为我们在字符串上唯一的一个是 我认为那里有整个最佳实践辩论;-) (顺便说一句:DannySmurf,您的PM听起来很吓人。) 我在这里特别询问有关在以前我们有接口方法的地方使用扩展方法的问题。 我试图避免许多抽象基类级别-实现这些模型的类大多数已经具有基类。我认为,与添加更多的对象层次结构相比,该模型可以更易于维护,并且耦合程度更低。 MS对Linq的IEnumerable和IQueryable做了什么? 扩展方法应仅用于:扩展。任何与关键的结构/设计相关的代码或重要的操作都应放在由类或接口组成/继承的对象中。 一旦另一个对象尝试使用扩展的对象,他们将看不到扩展,可能不得不再次重新实现/重新引用它们。 传统观点认为,扩展方法仅应用于:
我认为,明智地使用扩展方法会将接口与(抽象的)基类放在更加平等的位置。
作为一个具体的示例,库的第一个版本可能会定义如下接口:
库发布后,我们将无法在不破坏当前用户的情况下修改界面。相反,在下一个版本中,我们将需要定义一个新接口以添加其他功能:
但是,只有新库的用户才能实现新接口。为了使用遗留代码,我们需要调整旧的实现,扩展方法可以很好地处理该实现:
现在,新库的所有用户都可以相同地对待传统和现代实现。
相反,可以使用扩展方法来提供简单的重载实现:
编辑:Joe Duffy的相关文章:扩展方法作为默认接口方法实现 我认为扩展方法替代的最好的东西是在每个项目中找到的所有实用程序类。 至少到目前为止,我认为任何其他扩展方法的使用都会在工作场所引起混乱。 我的两位。 我认为使用扩展方法将域/模型和UI /视图功能分开是一件好事,尤其是因为它们可以驻留在单独的命名空间中。 例如:
这种扩展方法可以与XAML数据模板类似地使用。您无法访问该类的私有/受保护成员,但是它允许在不对整个应用程序进行过多代码重复的情况下维护数据抽象。 多一点点。 如果多个接口具有相同的扩展方法签名,则需要将调用方显式转换为一种接口类型,然后调用该方法。例如。
我看到很多人主张使用基类来共享通用功能。对此要小心-与继承相比,您应该更喜欢组合。从建模的角度来看,继承应仅用于多态。它不是用于代码重用的好工具。 至于一个问题:注意这样做的局限性-例如,在所示的代码中,使用扩展方法来实现GetChildren可以有效地"密封"此实现,并且如果需要,不允许任何IHaveChildren隐式提供。如果可以,那么我不太介意扩展方法。它不是一成不变的,当以后需要更大的灵活性时,通常可以轻松地对其进行重构。 为了获得更大的灵活性,使用策略模式可能更可取。就像是:
扩展接口没有什么问题,实际上LINQ就是这样将扩展方法添加到集合类的。 话虽这么说,您仅应在需要为实现该接口的所有类中提供相同功能并且该功能不是(并且可能不应该)属于任何派生的"正式"实现的一部分的情况下,才这样做。类。如果为每种可能需要新功能的派生类型编写扩展方法是不切实际的,则扩展接口也很好。 Rob Connery(Subsonic和MVC Storefront)在其Storefront应用程序中实现了类似于IRepository的模式。这不是上面的模式,但确实有一些相似之处。 数据层返回IQueryable,它允许消费层在其之上应用过滤和排序表达式。额外的好处是,例如,可以指定一个GetProducts方法,然后在使用层中适当地决定您希望如何进行排序,过滤或什至只是特定范围的结果。 这不是传统的方法,但是非常酷,而且绝对是DRY的案例。
哎哟。请不要扩展接口。 这就是为什么总是将接口声明为类型而不是实际类的原因。
对? 如果您确实需要带有某些附加功能的合同,那么抽象类是您的朋友。
我需要解决类似的问题: 我希望这有帮助 :)
我可以看到的一个问题是,在大型公司中,这种模式会使任何人都难以理解和使用代码(如果不是不可能的话)。如果多个开发人员不断地将自己的方法添加到与这些类分开的现有类中(并且,上帝帮助我们所有人,甚至对BCL类也是如此),那么我会看到代码库很快就失去了控制。 即使是我自己的工作,我也可以看到这种情况的发生,因为我的PM希望将我们要处理的每一段代码都添加到UI或数据访问层,我完全可以看到他坚持要添加20或30种方法仅与字符串处理切线相关的System.String。 |
最新内容
相关内容
python命令模式的作用
python命令模式的作用,系统,状态,数据,衍生,培训,工作,命令,模式,操作,队列,python命令模式的作用1、队列请求命令可以运算块打包(一个接收者关于架构:不同逻辑层上的接口
关于架构:不同逻辑层上的接口,关于架构:不同逻辑层上的接口,业务逻辑,数据访问,应用程序,描述,Interfaces on different logic layers关于颜色:找出使用Office 2007风格
关于颜色:找出使用Office 2007风格的MFC功能包时正在使用的颜色,关于颜色:找出使用Office 2007风格的MFC功能包时正在使用的颜色,旧版自定义WPF命令模式示例
自定义WPF命令模式示例,自定义WPF命令模式示例,命令模式,编程,示例,都是,Custom WPF command pattern example我已经完成了一些WPF编关于不可知的语言:忽略引号部分拆分
关于不可知的语言:忽略引号部分拆分字符串,关于不可知的语言:忽略引号部分拆分字符串,算法,分割,字符串,有什么,Split a string ignori关于许可:许可模式
关于许可:许可模式,关于许可:许可模式,应用程序,职业生涯,客户,解决方案,License Models在我几乎所有的职业生涯中,我都致力于构建解决如何在Ruby中使用Singleton设计模
如何在Ruby中使用Singleton设计模式创建类?,如何在Ruby中使用Singleton设计模式创建类?,实例化,用于,设计模式,单例模式,How do I creaJava自动装箱为什么不扩展到自动装
Java自动装箱为什么不扩展到自动装箱类型的方法的方法调用?,Java自动装箱为什么不扩展到自动装箱类型的方法的方法调用?,原语,字符串,关于设计模式:什么是MVP和MVC,有什么
关于设计模式:什么是MVP和MVC,有什么区别?,关于设计模式:什么是MVP和MVC,有什么区别?,用户界面,工具,配置,设计模式,What are MVP and MVCjQuery.cssHooks的功能测试
jQuery.cssHooks的功能测试,jQuery.cssHooks,的,功能测试,Feature,Testing,, Feature Testing(功能测试) 在使供应商特定的JavaScript严格模式的限制
JavaScript严格模式的限制,JavaScript,严格,模式,的,限制,严格,模式,的,, 严格模式的限制 不允许使用未声明的变量:"use strict"JavaScript为什么使用严格模式?
JavaScript为什么使用严格模式?,JavaScript,为什么,使用,严格,模式,在,函数,内部,, 在函数内部声明是局部作用域(只在函数内使用严