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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值