"頭痛が痛い" みたいなことを書くのはやめよう
頭痛が痛い
頭痛が痛いって、日本語的におかしいですよね。
文字通り、頭痛は頭が痛いという意味です。
頭痛が痛い = 頭が痛くて痛い と言っているわけです。
ソースコードにおける "頭痛が痛い"
ソースコードで 冗長なこと を書くのはやめましょう!
これが今回の提言です😎😎
プロパティ名はシンプルに
次のソースコードで、どこが頭痛が痛いポイントでしょうか?
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
MountainEntity
の mountainId
って、頭痛が痛いみたいになっていませんか?🤔
山の一意になる 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
を生成するメソッドを実装するとします。
そんなとき、createMountain
や generateMountain
のような命名をしていませんか?
私には冗長なメソッド名に感じます。
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
のような命名をしてしまいがちです。
まとめ
ディレクトリ構造(フォルダ名)、ファイル名、クラス名、関数名、そして変数名...
名前 には死ぬほどこだわってほしいです!
名前にこだわることが良い設計や可読性の高いソースコードにつながると思います。
Discussion