初心者向け

【Java】読みやすいコードを意識しよう!

easy-to-read-code

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

今回はこのような質問をいただきました。

読みやすいコードを書くにはどうしたら良いんだろう?

チーム開発において読みやすいコードというのは非常に重要です。

そこで今回はこちらの質問について解説していきます!

読みにくいコードの実例と改善方法を紹介!

では実際に例をあげて解説していきます。

あくまでこれらは個人的な意見です。
こっちの書き方のほうが好き!ということもあると思うので、そこはプロジェクト内で統一できていれば良いと思います。

カッコなしのif

if (num == 1)
    return num;

このように条件分岐した処理が{}で囲われていないif文。

どこまでがif文の処理なのかがわかりにくいです。

それでいて、省略できるのは{}だけなので省略する必要はないですね。

また、必ずカッコありのif文と混在することとなるので、カッコありのif文に統一したいです。

if (num == 1) {
    return num;
}

単純なif else

int num;
if (true) {
    num = 2;
} else {
    num = 3;
}

このように単純な処理であれば、三項演算子を使いましょう

コードが無駄に長くなるだけで、読みにくくなります。

三項演算子を使えば1行で収まって良いですね。

int num = true ? 2 : 3;

else if

int num1;
int num2 = 1;
if (num2 == 1) {
    num1 = 1;
} else if (num2 == 2) {
    num1 = 2;
} else if (num2 == 3) {
    num1 = 3;
} else if (num2 == 4) {
    num1 = 4;
}

if elseと同様にこのような単純な処理であれば、switch文を使いましょう!

switch文は読みやすいので積極的に使っていくと喜ばれます。

int num1;
int num2 = 1;
switch (num2) {
    case 1:
        num1 = 1;
        break;
    case 2:
        num1 = 2;
        break;
    case 3:
        num1 = 3;
        break;
    case 4:
        num1 = 4;
        break;
    default:
}

for文・拡張for文

List<String> list = Arrays.asList("a", "b", "c");
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
List<String> list = Arrays.asList("a", "b", "c");
for (String s : list) {
    System.out.println(s);
}

forEachが使えるならforEachを使いましょう

forEachを使えば1行でかけてしまう上に読みやすいですよね。

Java8以降であればラムダも積極的に使いましょう!

List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println);

複数のコンストラクタ

public class UserDto {
    public String name;
    public Integer age;

    UserDto(String name) {
        this.name = name;
    }

    UserDto(Integer age) {
        this.age = age;
    }
}

複数コンストラクタを定義するのはあまり良くないです。

別のメソッドでラップしてあげましょう

public class UserDto {
    public String name;
    public Integer age;

    UserDto() {
    }
    
    public static UserDto createByName(String name){
        UserDto userDto = new UserDto();
        userDto.name = name;
        return userDto;
    }
    
    public static UserDto createByAge(Integer age){
        UserDto userDto = new UserDto();
        userDto.age = age;
        return userDto;
    }
}

Boolean型

Boolean flg = true;

基本的にフラグを扱うときにはNULLが入ることはないはずなのでboolean型を使いましょう

プリミティブ型で良いならプリミティブ型にするべきです。

boolean flg = true;

Lists.newArrayList()

List<String> list = Lists.newArrayList();

こちらは明確な理由があるわけではないのですが、なんとなく使いたくないコードです。

私はListを初期化する場合、以下のコードに統一しています。

どちらを使うかは好みですが、どちらかに統一するべきですね

List<String> list = new ArrayList<>();

NULLの判定

String s = null;
if (s == null) {
    s = "abc";
}

NULLの判定にはObjects.isNull()を使用しましょう

==で判定しても良いのですが、その場合はそちらに統一したいですね。

java.util.Objectsは便利なので積極的に使うと良いです。

String s = null;
if (Objects.isNull(s)) {
    s = "abc";
}

カッコの場所

public class UserDto 
{
    public String name;
    public Integer age;
}

滅多に見ないけど見ると気になりますね。

無駄な改行なので改行しないほうが良いです。

public class UserDto {
    public String name;
    public Integer age;
}

importをまとめる

import javax.persistence.*;

エディタが勝手にやってくれる部分だと思いますが、まとめないほうが良いです。

たまに同じ名前のメソッドを読み込んでいてエラーなります。

コード自体短くなるのですがimport部分を読む人はいないので多少長くなってもすべて明記しましょう!

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

まとめ

1つ1つ細かくコードレビューで指摘するほどの内容でもないと思います。

ただ、これらのコードを混在させるのではなくどちらかに統一したほうが良いですね。

複数人で開発する場合は開発方針として最初に明確にしておくと良いです。

メンバー全員が開発しやすく、レビューしやすいコードを心がけましょう!