[開発図書]Clean Code::第12章-創造性


🎓 ガンの足


下層(コンポーネント)にない特性や挙動は、上層(構造全体)に自発的に現れる.
  • 単純連結は複雑な結果を表す
  • 人の脳を例にとると、1つのニューロンには認識能力がないが、数十億個のニューロンが結合すると、自己認識の現象が発生する.
  • 創意性とは、号令を出さない調停者の場合、各部分のコミュニケーションを通じて自己組織化を実現し、これらの底辺から得られる力が予想外の機能を発揮できる力である.すなわち、創造的な設計とは、ある規則と原則に従って設計され、それらが集まって良いマクロ設計になることができることを意味する.

    📕 革新的な設計を採用し、簡潔なコードを実現


    ケントベック氏によると、以下のルールに従って、設計は「簡単」(重要度順)だという。

  • は、すべてのテストを実行します.
  • 重複除外.
  • プログラマーの意図を表します.
  • クラスとメソッドの数を最小限に抑えます.
  • 4つのルールに従って、コードの構造と設計は更に掌握しやすくて、更にSRP、DIPなどの原則を応用しやすくて、優秀な設計の創造性を促進します.

    📗 簡単な設計規則1-すべてのテストを実行します。


    設計は予想通りに稼働するシステムを発売すべきである.
    すべてのテストを経て、メリットは以下の通りです.
  • の設計が予想通りに行われたかどうかを確認できます.
  • テスト可能システムを生成することができる.
  • をテストできないシステムも検証できません.
  • テストを円滑に行うために、単一責任の原則を遵守するクラスが現れます.
  • 個以上のテストボックスを作成し、テストをスムーズに行いました.
  • の複数のテストケースにより、DIPなどの原則を採用し、依存注入、インタフェース、抽象などのツールを使用して結合度を低減することができる.
  • 試験例を作成して検証する過程により,低結合度と高凝集力に適合するコードを生成することができる.

    📙 設計規則の簡略化2~4:再設計


    すべてのテストケースを作成した場合は、コードとクラスを整理します->「漸進的な再構築」
    コードの追加とテストケースの返却を繰り返す

    ソフトウェア設計の品質を向上させる方法

  • 凝集度
  • の向上
  • 結合度
  • を低減する.
  • 興味分離
  • 興味モジュール化
  • 関数とクラスサイズを
  • 削減
  • 名前変更
  • *再設計:結果を変更せずにコード構造を再調整
    *集約性:プログラムを構成する各モジュールが固有の機能をうまく処理できる程度
    *結合度:異なるモジュール間の相互依存度または関連度

    📘 重複除外


    重複性は、追加の作業、追加のリスク、および不要な複雑さを意味するため、最小限に抑えることが望ましい.
    💻 実施冗長例218 p

    📍 単純メソッドアレイ

  • 高度な重複除外技術
  • は、特定のタスクの処理の一部をサブクラス
  • にカプセル化する.
  • は、同じ部分の異なる構文からなる方法のコード冗長性を低減するために非常に有用である
  • .
    //추상 클래스 선생님
    abstract class Teacher{
    	
        public void start_class() {
            inside();
            attendance();
            teach();
            outside();
        }
    	
        // 공통 메서드
        public void inside() {
            System.out.println("선생님이 강의실로 들어옵니다.");
        }
        
        public void attendance() {
            System.out.println("선생님이 출석을 부릅니다.");
        }
        
        public void outside() {
            System.out.println("선생님이 강의실을 나갑니다.");
        }
        
        // 추상 메서드
        abstract void teach();
    }
     
    // 국어 선생님
    class Korean_Teacher extends Teacher{
        
        @Override
        public void teach() {
            System.out.println("선생님이 국어를 수업합니다.");
        }
    }
     
    //수학 선생님
    class Math_Teacher extends Teacher{
    
        @Override
        public void teach() {
            System.out.println("선생님이 수학을 수업합니다.");
        }
    }
    
    //영어 선생님
    class English_Teacher extends Teacher{
    
        @Override
        public void teach() {
            System.out.println("선생님이 영어를 수업합니다.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Korean_Teacher kr = new Korean_Teacher(); //국어
            Math_Teacher mt = new Math_Teacher(); //수학
            English_Teacher en = new English_Teacher(); //영어
            
            kr.start_class();
            System.out.println("----------------------------");
            mt.start_class();
            System.out.println("----------------------------");
            en.start_class();
        }
    }

    利点と欠点は重複コードを減らすことができる.抽象的な方法が増えるにつれて,クラス管理は複雑になる.サブクラスの役割を減らすことで、コアロジックを容易に管理できます.クラスとクラスの関係とコードが歪む可能性があります.オブジェクト向けにコードを整理できます.

    📒 表現


    ほとんどのソフトウェアは長期的なメンテナンスを行っています.欠陥とメンテナンスコストを削減するためには、明確なコードを作成する必要があります.そのため、メンテナンス開発者は、コードを理解するために意図を明確に表現する必要があります.

    分かりやすいコードの作成方法

  • の良い名前を選択します.
    名前と機能が関連しています.
  • 関数とクラスサイズを減らします.
  • ネーミングが容易になり、実現も容易になり、理解も容易になります.
  • 標準名を使用します.
  • ex)標準図案を使用し、その名前を付けると、その意図が分かりやすい.
  • ユニットのテスト例をよく作成します.
  • は、クラスの機能を理解できる良いテストケースです.
  • *標準モード???

    📕 クラスとメソッドの数を最小限に抑える


    クラスとメソッドのサイズを縮小するために、無数の小さなクラスとメソッドが作成される場合があります.したがって、関数とクラスの数をできるだけ減らす必要があります.
    ここでの目標は,関数とクラスサイズを小さく保ちながら,システムサイズを小さく保つことである.
    この規則は4つの簡単な設計規則の中で優先度が最も低い.テストケースを作成し、意図を繰り返し、表現する他の作業を排除することが重要です.

    📚 Reference

  • Clean Code:爱子日软件达人精神
  • テンプレートメソッドモード:https://coding-factory.tistory.com/7122
  • GoF設計モード:https://velog.io/@namezin/GoF-design-patternhttps://yupdown.tistory.com/12