编写高质量代码改善C#程序的157个建议——建议111:避免双向耦合
2015-08-21 17:49
295 查看
建议111:避免双向耦合
双向耦合是指两个类型之间相互引用。下面的代码是一种典型的双向耦合:
双向耦合在同一项目下,不会存在太多的问题,带来的只是设计问题。不过,如果两个类在不同的项目中时,就必须考虑解耦了,因为.NET不允许项目之间相互引用。如果尝试两个项目相互引用将出现错误提示。
常见的解耦方式就是提炼出一个接口。如果A、B类型分别在两个项目中,则提炼出来的接口要放在新起的项目中,然后让A、B所在的两个项目分别引用这个接口所在的项目。
解耦后的代码如下所示:
接口ISample规范了类型A的行为,同时让类型A继承自ISample。在类型B中,我们针对接口编程,也就是说,在B中的字段a不再是A类型,而是将其修改为ISample类型。
一般来说,类型之间不应该存在双向耦合,如果有此类情况出现,则应该考虑重构。有一些第三方的框架都支持对项目进行解耦,如微软企业库(Enterprise Library)中的Unity和Spring.NET。在实际的编码中,可以考虑使用这些框架设计我们的项目。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
双向耦合是指两个类型之间相互引用。下面的代码是一种典型的双向耦合:
class A { private B b; public void MethodA() { b.MethodB(); } } class B { private A a; public void MethodB() { a.MethodA(); } }
双向耦合在同一项目下,不会存在太多的问题,带来的只是设计问题。不过,如果两个类在不同的项目中时,就必须考虑解耦了,因为.NET不允许项目之间相互引用。如果尝试两个项目相互引用将出现错误提示。
常见的解耦方式就是提炼出一个接口。如果A、B类型分别在两个项目中,则提炼出来的接口要放在新起的项目中,然后让A、B所在的两个项目分别引用这个接口所在的项目。
解耦后的代码如下所示:
interface ISample { void MethodA(); } class A : ISample { private B b; public void MethodA() { b.MethodB(); } } class B { ISample a; public void MethodB() { a.MethodA(); } }
接口ISample规范了类型A的行为,同时让类型A继承自ISample。在类型B中,我们针对接口编程,也就是说,在B中的字段a不再是A类型,而是将其修改为ISample类型。
一般来说,类型之间不应该存在双向耦合,如果有此类情况出现,则应该考虑重构。有一些第三方的框架都支持对项目进行解耦,如微软企业库(Enterprise Library)中的Unity和Spring.NET。在实际的编码中,可以考虑使用这些框架设计我们的项目。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
相关文章推荐
- C#中的重写和覆盖的区别
- C# foreach 中获取索引index的方法
- 编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
- C#中抽象类与接口的区别
- 编写高质量代码改善C#程序的157个建议——建议109:谨慎使用嵌套类
- Csharp: create word file using Open XML SDK 2.5
- C# 学习笔记(一) -- 基本语法
- C#实现多线程下载文件的方法
- 编写高质量代码改善C#程序的157个建议——建议108:将类型标识为sealed
- vs2013 c# 中调用 c 编写的dll出错的可能错误
- 编写高质量代码改善C#程序的157个建议——建议107:区分静态类和单例
- 实现单例模式C#版本
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
- c#用户控件的生命周期
- c#方法重载,可选参数,命名参数。
- c#方法重载,可选参数,命名参数。
- 记一次C#的web模拟登录抓取
- C#如何获取服务器时间
- 在C#中调用格式工厂进行任意视频格式到FLV的转换
- c#**************