if文を考える
以下のような if 文をよく見かける。
if has_white_skin && is_good_looking p 'まいやん' # 色白で美人なのが、まいやん elsif has_white_skin && is_cute p 'さゆにゃん' # 色白で可愛いのが、さゆにゃん end
ありがちだが、良くない。以下はもっと良くない。
if has_white_skin if is_good_looking p 'まいやん' # 色白で美人なのが、まいやん elsif is_cute p 'さゆにゃん' # 色白で可愛いのが、さゆにゃん end end
今後、スパゲティコードとして成長していくことが目に浮かぶ。
まず大切なのは、この処理には「白石麻衣」の場合と「井上小百合」の場合、その2通りの状態があること。
白石麻衣は「色白で美人」である。だが、どのような条件で「白石麻衣」と判断するか…それはどうでもいい。
大切なのは「白石麻衣」という状態が存在することだ。
状態を判断:色白で美人(どうでもいい) ↓ 状態:白石麻衣(大切) ↓ 処理:まいやん(ニックネーム。どうでもいい)
下の処理を見てみると、状態を判断(どうでもいい)と、処理(どうでもいい)だけしか書かれていない。
if has_white_skin && is_good_looking p 'まいやん' # 色白で美人なのが、まいやん
「状態が白石麻衣」であることは、どこにも書かれていない。
これを初めて読んだ人は「は?これ何について書かれているの?」となる。
以下の書き方が正解となる。
if has_white_skin && is_good_looking who = '白石麻衣' elsif has_white_skin && is_cute who = '井上小百合' end if who == '白石麻衣' p 'まいやん' elsif who == '井上小百合' p 'さゆにゃん' end
「状態の判断」と「処理」が分離された。
状態として、「白石麻衣」と「井上小百合」の2パターンが存在することが見て分かる。