0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

密結合と責務に関して(良いコード悪いコードで学ぶ設計入門のsection8を読んで)

Last updated at Posted at 2024-07-28

目的

この記事では、エンジニア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の原則は知っていたため、コードの重複は良くないもの、と思い込んでいました。
共通化する前に、コードの「責務」を一度考えることが重要と思えました。

実際の業務

今回の学びとは直接は異なりますが、下記のように迷うことが多いです。
今後は下記の設計でも応用できるようなことも調べていきたいです。
・コントローラのメソッドを分けるか否か
・ブレードのファイルを分けるか否か

次のステップ

継承に関しても注意点が多い、、とのことなのでまとめようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?