3 回答
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);
}
}
特定于购物车订单项,购物车集合或订单的实现的逻辑仅限于该类。因此,我们可以更改任何这些类的实现,而不必更改其他类。我们可以通过改进设计,引入接口等来进一步消除这种耦合,但我认为您已经明白了。
TA贡献1829条经验 获得超9个赞
iPod,iPad等许多集成产品(尤其是Apple的产品)就是紧密耦合的一个很好的例子:一旦电池耗尽,您最好购买新设备,因为电池已焊接固定并且不会松动,因此更换非常容易昂贵。松散耦合的播放器可以轻松更换电池。
这同样也适用于软件开发:它通常是(多)最好有松耦合代码,方便扩展和替换(并且使各个部件更容易理解)。但是,在极少数情况下,紧密耦合可能是有利的,因为几个模块的紧密集成可以实现更好的优化。
- 3 回答
- 0 关注
- 934 浏览
添加回答
举报