目的
この記事では、エンジニア2年目の私が、密結合に関して、知らなかった点をまとめていきたいと思います。
背景
設計のことを読むだけではなかなか頭に入らず、また、業務でもそう都合よく理解したい内容が来るわけでもないため、アウトプットが必要だな、、と思い始めました。
本文
section8 密結合に関して
密結合とは?
あるクラスが他の多くのクラスに依存していること。
具体的事例
ある商品を販売するサイトにおいて、通常の割引とsummer割引きがあるとする。
どちらも現在は1商品あたり300円引きである。
DiscountManagerクラスでは、
下記のようにgetDiscountPriceメソッドがすでに用意されている。
class DiscountManager{
ind discountPrice = getDiscountPrice(product.price);
static int getDiscountPrice(int price){
int discoutPrice = price - 300;
return discoutPrice;
}
}
SummerDiscountManagerクラスでは、上記メソッドを利用して計算するとする。
価格 = DiscountManger.totalPrice + DiscountManager.getDiscountPrice(product.price);
ここで、「現在は1商品あたり300円引き」の条件が、夏限定割引だけ変更になるとする。
しかし、DiscountManagerクラスのprice -300
を変えてしまうと、
通常割引の価格まで変わってしまうという困ったことが生じる。
課題
上記の設計では、DiscountManagerクラスの割引価格が固定されており、夏限定割引を適用する場合に通常割引の価格も変更されてしまいます。これが密結合の問題です。
改善方法
単一責任になるように、下記のようにクラスを設計し直します。
通常と夏限定それぞれで仕様変更に対応できるようになります。
RegularPriceクラス
final int amount;
RegularDiscoutedPriceクラス
class RegularDiscountedPrice{
final int amount;
private static final int DISCOUNT_AMOUNT = 400;
RegularDiscountedPrice(final Regular Price){
int discountedAmount = price.amount - DISCOUNT_AMOUNT;
}
amount = discountedAmount;
}
SummerDiscoutedPriceクラス
class SUmmerDiscoutedPrice{
final int amount;
private static final int DISCOUNT_AMOUNT = 300;
SUmmerDiscoutedPrice(final Regular Price){
int discountedAmount = price.amount - DISCOUNT_AMOUNT;
}
amount = discountedAmount;
}
学び
Dryの原則は知っていたため、コードの重複は良くないもの、と思い込んでいました。
共通化する前に、コードの「責務」を一度考えることが重要と思えました。
実際の業務
今回の学びとは直接は異なりますが、下記のように迷うことが多いです。
今後は下記の設計でも応用できるようなことも調べていきたいです。
・コントローラのメソッドを分けるか否か
・ブレードのファイルを分けるか否か
次のステップ
継承に関しても注意点が多い、、とのことなのでまとめようと思います。