zoukankan      html  css  js  c++  java
  • 编写高质量代码改善C#程序的157个建议——建议111:避免双向耦合

    建议111:避免双向耦合

    双向耦合是指两个类型之间相互引用。下面的代码是一种典型的双向耦合:

        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个建议》陆敏技

  • 相关阅读:
    百度编辑器 Ueditor使用记录
    JS实现继承的几种方式
    IOS 浏览器上设置overflow: auto 不可滚动
    throw new Error('Cyclic dependency' + nodeRep)
    如何理解springaop
    SQL连接的分类
    Eclipse创建Maven-Web项目及解决 jre版本和web.xml版本问题
    SQL的几种连接:内连接、左联接、右连接、全连接、交叉连接
    Centos7下面安装eclipse
    Centos7 下编译 Openjdk8
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4748575.html
Copyright © 2011-2022 走看看