オブジェクト指向を否定する理由(ミイラ取りがミイラになった)

以前、自称経験者に「オブジェクト指向プログラミングは難しい。普通の人は使えない」ということを言われました。
当時は何を言っているのかわからなかったんですが、最近、その理由がわかりました。

オブジェクト指向じゃなければ、簡単?

// 手続き型プログラミング
long id = Long.parseLong(actionForm.getID());
// オブジェクト指向プログラミング
ID id = new ID(actionForm.getID());

前者だと、「IDはlong型の数値」ということがわかります。
後者だと、そのことがわかりません(クラスの中を見れば、わかるかもしれませんが)。
オブジェクト指向否定派の人は、これを見ていいます。
「ほら、前者はIDが何か簡単にわかるけど、後者はわからないでしょ?だからオブジェクト指向プログラミングは無駄に難しくしているだけなんだよ」
つまり、この一行だけを見てオブジェクト指向でないほうが簡単といっているわけです。


オブジェクト指向なら、
「具体的に何をやっているかはどうでもいい(カプセル化しているんだから、わからなくて当然)。使い方さえ分かればそれでいい。」
いろんな要素を集めて抽象化して、一行ではなく全体が簡単になるようにします。

オブジェクト指向は必須

規模が小さいうちでは、オブジェクト指向になっていなくても何とかなります。
でも、規模が大きくなってくると、まず間違いなく破たんします。


上記の例だと、IDがlong型だということを、オブジェクト指向を使わない場合はプログラム全体が知っていなければいけません。
もし、どこか一か所でもそれを知らずintと処理をしてしまえばプログラムが破たんします。
どこか一か所でも、です。
それは発見されるのでしょうか?
プログラムの規模が大きくなるにつれ、このようなミスを犯す箇所が増えていき、それに反比例して発見される可能性が下がっていきます。
オブジェクト指向否定派の人は言います。
「テストしてればわかる。しないやつが悪い。」


テストして動いたら大丈夫?
これが発見されるには、IDをInteger.MAX_VALUEを超えた状態にして、該当の個所をすべて実行しないといけません。
そんなテスト、規模が大きくなっても実現可能なんでしょうか?

それでも

オブジェクト指向否定派の人はこの問題をこう解決します。

long id = IDUtils.parseString(actionForm.getID());

「処理をまとめればいいんでしょ?」*1

オブジェクト指向を否定する一番の理由

(手続き型プログラミングの)経験者だから。


怖いこと

そんな人が書いたソースコードを、自分は保守しています。
そんなのを毎日見ているうちに、自分もそんなソースコードしか書けなくなってしまうんじゃないかと怖くなります。
ミイラ取りがミイラになってしまうんではないかと・・・。
現に、id:ryoasaiさんがJavaプログラミング能力認定試験課題プログラムのリファクタリングレポート(その1) - 達人プログラマーを目指してでやっていたようなリファクタリングを、自分はできる自信がありません。


だから、自分は少しでも知識を広げて吸収して、経験者ではなくプロとしての仕事ができるようになりたいです。

*1:オブジェクト指向なら、処理をまとめるのではなく抽象化していることが大事なんですが・・・。