対象読者
- プログラマとして成長したい方
結論
- 自分の既存の知識のみで安易にプログラミングを行うのはよろしくない。
- より優れた、適した手法が存在するはずだ、と探求する姿勢が大切
根拠
本記事執筆のきっかけ
本記事は、私がオブジェクト指向布教時に受けた問い
「オブジェクト指向を使わなくても実装できるので、オブジェクト指向を使う理由はないのでは?」
に対する反論として書いた。
オブジェクト指向プログラミングは手続き型プログラミングから進化した、より良い問題解決の手段だ。大体の言語はマルチパラダイムになっており、手続き型としても、オブジェクト指向としても書くことが可能である。確かに、問題によっては、オブジェクト指向よりも手続き型の方が適していることがあるかもしれない。しかし、手続き型に慣れ親しんだという理由だけでオブジェクト指向を考慮しないことは合理的ではない。
そりゃ、実装のやり方はいろいろある。しかし、より適切な、より優れた解決手法が用意されているなら、それを用いるべきだ。
相対主義[1]
相対主義は文化や人によって評価基準は異なるのだから、絶対的な評価など存在しない、という論旨のもので、古代ギリシアにおいて流行った考え方だ(現代でもよくある考え方)。この考え方は万能であり、強力だ。あらゆる主張に対して、「でも、人それぞれだよね」、と反論が難しく、尤もな結論が出せるのだ。
プログラミングスタイルも人や目的に応じて合ったものがあるはずだし、絶対的に優れたものなど存在しない。確かにその通りだと思う。でも、その考え方では、現状を改善するという発想の芽を摘むことになる。
哲学者が相対主義から脱し、信念を持って真理を追い求めたように、プログラマもよりよいプログラミング技法を探求し続けるべきだと思う。
適した構文を使う[2]
手続き型プログラミングとは別名goto lessプログラミングや構造化プログラミングと言われている。goto lessプログラミングという名前が一番分かりやすい。
goto lessプログラミングとは、名前の通り、goto文を廃止したプログラミングだ。goto文は無節操に任意の行にジャンプでき、容易にスパゲッティコードを量産してしまうらしい。
そこでif文,for文,while文が考案された。これらは内部でgoto文と同じことをしていて、適切に処理の実行や順番を制御する。
例えば、for文とfor each文はどのように使い分けるのだろうか。for文はインデックス変数を変化させながらの繰り返し処理に適しているし、for each文は配列の要素による繰り返し処理に適している。それぞれの構文には適した用法があり、そのために発明されたのだ。
確かに、本タイトル通り、その方法でも実装は可能だろう。しかし、適した方法が用意されている場合はそれを用いるべきである。実装が可能であるという理由だけでコードは書くべきではない。
手続き型プログラミングでも実装できる
極論、機械語を直接記述することによっても実装は行える。これは極論過ぎて現実的ではないと思われるだろう。高級言語は、機械語と人間の言葉のギャップを補うために開発されたものであり、可読性を高めたり、保守しやすくしたりする効用がある。
程度の差こそあれ、機械語と高級言語の関係は手続き型プログラミングとオブジェクト指向型プログラミングの関係と同じである。
オブジェクト指向(Object Orient Programming 略してOOP)は手続き型の限界を補い、可読性や保守性、柔軟性を提供する機能を提供してくれる。 Why not OOP ?
参考
- 史上最強の哲学入門 [飲茶]
- コーディングを支える技術[西尾泰和]
コメント