🤒

"頭痛が痛い" みたいなことを書くのはやめよう

2023/06/05に公開

頭痛が痛い

頭痛が痛いって、日本語的におかしいですよね。

文字通り、頭痛は頭が痛いという意味です。

頭痛が痛い = 頭が痛くて痛い と言っているわけです。

ソースコードにおける "頭痛が痛い"

ソースコードで 冗長なこと を書くのはやめましょう!

これが今回の提言です😎😎

プロパティ名はシンプルに

次のソースコードで、どこが頭痛が痛いポイントでしょうか?

class MountainEntity {
    mountainId: number;
    name: string;
    prefectures: string[];
    elevation: number;

    constructor(
        mountainId: number,
        name: string,
        prefectures: string[], 
        elevation: number
    ) {
        this.mountainId = mountainId;
        this.name = name;
        this.prefectures = prefectures;
        this.elevation = elevation;
    }
}

const mountain = new MountainEntity(
    1,
    '富士山',
    ['山梨県', '静岡県'],
    3776
);

// IDを出力する
console.log(`ID = ${mountain.mountainId}`); // ID = 1

MountainEntitymountainId って、頭痛が痛いみたいになっていませんか?🤔

山の一意になる ID を表現したい場合、
mountainId でなくても id だけで MountainEntity の一意になるIDということが伝わりますよね。

実装のなかで ID を扱うときも、mountain.mountainId となってしまいます。

まさしく、頭痛が痛い 状態です。

以下のように修正した場合は、どうでしょうか。

class MountainEntity {
    id: number;
    name: string;
    prefectures: string[];
    elevation: number;

    constructor(
        id: number,
        name: string,
        prefectures: string[],
        elevation: number
    ) {
        this.id = id;
        this.name = name;
        this.prefectures = prefectures;
        this.elevation = elevation;
    }
}

const mountain = new MountainEntity(
    1,
    '富士山',
    ['山梨県', '静岡県'],
    3776
);

// IDを出力する
console.log(`ID = ${mountain.id}`); // ID = 1

プロパティ名の id だけで何のIDかを伝える必要はなく、
定義したクラスから見ていったときに、山のIDであることが分かれば良いと思うわけです。

メソッド名もシンプルに

MountainEntity を生成するメソッドを実装するとします。

そんなとき、createMountaingenerateMountain のような命名をしていませんか?

私には冗長なメソッド名に感じます。

class MountainEntity {
    id: number;
    name: string;
    prefectures: string[];
    elevation: number;

    constructor(
        id: number,
        name: string,
        prefectures: string[],
        elevation: number
    ) {
        this.id = id;
        this.name = name;
        this.prefectures = prefectures;
        this.elevation = elevation;
    }

    static createMountain(
        id: number,
        name: string,
        prefectures: string[],
        elevation: number
    ) {
        if (name.length === 0) {
            throw new Error('name is empty.');
        }

        return new MountainEntity(
            id,
            name,
            prefectures,
            elevation
        )
    }
}

try {
    const mountain = MountainEntity.createMountain(
        1,
        '富士山',
        ['山梨県', '静岡県'],
        3776
    );

    // IDを出力する
    console.log(mountain);
}
catch(ex) {
    console.error(ex);
}

MountainEntity.createMountain() って、頭痛が痛い 感ありませんか?

ここは create だけで、山の情報を生成することが伝わるでしょう。

class MountainEntity {
    id: number;
    name: string;
    prefectures: string[];
    elevation: number;

    constructor(
        id: number,
        name: string,
        prefectures: string[],
        elevation: number
    ) {
        this.id = id;
        this.name = name;
        this.prefectures = prefectures;
        this.elevation = elevation;
    }

    static create(
        id: number,
        name: string,
        prefectures: string[],
        elevation: number
    ) {
        if (name.length === 0) {
            throw new Error('name is empty.');
        }

        return new MountainEntity(
            id,
            name,
            prefectures,
            elevation
        )
    }
}

try {
    const mountain = MountainEntity.create(
        1,
        '富士山',
        ['山梨県', '静岡県'],
        3776
    );

    // IDを出力する
    console.log(mountain);
}
catch(ex) {
    console.error(ex);
}

シンプルになりました👏👏

MountainEntity を生成する関数だ!と思って、
ついつい createMountain のような命名をしてしまいがちです。

まとめ

ディレクトリ構造(フォルダ名)、ファイル名、クラス名、関数名、そして変数名...

名前 には死ぬほどこだわってほしいです!

名前にこだわることが良い設計や可読性の高いソースコードにつながると思います。

コラボスタイル Developers

Discussion