- PR -

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

投稿者投稿内容
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-01-26 10:22
若輩者ながら私の思うところを書かせていただきます。

このスレッドで白熱の煽りをされておられる方は、
おそらくC/perl等の手続き型言語で手が足りる業務を
主になさっているのだと思います(違っていたらご容赦ください)。
それはそれで必要ですよね。

移動手段に徒歩/自転車/バイク/自動車とあるように、
開発方法もさまざまです。近所に買い物に行く程度なら
大きな車はかえって不便ですし、何事をするにしても適材適所ですので、
一つの手段にこだわるのはどうかと。

よく言われることですが、特定の1言語だけを
みてたとえば『JAVA=OOP,C++=OOP』と考えるのは、
視野が局所的だと思います。

かくいう私も
Cでの開発で行き詰まりを感じてC++の
勉強をはじめた頃は(しかもそれを『銀の弾丸』と思い。
また、C++のコンストラクタ/デストラクタだけを使ってOOPだ!なんて)
C++=OOPだと思っていました。
しかし、C++の複雑な仕様を理解するのに苦労し、
OOPの本質を学ぶにはいたりませんでした。

その後、言語としては、
C/asm/basic etc ->C++->JAVA->Objective-C->C#
等を勉強し、平行して、OOPとはなんぞや?と
言語側面以外の一般論も勉強しました。
それぞれ言語としては一長一短。
ただ、OOPの考え方はどれにも適用できます。設計開発手法ですし。
OOP対応をうたっている言語はどれもそれぞれクセが違いますし、
様々なものを比較してみるのも理解を深めるにはかなり
役立つと思います。
そんな悠長な時間はない!という方も多いでしょうが、
そんなにすんなり利点を実感できるものではないと思いますよ。

C++に手を出したのは10年ほど前ですが、
OOPにわくわくしだしたのはつい最近のことです。
ある時『!』と、突然全てが繋がってどきどきしました。
いまだにこの感覚をうまく人に伝えられません。
というわけで、まず同僚に啓蒙中です。短い言葉でまとめるのは難しい。。

本格的にOOPを勉強したきっかけは
WebObjectsというプロダクトに出会ってからです。
今となっては、複雑なものを簡単にまとめ上げる良い例だと
思うのですが、最初はちんぷんかんぷんで。
くやしくてOOPの方法論を調べていくと、
WebObjectsにはそのエッセンスがてんこもりでした。
おかげで、Java/C#/C++stlのライブラリが意図していることもその後
なんとなくわかってきました。

『再利用』という切り口は、最初はあまりこだわらない方がいいと
思います。あとで使うことに縛られて複雑さが増すと本末転倒ですから。。

[ メッセージ編集済み 編集者: ナキヲ 編集日時 2004-01-26 10:24 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-01-26 10:27
引用:

るぱんさんの書き込み (2004-01-26 09:44) より:

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

メリット:
同上

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

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




僕の経験上の話でしかないのですが・・・

フレームワーク(クラスライブラリ等)を作成する場合は設計時の中・長期展望がないと意味が無いかもしれませんが、一定の業務に特化したシステムを作成する場合は下手に中長期展望を持つより、ミニマムな構成を心掛けた方が、分かりやすかったり、手を加える余地があったりと、再利用性、拡張性がある事が多いです。
というか、中長期展望を持った結果、ミニマムな構成になる事も多かったりします。
また、ミニマムな構成であるだけに、そのときのシステムの仕様に最適化されていて分かりやすかったり、安定していたりという利点があるため、一概にデメリットと、言えないかもしれません。
勿論、アーキテクチャ設計をないがしろにすることで上記のデメリットが出てくると思いますが、これはオブジェクト指向に限った話ではありません。

そう考えると、るぱんさんの回答にあるような

設計がしやすくなる

等のメリットがより強調される結果になるのでは無いかと考えます。

僕はこれにプラスアルファで

システムの構成を説明もしやすくなる

を付け加えたいです。

#個人的な雑感ですが、Cで組んでいた人が、オブジェクト指向になかなか馴染めない場合、
#そもそも手続き型の時に組んでいたコードが洗練されていない場合が多いです。
#ちゃんと責務に則ってモジュール化を心掛けていた人は、オブジェクト指向にもすんなり
#移行できている気がします。
#あくまで、僕の周りの話ですが・・・。
#追記:この雑感は上の文章となんら関係ありません。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-01-26 10:55 ]
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-26 10:35
るぱんです。
お返事ありがとうございます。

定形化処理 = 深く考えない方がいいかな?
非定形処理 = 深く考えてください。

と考えています。

個人的に、オブジェクト指向=ライフサイクル型開発を勝手に念頭においている嫌いがありますね。ご容赦願います。

意図を汲んで頂けました事、非常に嬉しく思います。
ありがとうございました。
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-01-26 10:54
引用:

フレームワーク(クラスライブラリ等)を作成する場合は設計時の中・長期展望がないと意味が無いかもしれませんが、一定の業務に特化したシステムを作成する場合は下手に中長期展望を持つより、ミニマムな構成を心掛けた方が、分かりやすかったり、手を加える余地があったりと、再利用性、拡張性がある事が多いです。
というか、中長期展望を持った結果、ミニマムな構成になる事も多かったりします。
また、ミニマムな構成であるだけに、そのときのシステムの仕様に最適化されていて分かりやすかったり、安定していたりという利点があるため、一概にデメリットと、言えないかもしれません。



まさにそれですね。同感です。
いろいろ作ってると、『明日できることは今日するな/今必要でないものは作るな』
という提言が的を得ていることを実感します。

シンプルな設計と実装を持ったミニマムなものが、その後必要とされるものの
原型になっていくことがしばしば。
Nishizaka
ベテラン
会議室デビュー日: 2001/10/12
投稿数: 83
お住まい・勤務地: 長崎県
投稿日時: 2004-01-26 11:24
こんにちは

JAVA なプログラマでは無いですが、アッセンブラから初めて、20年近くプログラム言語に関わっている化石のようなプログラマですが...。(^^;

「何故、オブジェクト指向を使われるようになったのか?」

を私なりに考えると、初心者にでも安全なプログラムを簡単に書けるようにする為だと
思っています。

昔のアッセンブラやCでのコーディングでの最大の悩みは

 ・配列のオーバーランアクセスによるメモリ破壊に依る誤動作
 ・開放忘れによるメモリのリーク

これを如何に無くすかが最大の感心事だったのです。
今のプログラマはClass等のオブジェクトの扱いになれて、こんな事に悩む事は殆ど
無くなったと思うのですが、昔は、自分で作ったプログラムでさえ、何処でメモリを
壊しているのか、どれで開放忘れしているのかを探すのはめちゃめちゃ大変でした。

それを解決する手段の1つがオプジェクト思考によりデータのカプセル化であったと
思います。

プログラム初心者でもオブジェクトでデータを扱っている限り、余程めちゃめちゃな
事をしないかぎり、これらの事は起こらないように成っていると思います。

異論がある人も居るかも知れませんが、私的にはこれがオプジェクト思考の起源では
無いかと思ってます。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-01-26 11:26
objectです。

テーマは「なぜオブジェクト指向を使うのか?」ですが、
技術的な問題から入ると、本質から離れると思いますし、焦点がボヤケると思います。
また、技術レベルに応じて種々の問題がさらに出て来る為発散してしまうと思います。

それで先ず、私の感じている「オブジェクト指向」に関して少し異なる観点から簡単に書いてみます。
#オブジェクト、クラス、インスタンスに関しては既知とします。

「オブジェクト指向」=「Object-Oriented」を考える場合、次の3つの概念が重要だと私は思っています。
1)オブジェクト
2)クラス
3)インスタンス
#1)は所謂「ドメイン」上のオブジェクト、つまりインスタンスが目指す最終目標とします。

そして、「指向」=「Oriented」は、どちらも「目指す」という理解で大きな違いは無いと思います。
#oriented:for or interested in a particular type of person or thing.
#指向:事物がある方向に向く。

「オブジェクト指向」が「Simula」から生まれたというのは有名です。
この時の目的が「シミュレーション」であったと言う事もみなさんご存知だと思います。
そして、「Simula」は、最初の段階からほぼ今の「クラス」と同じ機能を持っていた様です。

「オブジェクト指向」という言葉が、「Simula」との関連の中の、どの段階で出現したのか、正確な情報を私は持っていません。
しかし、上にあげた3つの概念が既にあったとすると、敢えて「オブジェクト指向」=「Object-Oriented」という言葉を使った事にはとても大きな意味があると思います。
つまり、「クラス」やその「インスタンス」ではなく、あくまで対象としての「オブジェクト」を「目指す」という事になるからです。

「オブジェクト指向」は、最終目標である「オブジェクト」を中心にした考えであり、
敢えて言うなら、「クラス指向」とは区別すべき考え方だと私は考えています。
#でも、私はクラスが重要で無いと言っている訳ではありません。
オブジェクト関連図)
            クラス
             |
オブジェクト<--->インスタンス

そういう意味では、最近「コンポーネント指向」という言葉を耳にしますが、
これは「インスタンス」中心ではありますが、「クラス指向」と比較し、より「オブジェクト指向」に近づいた形態であると思っています。

次に「なぜオブジェクト指向を使うのか?」に関して
それは「Simula」等の「シミュレーション」を考えれば分かりますが、
機能その他、「特別な何か」を「対象」から抽出する事なく、そのままに表現したい
という事に尽きるのでは無いでしょうか?
#そうでないと、問題領域の変化に応じて「抽出したもの」の意味を保ちながら保守をするという、別の負担を強いられます。

もし私が「シミュレーション」を行う場合、
途中で概念の切り替えをする事無く、そのままの形で対象を扱いたい
と考えると思います。
要するに、
「オブジェクト指向」は対象を「シミュレート」する事で処理しよう考えている
と私は考えています。
#もちろん、その「シミュレート」する範囲は様々ですが。

そして、この場合のメリットは、
対象が変化すれば、その変化そのものを反映させれば対応出来る事
そして
精度さえ上げる事が出来れば、対象にどこまでも漸近していける
という事に尽きると思います。
こくぼ
大ベテラン
会議室デビュー日: 2003/08/11
投稿数: 229
お住まい・勤務地: 国境の南、太陽の西。
投稿日時: 2004-01-26 11:56
引用:

Nishizakaさんの書き込み (2004-01-26 11:24) より:
こんにちは

JAVA なプログラマでは無いですが、アッセンブラから初めて、20年近くプログラム言語に関わっている化石のようなプログラマですが...。(^^;

「何故、オブジェクト指向を使われるようになったのか?」

を私なりに考えると、初心者にでも安全なプログラムを簡単に書けるようにする為だと
思っています。

昔のアッセンブラやCでのコーディングでの最大の悩みは

 ・配列のオーバーランアクセスによるメモリ破壊に依る誤動作
 ・開放忘れによるメモリのリーク

これを如何に無くすかが最大の感心事だったのです。
今のプログラマはClass等のオブジェクトの扱いになれて、こんな事に悩む事は殆ど
無くなったと思うのですが、昔は、自分で作ったプログラムでさえ、何処でメモリを
壊しているのか、どれで開放忘れしているのかを探すのはめちゃめちゃ大変でした。

それを解決する手段の1つがオプジェクト思考によりデータのカプセル化であったと
思います。

プログラム初心者でもオブジェクトでデータを扱っている限り、余程めちゃめちゃな
事をしないかぎり、これらの事は起こらないように成っていると思います。

異論がある人も居るかも知れませんが、私的にはこれがオプジェクト思考の起源では
無いかと思ってます。




自分的にとても興味深い内容だと感じました。CでStackやList構造を使おうと思っても自分で1から作らないといけないし、プログラミング初心者はまずデータ構造とは何ぞや、を理解することから始めないといけませんし。

そういう煩雑したことを考えるとJavaその他のOO言語は始めから完成されたAPIとして提供されているから使う側はホワイトボックス的に詳しく知らなくてもその概念と使い方がわかれば(おそらく)立派にプログラムができそうです。(部品のカプセル化とコンポーネント化)

「プログラムを安全に作成する上での基盤を提供してもらうためにオブジェクト指向を使う」

と考えるとすっきりしました。

疑問1:ただオブジェクト指向の定義も明確ではなく、Javaなどの言語仕様もまだまだ進化していきそうなのでオブジェクト指向自体もまだまだ進化系なのでは…?

疑問2:オブジェクト指向がプログラムの利便性を向上させてゆく、ということは最終的にどこへゆくのだろう…(完全なモデル駆動型のプログラム?)
skulker
常連さん
会議室デビュー日: 2003/11/13
投稿数: 41
投稿日時: 2004-01-26 12:57
引用:

objectさんの書き込み (2004-01-26 11:26) より:
「オブジェクト指向」=「Object-Oriented」を考える場合、次の3つの概念が重要だと私は思っています。
1)オブジェクト
2)クラス
3)インスタンス



クラスってそんなに重要なのでしょうか?
Smalltalk, C++, Java とクラスベースのOOPLだとクラスは所与の前提たる存在ですが、SelfみたいなプロトタイプベースのOOPLだと、そもそもクラスの存在意義を問うている訳で。

プロトタイプベースのOOPLについては何も知らないのですが、このところ訳がわからなくなりつつあり。
私は強く型付けされたクラスベースOOPLしか知らないので、型の概念とクラスの概念がごっちゃになっているようです。

参考
http://www.ogis-ri.co.jp/otc/hiroba/technical/Classification/index.html
とか。

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