3 回答

TA貢獻1786條經(jīng)驗 獲得超11個贊
考慮一個簡單的購物車應(yīng)用程序,該應(yīng)用程序使用CartContents類來跟蹤購物車中的項目,并使用Order類來處理購買。訂單需要確定購物車中內(nèi)容的總價值,它可能會像這樣:
緊密耦合示例:
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類的實現(xiàn)細(xì)節(jié)。如果我們試圖更改此邏輯以允許折扣,則可能必須更改所有三個類別。另外,如果我們更改為使用List集合來跟蹤項目,則也必須更改Order類。
現(xiàn)在,這是一種執(zhí)行相同操作的更好方法:
較少耦合的示例:
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);
}
}
特定于購物車訂單項,購物車集合或訂單的實現(xiàn)的邏輯僅限于該類。因此,我們可以更改任何這些類的實現(xiàn),而不必更改其他類。我們可以通過改進設(shè)計,引入接口等來進一步消除這種耦合,但我認(rèn)為您已經(jīng)明白了。

TA貢獻1829條經(jīng)驗 獲得超9個贊
iPod,iPad等許多集成產(chǎn)品(尤其是Apple的產(chǎn)品)就是緊密耦合的一個很好的例子:一旦電池耗盡,您最好購買新設(shè)備,因為電池已焊接固定并且不會松動,因此更換非常容易昂貴。松散耦合的播放器可以輕松更換電池。
這同樣也適用于軟件開發(fā):它通常是(多)最好有松耦合代碼,方便擴展和替換(并且使各個部件更容易理解)。但是,在極少數(shù)情況下,緊密耦合可能是有利的,因為幾個模塊的緊密集成可以實現(xiàn)更好的優(yōu)化。
- 3 回答
- 0 關(guān)注
- 986 瀏覽