素直なコードについて考える #sgadvent
素直なコード?
この記事はソニックガーデン Advent Calendar 2015の5日目の記事です。 今回は以前、代表の倉貫が島根の松江Ruby会議 06で公演を行うので、 一緒について行ってライブコーディング大喜利というイベントに参加した時に言われた「素直なコード」というものについて自分で考えてみました。
その時のライブコーディング大喜利で書いたコードはqiitaにあげてあります。
松江Ruby会議06で出された問題を解いてみた。 - Qiita
ライブコーディングが終わり、コードを見てもらったのですが審査員の人から「素直なコードですね」と言われました。
その当時、新卒入社1年目で技術力はなかったものの、 ソニックガーデンでは可読性のあるコードや保守性の高いコードの書き方になるようにコードレビュー等で頻繁に注意されていたので、 意識してそう言ったコードは書けていたと思います。
もし、素直なコードを超えた先(ソニックガーデン師匠レベルの人達が書くコード)はどんなコードになるのかなと考えてみました。
(忙しい人用に4行でまとめました。飛びたい場合はコチラ)
素直なコードになる前は?
まず素直なコードに達するまでは、どんなコードと呼べるかを考えたら、 自己中なコード だなと思いました。
例えばRailsで次のようなコードはかなり自己中なコードです。
# 1ヶ月(30日), 2592000秒
def self.delete_expired_events
all.each do |event|
if Time.now.utc - event.created_at > 2592000
event.destroy
end
end
end
コメントはありますが、2592000という文字が何を意味するのか捉えにくい([マジックナンバー](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)と呼ばれてる)ですし、
もし2か月後に変更するときに 2592000 * 2
みたいになると、余計混乱の元です。
じゃあ素直なコードは?
さっきのコードの例だと、素直なコードは
def self.destroy_expired_events
where("created_at <= ?", Time.current.months_ago(1)).destroy_all
end
みたいになります。if文がなくなって1行になったり、 months_ago
メソッドを使っているため、どの条件でイベントを削除したいのかがわかりやすくなりました。
RubyやRailsのメジャーな書き方やメソッドをちゃんと使いこなせているようになると素直なコードは書けるようになってきます。 ここまでくると可読性も上がり、他の人や将来の自分が見ても理解しやすいコードになっています。
次のステージへ
もし、この次があるとしたらそれは、コードの全体や運用での観点でコードが考えられているのだと思います。 例えば、
- ステージング環境でちゃんとデータが消されるかを確認したいんだけど1か月待たないといけないの? 。
- 運用してから削除する日数(月単位でない)を決めたいから簡単に変えられるようにしておきたい。
- 他にもユーザーが特定の日数以前のデータを消せるように
def self.destroy_at_or_before(datetime)
というメソッドが用意されていた。
のような状態ですと、実は次のような実装が適していたのかもしれません。
def self.destory_at_or_before(datetime)
where("created_at <= ?", datetime).destroy_all
end
def self.destroy_expired_events
self.destroy_at_or_before(Time.current.days_ago(ENV["NUMBER_OF_EFFECTIVE_DATES"]))
end
みたいにした方が、環境変数を変更するだけで有効日数を変更できますし、すでにあったメソッドを使うために、メソッドの役割を分担できています。
(さらに self.destroy_at_or_before(datetime)
のメソッドはeventに関係ないのでconcernのようなところに書けば共通化ができますね)
このように、コード的には正しいけど、運用やコード全体を考えてかけているコードが素直なコードの次に目指すところだと思います。
私は、このコードのことを 優しいコード と名付けました。コードを見る人や運用する人のことが考慮されています(別にソニックガーデンでこう呼ばれているわけではないですが)。
優しいコードは、その都度環境と求められるものが変化するので正解はないですがより良いものを目指していきます。
師匠レベルの人は、この優しいコードが自然と書けているし、より優しいコードはどう書けるかを追い求めているのだと思います。
まとめ
-
自己中コード => 周りが見えていなく、自分にしか理解できないコード
-
素直なコード => プログラミングの重要な考え方(オブジェクト志向)や、言語やフレームワークの機能がしっかり利用できていて、他の人が読んでも読みやすい
-
優しいコード => 素直なコードが書けていて、運用やコード全体のことが考えられている
コードが良くなる = 視野が広がり、周りのことを考えられている