嘆かわしいことに、多くの人が「同じコードは関数やクラスなどを用いて共通化しなければいけない」と信じているが、これはプログラミングにおけるアンチパターンである。
たとえば、
という2つの処理は、どちらも元の数値を1.1倍する処理であり、完全に同一のコードであるが、これは共通化すべきではない。意味が異なるからだ。
これらを共通化すると、たとえばシステム全体で金利を5%に変更しなければいけなくなったとき、消費税を加える処理すべてに影響を及ぼしてしまう。つまり、保守性が下がっている。
元々、DRYの原則は「情報の重複」を無くすためのものだし、SRP(Single Responsibility Principle)も「モジュールの責務(言い換えればそのモジュールを変更する理由)を1つにすべし」というものだ。つまり、どちらも実装に関するものではなく、より抽象的な「意味」や「役割」に関するものだ。
どうして、こういうことが起こってしまうのか。理由は単純で、ほとんどの(自称)プログラマは馬鹿だからだ。
ほとんどのプログラマは基礎学力が著しく低く、プログラミング言語の書き方を覚えるのに精一杯で、実装と意味を分離するとかそんなことは考えられない。というか、彼らは自分が書いているソフトウェアの機能を日本語で説明することすらできない。
これは教える側もそうで、知能と知恵が足りていないから
駆け出しのプログラマがDRY原則を知ったとき、「世界は俺のことが分かってる」って思い込むよね。
「10%を加える」という処理は共通なんだから、そこは共通化しておくべきやろ。 「システム全体で金利を5%に変更しなければいけなくなったとき」は、 「5%を加える」という処理を用意...
こんなことを本気で思っている奴がいるのだから、本当に世の中怖いと思う
これはたとえ話なんだから。 そこは意図を汲んでほしいね
釣り? 普通、プログラムで何かを分離したいなら意味単位でだろ。 数値単位で分離するべきとか思ってるならプログラマ辞めろ。
「消費税を加える」「金利を加える」という関数を作り、それぞれを全く同じ実装にすればよい。 これがSRPということ。
そもそも共通モジュール的なクラスが 意味じゃなく処理単位で作られてることって滅多になくない?
3D系のプログラミングだと、 マトリックス演算とかいろいろ、ちょっとした計算処理、それ自体がかなりの複雑度を伴うから関数化ライブラリ化されてるよ
一番タチ悪いのは 「コードを共通化できる=構造を見抜く力がある=センスがある」 と勘違いしてる無能が現れること こういう奴にお前のコードはクソコードだと気付かせるのは至難