単一責任の原則について調べていると「クラスとメソッドは1つの責任だけを持つべき」など諸々調べると出てくるが、概念的にはわかるもののいまいちコードに反映することができていなかったので、モヤっとしていた。
そんな時に、いい感じのサイトに出会えたので勉強がてらまとめておく。
いい感じのサイト↓
Laravelベストプラクティス
実際にコードを見てみる
以下に登場するコードは上記のサイトから転記したものです。
単一責任の原則に反するコード
public function getFullNameAttribute()
{
if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) {
return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
} else {
return $this->first_name[0] . '. ' . $this->last_name;
}
}
あー。ifの条件がちょっと複雑だけどこうやって書いちゃうな..ってのが正直な感想です。
名前の作成の部分が、複雑でちょっと何しているかわかりにくいなとは思います。
「〜〜〜の修正お願い!」と頼まれても「えーと。ここのifの中身は〜〜〜」「なんか文字列結合しまくってるけどなんやろこれ?」ってなりそうな感じがします。
単一責任の法則に則ったコード
// これがメイン
public function getFullNameAttribute()
{
return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort();
}
// 認証認可関連
// ここもうちょいどうにかならんのか?と少し感じる
public function isVerifiedClient()
{
return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified();
}
// 名前の取得①
public function getFullNameLong()
{
return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
}
// 名前の取得②
public function getFullNameShort()
{
return $this->first_name[0] . '. ' . $this->last_name;
}
感想としてすごいわかりやすいなーと思いました。
getFullNameAttribute()
だけ読めば「ああなるほど」となります。
修正を加える際にも、「ここを修正すればいいな」「ここは今回は関係ないな」というのが明確にわかのではないかと思います。
まとめ
綺麗なコードが書きたい。