- PR -

なぜオブジェクト指向を使うのか?

投稿者投稿内容
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-01-25 18:33
「なぜ、OOPLを使うか」「なぜ、Javaを使うか」と尋ねられたら、
「そうするのが楽だから」というのが、私にとっては一次的な回答です。
とにかく、詳細設計〜実装段階での作業が楽になりますから。

再利用性とか保守性に関しては、「OOだから」というメリットは感じません。
OOPLだろうがそうでなかろうが、再利用が可能な「ちゃんと考えられた」コンポーネントを
作るには、「その場だけの」コンポーネントを作るのに比べて何倍も手間がかかるものです。
保守性の良否は基本設計の良否に依存するので、OOかどうかには(直接的には)無関係です。

それに比して、実装段階でのメリットは非常に明らかで、数万行規模のシステムの場合だと、
Cに比べてJavaで実装すると手間が1/2〜1/3になる、というのが実感です。
(ただし、CとC++の相違より、C++とJavaの相違の方が大きいと感じるので、これはOOPLゆえの
メリットではないのかも・・・)

他方では、「Javaを使っても楽にならない局面」というのも、いくらでもあるわけです。
小規模なCGIだけで構築できるサイトを実装するのであれば、無理にJavaを使っても
「アプリケーションサーバやらフレームワークやら、大仕掛けを持ち込んで面倒になるだけで、
ちっとも楽にならない」ということになるのも当然でしょう。

一時はJavaの利点として喧伝されていた「アプレットによるクライアントサイドアプリ」は、
実際にはまるでメリットがないので注意する必要があるかと。
もっとも、「C++でActiveX」というアプローチを採っても、ちっとも楽にならないのですが(笑)。
(この分野に関しては、MSべったりになってもいいからC#に期待したいところです)
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-01-25 19:54
ukさんにすっきり整理して頂きましたが、私としても趣旨を明確にして
おけばよかったですね。
どういうことかと言いますと...
まず、この話題は「なぜオブジェクト指向を使うのか?」であって、
「なぜオブジェクト指向言語を使うのか?」ということではないと
理解しています。
「なぜ使うのか」といえば、それは少なくともなんらかのメリットが
あるはずで、それをCのプログラム*だけ*をみて探ろうとすると、
「非オブジェクト指向言語のCでわざわざオブジェクト指向の書き方を
している場合というのは、オブジェクト指向のメリットが端的に現れて
いる例だろう。典型的な例ではないけれども。(「典型的」なのは
オブジェクト指向言語で書かれているだろうから)」
という観点にたどりつきます。

もちろん、これは大きく偏った視点であって、「正解」を得ようと
するものではないけれども、まあこういう視点もある、ということで。


引用:

ukさんの書き込み (2004-01-25 15:13) より:
ただし非OOPLでオブジェクト指向的なプログラミングを行うと、どうしてもトリッキーな
部分が出てきてしまい、


そうですね。
Cで書く場合、データを収めた構造体の中にそのデータを操作する
関数へのポインタをいっしょに格納しておいて、関数のポインタ
呼び出しを使う、という手がありますが、意図を知らずにコードを
読むと「なんでこんなけったいなことをやっとるんじゃ?」という
ことになります。関数を呼び出すところをマクロにすると字面が
すっきりしますが、そうして動的束縛をやっているといよいよ
トリッキーになるという
# 「あれ、この関数は呼び出し元によって処理内容が違うぞ?」と。
# 本当は「関数」ではないわけですが。

あと、そうやって作った「インスタンス」を複数利用できるように
しようとすると、初期化の際にメモリを確保して構造体を作り、
その構造体へのポインタを呼び出し元に返す、という処理を
プログラマが書かなきゃならないとか、なにかと面倒で。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2004-01-25 20:00 ]
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2004-01-25 23:37
>>ただし非OOPLでオブジェクト指向的なプログラミングを行うと、どうしても
>>トリッキーな部分が出てきてしまい、

>そうですね。
>Cで書く場合、データを収めた構造体の中にそのデータを操作する
中略
>プログラマが書かなきゃならないとか、なにかと面倒で。
加えてメモリ管理も手作業でやるか,さもなくば自分でGCを作らなければならない.

ここまで毎回作っていると,おそらくはオブジェクト指向を使うメリットよりもデメリット
の方が遙かに大きくなるでしょう.そこで共通に使えるフレームワークとか再利用
可能なモジュールとかを作る必要が出てくる.ポリモフィズム,カプセル化,継承
自動メモリ管理(GC)などを実現するモジュールをです.そのようなモジュールが
実現され広く普及しない限りオブジェクト指向は成功したとは言えないでしょう.

で,その再利用可能なモジュールというのが,オブジェクト指向言語やランタイム
(或いは仮想マシン)と呼ばれたりするだけなんですよね.
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-01-26 00:19
>言いたいことが伝わっていないですね・・・
>OOだからでてくる欠点ではないのですよ。なので、このスレッドでこの話が出てくるのは
>筋違いです。

せやから、似たような欠点があるなら特に「何が何でも OOPL, 何が何でも Java」に拘る必要
は無いんやな?
ジャンボカレー
会議室デビュー日: 2003/05/26
投稿数: 17
投稿日時: 2004-01-26 01:32
るるるです。
皆さんの書き込みを興味深く読ませてもらいました。ありがとうございます。
流れも良い方向に進んでいると感じています。
「なぜオブジェクト指向をつかうのか?」このスレッドのゴールはこの問いかけ
に対する答えを得る事です。(と私は勝手に思っています)

さて、「オブジェクト指向ってなんですか?」もし会社の同僚や初心者
やクライアントの人にそう聞かれたら皆さんはどう答え(説明)しますか?
「オブジェクト同士がお互いにメッセージを発しあい(中略)です。」
「特徴としては継承、ポリモーフィズムなどなど。。。」
きっと十人十色の答えがあるでしょう。

私は最近、これらオブジェクト指向用語がいきなり出てしまうのは実は間違い
なんじゃなかろうか?そして、これらの用語のせいでオブジェクト指向の本質に迫り
にくくなってしまっているんじゃないか?そういったような事を考えています。
つまり、それぞれのオブジェクト指向用語の意味することが、すごく便利に聞こえたり
(うまく利用すれば実際便利)とてもスマートに思えるため、用語に視線が釘付け
されてしまうということです。

もし、私が先ほどの質問に答えるとしたら、「ソフトウェアの複雑性」
というキーワードを使うと思います。
「ソフトウェアの複雑性をうまく扱う方法・考え方の一つです。」といった
感じです。各用語を説明する場合にも「複雑性を扱う」ということを意識
するようにします。すると伝わり方もだいぶ変わってくるんじゃないでしょうか?

そして、この「複雑性をうまく扱う。扱える。」がオブジェクト指向の
本質に近いところにあるんじゃないか。今のところ、そう考えています。
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2004-01-26 02:38
引用:

コブラさんの書き込み (2004-01-26 00:19) より:
>言いたいことが伝わっていないですね・・・
>OOだからでてくる欠点ではないのですよ。なので、このスレッドでこの話が出てくるのは
>筋違いです。

せやから、似たような欠点があるなら特に「何が何でも OOPL, 何が何でも Java」に拘る必要
は無いんやな?


もっと噛み砕いて発言していただけないでしょうか?

貴方の発想はオリジナリティが豊か過ぎて、これだけの文章では言いたいことが伝わりません。
ありふれた頭脳の私には、貴方がいわゆる「電波系」の方に見えてしまって困ります(笑)
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2004-01-26 09:25
みなさんこんにちは。

プロジェクトを組んで開発するような大規模案件では、確かに
オブジェクト指向を使って複雑性を整理するのが有効だと思いますが、
皆さんは、自分の脳内設計程度で完結してしまうプログラムでも、
オブジェクト指向を使われているのでしょうか?
(そもそもそんなに小さいプログラムは作らないとか...?)
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-26 09:44
るぱんです。
自分なりの意見をまとめてみました。

命題:
何故オブジェクト指向を使うのか。

自分なりの回答:
設計がしやすくなる。
モジュール間の結合が蜜から疎にできる為。

メリット:
同上

デメリット:
戦略性、中・長期展望が無い場合、再利用性、拡張性が下がる。

※再利用性が高いのではなく、再利用性を高くすることを意識すると、保守、追加開発、修正が楽になる。という認識をしています。

以下雑談:
つまり、プログラミングサイドと設計サイドがあるとした場合、設計サイドがしっかり
戦略性、中・長期展望を意識しない場合、無駄なつくりになるケースが多いのではないか
と考えています。
(この場合、設計サイドには分析・設計・要件定義を含みます。)

というわけで、「EA」だとか、「ドメイン分析」だとかが出てきているのではないかと。
また、最近のDBにおける「メンテナンスを2年放っておくと再利用しにくくなる。」
といった内容の記事等が取り上げられている事も納得できるのではないかと。

従来のスーパーエンジニアが何を言っているかわからない状態から脱却したはずが、
また元の状態に近くなっていると考える今日この頃です。

スーパーエンジニアが行っていた業務を複数人数で行って、更に複雑にしたような気がします。
跳ね返った人達が「こっちの方が楽だ!」と言ったにもかかわらず、
仕事量が増えたのではないかと。

結局「できるやつはできる。できないやつはできない。」あたりに
落ち着いてしまうのかなぁ・・・?と考え、
「今の作業は無駄なのか?」と不安に思ったりします。

スキルアップ/キャリアアップ(JOB@IT)