どっちなんだってばよ!
結論
DRY原則に従っていれば、マジックナンバーは発生しない
DRY原則とは
DRY says that every piece of system knowledge should have one authoritative, unambiguous representation.
引用元:https://www.artima.com/articles/orthogonality-and-the-dry-principle
意訳)DRYが言っているのは「システムにおけるすべての知識に対して、単一で信頼できる明確な表現が存在すべきである」ということだ。
知識と表現の違いについて少し説明しよう。
例えば、「犬」という知識とそれに対する"犬"という表現は別物として考えなければならない。
この記事を読む人の多くは、実際の「犬」を見たことがあり、その知識を持っているだろう。
しかしながら、同じ「犬」でも日本語での表現は"犬"・"犬っころ"・"わんこ"とか色々あるはずだ。
あなたが日本国民としてどの表現を用いても、法により罰せられることは無い。
しかしながら、システム開発の現場で表現をコロコロ変えたり、チームメンバーに伝わらない表現をするのであれば、それは迷惑極まりない。
そして、日本語のみでなく、プログラミング言語で表現されるソースコードの中でも同様であることは、皆さんよくわかっているところであろう。
よって、DRYは
単一で信頼できる明確な表現
を要請するのである。
マジックナンバーとDRY原則の関係
DRY原則を説明したところで、マジックナンバーとの関係性について考察してみよう。
例えば、三角形の面積を計算する関数があるとする。
function 三角形の面積(底辺, 高さ) {
return 底辺 * 高さ / 2
}
この場合に気になるのは、「2」がマジックナンバーかどうかだろう。
まず、この関数で表現されている知識は、
- 三角形の面積は「底辺かける高さ割る2」である
という知識だ。
この知識がDRY原則を守って表現されているならば、2の意味するところはシステムに携わる誰にとっても明白なもので、それはつまり「定義通り」ということになる。
マジックナンバーの由来は、
そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたときに閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。まるで魔法の数字だ」という皮肉を含む。
引用元:Wikipedia
ということなので、「この数字の意味」(つまり、数字による表現が指す知識)が分かるならば、それはマジックナンバーではないことになる。
つまり、数字がどこにハードコードされていようが、その数字に対応する知識を理解しているならば、マジックナンバーにはならないということになる。
なので、ソースコードに書かれている数字が、ある知識に対する「単一で信頼できる明確な表現」であるならば、マジックナンバーにはなりえないのだ。
以上の論理展開から、
- DRY原則に従っていれば、マジックナンバーは発生しない
という結論が導き出されたものである。