为了账号安全,请及时绑定邮箱和手机立即绑定

什么是“松耦合”?请提供示例

什么是“松耦合”?请提供示例

12345678_0001 2019-11-05 10:23:40
我似乎无法理解“松散耦合”的概念。我想这不利于单词“宽松”通常有负面的含义,所以我总是忘了松耦合是一个很好的事情。有人可以显示说明此概念的“之前”和“之后”代码(或伪代码)吗?
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

考虑一个简单的购物车应用程序,该应用程序使用CartContents类来跟踪购物车中的项目,并使用Order类来处理购买。订单需要确定购物车中内容的总价值,它可能会像这样:


紧密耦合示例:


public class CartEntry

{

    public float Price;

    public int Quantity;

}


public class CartContents

{

    public CartEntry[] items;

}


public class Order

{

    private CartContents cart;

    private float salesTax;


    public Order(CartContents cart, float salesTax)

    {

        this.cart = cart;

        this.salesTax = salesTax;

    }


    public float OrderTotal()

    {

        float cartTotal = 0;

        for (int i = 0; i < cart.items.Length; i++)

        {

            cartTotal += cart.items[i].Price * cart.items[i].Quantity;

        }

        cartTotal += cartTotal*salesTax;

        return cartTotal;

    }

}

注意OrderTotal方法(以及Order类)如何取决于CartContents和CartEntry类的实现细节。如果我们试图更改此逻辑以允许折扣,则可能必须更改所有三个类别。另外,如果我们更改为使用List集合来跟踪项目,则也必须更改Order类。


现在,这是一种执行相同操作的更好方法:


较少耦合的示例:


public class CartEntry

{

    public float Price;

    public int Quantity;


    public float GetLineItemTotal()

    {

        return Price * Quantity;

    }

}


public class CartContents

{

    public CartEntry[] items;


    public float GetCartItemsTotal()

    {

        float cartTotal = 0;

        foreach (CartEntry item in items)

        {

            cartTotal += item.GetLineItemTotal();

        }

        return cartTotal;

    }

}


public class Order

{

    private CartContents cart;

    private float salesTax;


    public Order(CartContents cart, float salesTax)

    {

        this.cart = cart;

        this.salesTax = salesTax;

    }


    public float OrderTotal()

    {

        return cart.GetCartItemsTotal() * (1.0f + salesTax);

    }

}

特定于购物车订单项,购物车集合或订单的实现的逻辑仅限于该类。因此,我们可以更改任何这些类的实现,而不必更改其他类。我们可以通过改进设计,引入接口等来进一步消除这种耦合,但我认为您已经明白了。


查看完整回答
1 反对 回复 2019-11-05
?
PIPIONE

TA贡献1829条经验 获得超9个赞

iPodiPad等许多集成产品(尤其是Apple的产品)就是紧密耦合的一个很好的例子:一旦电池耗尽,您最好购买新设备,因为电池已焊接固定并且不会松动,因此更换非常容易昂贵。松散耦合的播放器可以轻松更换电池。

这同样也适用于软件开发:它通常是(多)最好有松耦合代码,方便扩展和替换(并且使各个部件更容易理解)。但是,在极少数情况下,紧密耦合可能是有利的,因为几个模块的紧密集成可以实现更好的优化。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 934 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信