電子書籍の厳選無料作品が豊富!

一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが、私はそれに疑問を感じます。
オーバーライドはクラス・継承に関わるためOOP特有のものであると思うのですが、オーバーロードはクラスとは全く切り離して考えられるからです。
確かにオーバーロードはクラスを作るときに有用な技術ではありますが、例えばC言語のような非オブジェクト指向言語でオーバーロードが使えたとしても、それなりに機能するはずです。
ひょっとしたら
「オーバーロードもオーバーライドもポリモーフィズムだろう」

「ポリモーフィズムといえばオブジェクト指向」
のような話の展開でしょうか(いや、さすがに無理があるか…)。

皆様はどうお考えでしょうか。
ご意見お聞かせ下さい。

A 回答 (4件)

おっしゃるとおり、オーバーロード・オーバーライドは非オブジェクト指向言語にもありました。


オーバーロード・オーバーライドは、「異なった関数(メソッド)を同じ名前で呼び出せる・・・引数の型・数によって実際に呼び出される関数が選ばれる」というトーンですが、ポリモーフィズムは、「1つの関数(メソッド)が引き渡される引数の型・数に応じて動作を変える」というトーンだと思います。
    • good
    • 0
この回答へのお礼

やはり、オーバーロードがオブジェクト指向言語特有のものであるという記述は誤りなのですね。
私自身勉強不足のため、オーバーライドも非オブジェクト指向言語に存在するというのは初耳でしたが。別の名前空間(?)で同じインターフェイスの関数が定義されている、というようなものでしょうか。そうやって考えると、OOPの説明にポリモーフィズムという言葉を用いるのはおかしいことになりますね。
ありがとうございました。

お礼日時:2007/04/19 16:21

No.3です。


さきの回答を書き込んだあとで「オブジェクト指向という言葉は何を指しているのか?」って解らなくなって、再度「オブジェクト指向でなぜつくるのか」を読み返してしまいました。つまり、オブジェクト指向が、システム開発のマネジメントやプログラム要求仕様書作成などのレベルを指し示すのか、実際のプログラミングのレベルを指すのか?ということです。
で、本書は12章のゴールに「オブジェクト指向は優れたソフトウエアを作るための手段」と書かれています。

つまり、「オブジェクト指向」は設計書を書いたりまとめたりする技術ではなく、「ソフトウエア作成を楽にする技術」なんですね。「要求仕様書だけオブジェクト指向で作成する」なんて無いし、また要求仕様書に要求される内容はそんなものではないですね。

C++に装備されたソフトウエア作成に有用な機能で、「これはオブジェクト指向の仲間と強弁すればできるよね?」っていうものもあるでしょうけど、現場からすれば、「そんな分類はそっちで勝手にやってくれ!」ってことなのかもしれません。

そして、最近は「オブジェクト指向」って文字を雑誌等で見る機会が減った気もします。同時に「オフショア開発」や「開発マネジメント」関係の記事をよく目にするようになった気がします。

で、「プログラマよりも高収入のSEをめざす」「プログラマはレベルの低い初心者のすること」「設計だけやってプログラムはインドに任せる」という風潮が強くなった気がします。ヨーロッパのルネッサンス期に「学問は実用的であってはいけない」という常識がありましたが、それをまねると、「ソフトウエア業界で上級であるには、プログラマであってはいけない」ってことかもしれません。

ここまで考えて納得しました。

「プログラムを自分で作らない人にとって、オブジェクト指向は無関係である」

「楽して儲ける」あるいは「同じ苦労するなら高収入のポジション」って考え、プログラミングやデバッグで深夜・休日出勤して頑張るより、SEやマネージャになって、デタラメや抜けがあってもコンパイラから怒られることの無い仕様書作りを仕事にしたほうがいいってことなんでしょう。
そして世の中の風潮が、そちらがメインになるなら「プログラム作成技術なんて奴隷がピラミッドの石を効果的に輸送する技術のようなもので、関心は全く無い」ってなるのも当然なんでしょう。

ですので、最初にもどって「オーバーロードはオブジェクト指向プログラミングの枠組みかどうか?」という議論も、プログラミングに無縁な「評論家」にとっては意味あるものでしょうが、現場のプログラマにとっては、そんな議論は無意味なことだと思います。
(この質問が無意味ってわけではありませんよ、いろいろ考えるきっかけになりました)

P.S.
大手IT企業で、「仕様書だけ作って、海外にプログラミングをまかせる」って職場にいた人の話を聞くと、それはそれは大変だそうです。プログミングは「製造工程」ではなく「設計工程の一環」であり、その工程から何度かのフィードバックは必須なんですからね。そしてソフトを発注する顧客の立場になれば、「バグの問い合わせに答えられるSEは、インドに居ます」って会社よりも、「ソースコードのどの行も私の頭に入っています!」って答えてくれる人のいる会社に仕事はお願いしたいですね。海外に発注して、バックドアを埋め込まれて、クレジット情報を人質に身代金要求されたって事件もあったようですしね。
    • good
    • 0
この回答へのお礼

再度の回答、ありがとうございます。

>現場のプログラマにとっては、そんな議論は無意味なことだと思います
確かにそうかもしれませんが。
ただ私としては、これからOOPを知ろうという人に対して、オーバーロードをOOPの1ファクターとして語ってしまいかねないと感じてしまったので、それはちょっと問題があるのではないかと。混乱させてしまうかもしれませんしね。
それに、評論家と対談できる程の知識・考察が必要があるかは別として、ある程度正しい認識をしていた方が、ベターなソースコードを書けるようになるために回り道をしないで済むような気もします。

それにしても、
>バックドアを埋め込まれて、クレジット情報を人質に身代金要求された
そんな事件があったとは…。

お礼日時:2007/04/22 01:27

>>一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが



それは、単に著者が、「オブジェクト指向プログラミング」をちゃんと理解していないだけではないかと思います。以前は自動車とトラック・自家用車の継承図を描いて「継承こそオブジェクト指向」っていうような記述の記事や書籍もあったわけですが、今は、「オブジェクト指向でなぜつくるのか」という本など「オブジェクト指向」にたいする正しい解説をした書籍も多いので、誤解した方は減ってきているのではないでしょうか?

発行日の古い書籍に、そういう記述が多いのでは?

なお、似たような誤解の例として、「C++はオブジェクト指向言語だから難しい」っていう認識もあります。もっとストレートにいえば、「C++はオブジェクト指向言語である」という誤解です。

C++は、例外処理、演算子の多重定義、リファレンス、テンプレート、名前空間といったオブジェクト指向とは全く関係ない特徴を多く持っています。これらは、全くオブジェクト指向とは関係ないですが、C++のプログラムをC++らしく作るには、いずれも重要な項目です。

ですので、これらC++の機能を見て「オブジェクト指向言語であるC++は難しい」って誤解されている可能性が大きい気がします。

オブジェクト指向だから難しいのではなく、前にあげた多くの機能と、Lisp言語系の思想が影響していると思えるテンプレート機能が手続き型言語に慣れた人(私も含めて)に、C++の理解を難しくさせているのではないかと思っています。
    • good
    • 0
この回答へのお礼

やはり筆者の誤りでしたか。今後、こういう記述がなくなることを願います。

>「C++はオブジェクト指向言語である」という誤解
それは私も感じます。
C++をやっているのにテンプレートを知らない人(昔の私もそうでしたが)が私の周囲にいますし。複数の要素がミックスされた言語の筈なんですが…。「C++はオブジェクト指向のC」とでも誰かが吹聴してるのでしょうか?

ありがとうございました。

お礼日時:2007/04/19 16:46

「ユーザ定義」というところを無視すれば, B から見れば C だって十分「演算子のオーバーロード」をしているんですけどね....


ちなみに Fortran90 では, ユーザ定義の型に対し演算子のオーバーロードをすることができます. Fortran90 におけるユーザ定義型は「オブジェクト指向言語のような継承はできない」という点で C の構造体とほぼ等価で, この点だけをとると「演算子をオーバーロードできる C」のような感じになります. ということで, 「オブジェクト指向でない, かつオーバーロード可能な言語」は実在します.
まあ, Fortran90 だと「ユーザ定義の新しい演算子」が作れてしまうんですが....
    • good
    • 0
この回答へのお礼

Cのオペレータオーバーロードは私も考えていました。組み込み型に対して行われていますもんね。
Fortran90は私は使用したことがないのですが、なるほど、まさにオーバーロード可能は非オブジェクト指向言語ですね。
ありがとうございました。

お礼日時:2007/04/19 16:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!