亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

メソッド名を考えるときに気をつけること

大学時代に、プログラミングだけでAO入試で入ってきて、部活に熱中しすぎて一年留年して、成績優良で某幸之助じいちゃんの会社に行った奴がいましてね。そいつにずっと言われてたのが

プログラムは自然言語としてよめるべき。コメントはいらないよ。

という話で、そのときは「いやいやwww」と思ってたけれど、最近の僕の思考は、もう「自然言語として読めるか」に尽きるようになってきた。

んで、こんな話。

booleanIshogehogeなのか?

そうであることは多いですよね。でも、例外も非常に多いです

たとえば、

Enumerable.Contains(TSource) メソッド (IEnumerable(TSource), TSource) (System.Linq)

LINQContainsメソッドIs始まりではないですが、これは拡張メソッドとしてインスタンスと結びつくとif(hogeList.Contains(fugaItem)みたいにかけるので、非常に可読性が良くなります。ひゃっほい!

インスタンスメソッドは確かに難しい

isBefore(fromDate, toDate)確かに難しいですね。寄せられた解答としては、

fromDateIsBeforeToDateは現実的な解決策だと思います。if文として読み下してみましょう。

if(fromDateIsBeforeToDate(hogeDate, fugaDate))

・・・うん、苦しい、苦しいですが、まぁ、なんとか!!頑張るなら、

これもありですよね。んで、個人的には、if(ComparableDate.From(hoge).IsBefore(Fuga)とか、静的メソッド使うかな。

「設計が悪いんじゃね?」

はい、僕も一票です。それ、ドメインモデル貧血症感は否めません。なんでそのクラスに持ってないのよ、という。

そう、思い浮かぶ言葉がごちゃごちゃし始める時ってのは、どう考えてもコードの悪い匂いです。僕の経験的にもそう。名前を付けられないオブジェクトやメソッドが出てきた時は、おそらく現実世界とコードが分離しすぎているサインです。

…まぁ、とはいえプリミティブクラス使わざるを得ない場面もありますよね。

拡張メソッドある言語ならそれで逃げよう

さて、C# やら Swift やら Kotlin やら、最近のモダンな言語には拡張メソッドという便利なものが有りましてね。

csharp.keicode.com

qiita.com

blog.codable.co.jp

これだとDate型を割と自然に拡張できます。本当は完全に設計から治すべきとは思いますが、人まずはこれで逃げることが僕は多いですな。。。