[java符号化の技術]1.コードクリーンアップ


3ヶ月前に新しく入社した非専門開発者が可読性の良いコードを作るために学んだ内容です.不足や再学習のアドバイスは、文章で発見された問題をいつでも話してください.

1.ブール値は比較しないでください。

public class ExampleService {

    private int a = 10;
    private int b = 20;

    public int escapeBooleanCompare() {

        if (compareIntA(100) == true) {
            return a;
        } else {
            return b;
        }

    }

    private boolean compareIntA(int param) {
		return param == a;
    }
}
  • サンプル作成したばかりのコードで、条件文で値を比較する場合、boolean元の値は==と比較しない.
  • この比較は全く必要なく、コードの可読性や理解力が低下する
  • 修正案
  • public int escapeBooleanCompare() {
    
        if (compareIntA(100)) {
            return a;
        } 
        return b;
        
    }
  • else文も使えますが、早い戻り方も使えます→文がきれいになったら不要なelse文も整理されます
  • 2.否定を避ける

  • 条件文を書くときは、否定表現if(!isTrue())if(isTrue())のように!加えた否定は使わないほうがいい→肯定的表現は否定的表現よりコードの理解度を高めるのに役立つ+457918、

    3.ブール式を直接返す

    public class ExampleService {
    
        private String name;
        private int age;
    
        public boolean checkUserInfo(String name, int age) {
            if (age < 19 || Objects.isNull(name) || name.trim().isEmpty()) {
                return false;
            } else {
                return true;
            }
        }
    
    }
  • 19歳未満、名前値nullまたは名前が空の場合falseのユーザ認証コードを返す
  • 条件文には多くのものがあり、コードが読みづらい.→インデントと分機ゲートに入って可読性が低下
  • public boolean checkUserInfo(String name, int age) {
            return age > 19 && !Objects.isNull(name) && !name.trim().isEmpty();
    }
  • 条件文が3つ以上使用されている場合は簡略化することが望ましい→この場合簡略化された条件文ブロックに共通に使用されている部分がある場合は、その使用方法(関数)を抽出することが望ましい
  • 	public boolean checkUserInfo(String name, int age) {
    		boolean isValidAge = age > 19;
    		boolean isValidName = !Objects.isNull(name) && !name.trim().isEmpty();
    		return isValidAge && isValidName;
      }
  • x&&y|z→(x&y)|z→演算しない場合&これより先|演算
  • 4.条件文のnullPointExceptionを避ける

    public void writeMessage(String message, Path location) {
        if (Files.isDirectory(location)) {
            throw new IllegalArgumentException("유효하지 않은 경로입니다.");
        }
    
        if (message.trim().isEmpty() || Objects.isNull(message)) {
            throw new IllegalArgumentException("유효하지 않은 메시지입니다.");
        }
    }
  • Java開発による有効性(買収検証)における最大の問題→nullPointexception
  • この検証手順が一番重要!→上記のコードは、まずパラメータ値が使用に適しているかどうかを決定し、nullであるかどうかを決定する→この場合、パラメータ値が使用に適しているかどうかを決定する過程でnullPointExceptionが発生する可能性が高い.
  • 検証の正確な順序は、空チェック→値の可用性(引数が望ましい)
  • 読みやすく動作がスムーズなコードに変更
  • public void writeMessage(String message, Path location) {
        if (Objects.isNull(message) || message.trim().isEmpty()) {
            throw new IllegalArgumentException("유효하지 않은 메시지입니다.");
        }
    
        if (Objects.isNull(location) || Files.isDirectory(location)) {
            throw new IllegalArgumentException("유효하지 않은 경로입니다.");
        }
    }
  • 有効パラメータチェックを先にパラメータ順に行う→可読性を高める(メッセージの有効性と位置有効性条件文の位置マッチング)
  • null検査後、その値が有効か確認
  • 常にこのレベルのパラメータ有効性チェックを行う必要はない
  • 主にpublic、protected、defaultで有効性検査を行う
  • プライベートではnullを超えないほうがいい
  • 5.switch case構文とbreak

    public void writeMessage(int a) {
        String result;
    
        switch (a) {
            case 1 :
                result = "one";
            case 2 :
                result = "two";
                break;
            case 3 :
                result = "three";
                break;
            default:
                result = "other";
                break;
        }
    }
  • switch case文法は本当に多くの間違いを引き起こす文法の一つ
  • 上記のサンプルコードのうちcase 1ブロックに欠落しているbreak;つまり、第1のcaseは無条件に失敗し、第2のcaseから開始する.→switch caseミスで悪名高い理由の一つ
  • switch文は興味のある事項の分類が難しいかも
  • 6.常にかっこを使用

  • コードの読みやすさを向上させるため、カッコを省略するよりカッコを使用した方が良い
  • public void writeMessage(int a) {
        String result;
    
        if (a == 1)
            result = "one";
        if (a == 2)
            result = "two";
        if (a == 3)
            result = "three";
    		a++;
    }
  • 上記のコードのように、1行が終了すると括弧を省略することができます.
  • 上記のサンプルコードは括弧を使わず、エラーのコードを誤ったインデントで理解→if(a == 3)構文中a++;と
  • 雑談、if疑問の括弧は以前から多くの議論の対象となっている→自分に合った括弧を使う.
  • 7.リバースコード

    public void checkAuth() {
        if (checkUserUnknown()) {
            return;
        } else if (checkSupplier()) {
            System.out.println("반갑습니다. 판매자님");
        } else if (checkConsumer()) {
            System.out.println("반갑습니다. 고객님");
        }
    }
  • 上のコードから見ると、分岐文法は同じ注目点分類を行っていない
  • checkUserUnknown()checkSupplier()checkConsumer()相互処理の関心事項が異なる→ユーザがログインするかどうかとユーザの権限設定の2つの関心事項を分離→コードの対称性を達成するために分離する.
  • public void checkAuth() {
        if (checkUserUnknown()) {
            return;
        } 
        
        if (checkSupplier()) {
            System.out.println("반갑습니다. 판매자님");
        } else if (checkConsumer()) {
            System.out.println("반갑습니다. 고객님");
        }
    }
  • 登録者とユーザフェルジョナを分離することでコードの対称性を達成