- PR -

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

投稿者投稿内容
Beatle
ぬし
会議室デビュー日: 2003/06/09
投稿数: 394
投稿日時: 2004-01-27 14:47
※完全に乗り遅れてしまいました。

本題の「そもそもなんでソフトウェア開発にオブジェクト指向が利用・必要とされる
ようになったのか?」 ということですが、私が思うにオブジェクト指向の目的という
のは「JAVAを使う為」ということではないかと。

現在のWEB環境においてJAVAのメリット等は皆さんが書かれている通りでしょう。
そのJAVAの優位性等を最大限利用するに当たっては、オブジェクト指向を用いない
といけない(用いるのが最も良い)と見なされるからだと思います。効率・再利用
等の具体的なメリットはあくまでもJAVAの世界(つまり詳細以降)の話ですね。

モジュール間の関連従属性等を希薄なものにして、それぞれを独立なものとして
作り上げる、といった場合、コーディングは楽になります。効率も上がるでしょう。
再利用もし易くなります。が、もうひとつ前の上流の設計としては、時として互い
に関連付いた要件を関連付かないもので構築することになるわけで、より難しく、
工数も増大することもあり得るので、オブジェクト指向そのものはごくごく小さな
範囲のものなのかもしれませんね。
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-01-27 15:31
引用:

Beatleさんの書き込み (2004-01-27 14:47) より:
本題の「そもそもなんでソフトウェア開発にオブジェクト指向が利用・必要とされる
ようになったのか?」 ということですが、私が思うにオブジェクト指向の目的という
のは「JAVAを使う為」ということではないかと。



それは、「最近みんなオブジェクト指向って言い出したけど、なんで?」とか
そういうのの回答であって、「そもそも」に対するものではないでしょう。
skulker
常連さん
会議室デビュー日: 2003/11/13
投稿数: 41
投稿日時: 2004-01-27 16:04
引用:

objectさんの書き込み (2004-01-27 12:39) より:
私は、「Class」に対しては2つの視点から考える必要があると思っています。
1)Object(対象)を類別(Classify)するという方法論の一つを示す
2)類別(Classify)の実装としての「Class」
#「Classify」には分類という言葉も使われている様ですが、類別(数学的概念)の方が明確になると私は思います。

型の概念とクラスの概念とありますが、
クラスは型の一つである
と考えれば良いのではないでしょうか?
私は「強く型付けされたクラスベースのOOPL」がそんなに悪くは無いと私は実感しています。



概念としてのクラス(1の方ですね、"分類"のほう)の存在意義の話じゃなくて、クラスベースOOというコンテキストでのクラスの話(2)でした (曖昧ですみません)。
クラスベースが良い悪いの宗教論争にはあまり私は関心が無くて、クラスベースOOしか知らずにOOそれなりに解かったつもりになっていたもので、クラスは型じゃないんだよ! という議論を目にして、うーんと唸っている状態。C++やJavaでは明らかにクラスは型ですが。
C++のprivate継承みたいなのは別にしても、「継承はサブタイプ化じゃない」とかそういう主張もありますし。やれやれ奥が深いです。

# 私はケアレスミスが多いので、実際には静的型チェックの無い言語は恐くて使えません
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-01-27 16:51
引用:

skulkerさんの書き込み (2004-01-27 16:04) より:
クラスベースが良い悪いの宗教論争にはあまり私は関心が無くて、クラスベースOOしか知らずにOOそれなりに解かったつもりになっていたもので、クラスは型じゃないんだよ! という議論を目にして、うーんと唸っている状態。C++やJavaでは明らかにクラスは型ですが。


Javaにおけるクラスは、型と実装の両方を定義します。ただし、利用する際には型と実装を
区別して考える必要があります。たとえばMyClassという型で宣言された変数で参照できる
インスタンスは、MyClassというクラスのインスタンスとは限らないわけです。つまり
利用する側は型しか意識しない、従ってクラスとインタフェースを区別する必要がない、と
いうのが理想ですね。

引用:

# 私はケアレスミスが多いので、実際には静的型チェックの無い言語は恐くて使えません


私も型付けの強い言語が好きです。スペルミスも実行してみないと判明しないなんて、かえって
めんどくさいです

あ、また横道に逸れそうなのでとりあえず本題に戻しておくと、オブジェクト指向が必要と
されるようになったのは、繰り返しになりますが、複雑化したソフトウェアを扱うのに現状
ではもっとも優れた考え方だからでしょう。その視点からすると、プログラミングレベルでは、
型と実装の分離がオブジェクト指向の本質だと考えています。抽象的な型を通して利用できる
から、複雑な実装を意識せずに利用できる。また条件によって振る舞いを変える、といった
複雑な処理も、同じ型を持つ実装を取り替えることによって比較的容易に行うことができます。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-01-28 11:46
objectです。

>悪夢を統べるものさん
>だからこそ「オブジェクト指向言語」の「オブジェクト指向」だけを切り取るのが
>無意味なんです."Object-Oriented sth"であって,"Object-Orient"とかは普通は
>言いませんよね.
基本的な部分で誤解されているようです。
「Object-Oriented」
は、「Object」と「Oriented」を一体と考えてるからこそ
「-」
で繋いでる訳です。
「Orient(指向)」されてるのは、「Object(オブジェクト)」である訳です。
「Oriented」の用例をあげます。
Our products are male-oriented.
私たちの商品は男性向けです。
#「ワードパワー」から引用。

それから、これも基本的な話ですが、
例えば
「オブジェクト指向設計」
「オブジェクト指向言語」
という言葉に於いて、「設計」「言語」が付く事で「オブジェクト指向」の意味が異なるとします。
すると、それは「オブジェクト指向」という概念自体が、独立では無い訳です。
独立でない概念に対して、一定普遍な名前を付けるのは、言葉としては誤りです。
従って、逆に、「オブジェクト指向設計」「オブジェクト指向言語」という言葉を正しいとするなら、そうは考えない事が大切です。
つまり、「オブジェクト指向」の意味は
「オブジェクト指向設計」
「オブジェクト指向言語」
の共通部分に見出す事が出来る訳です。

要するに、「オブジェクト指向」として単独で議論する事には意味があります。
だからこそ、
「Object-Oriented(オブジェクト指向)」と私は単独で取りあげた訳です。


引用:

skulkerさんの書き込み (2004-01-27 16:04) より:

クラスベースが良い悪いの宗教論争にはあまり私は関心が無くて、クラスベースOOしか知らずにOOそれなりに解かったつもりになっていたもので、クラスは型じゃないんだよ! という議論を目にして、うーんと唸っている状態。C++やJavaでは明らかにクラスは型ですが。
C++のprivate継承みたいなのは別にしても、「継承はサブタイプ化じゃない」とかそういう主張もありますし。やれやれ奥が深いです。

# 私はケアレスミスが多いので、実際には静的型チェックの無い言語は恐くて使えません


私も、宗教論争には全く関心がありません。
宗教論争は、良い悪いという観点だけに問題があるのでは無いと私は思います。
本来一番厳しくなければならない筈の「ユーザー」が、相手の非難はするが、弁護する側にだけにまわる事に問題があるんだと私は思います。
そういう「ユーザー」は、結局自分を守っているという事に気付く必要があると思います。

少なくとも、「C++」を親とする言語は、全て兄弟です。
それぞれの良い所を垣根無くしっかり学び、それぞれの「言語」を少しでも良くする事で、
「ユーザー」が育って行く
これこそが最も大切なんだと私は思います。
頑張って下さい! (^^)v


[ メッセージ編集済み 編集者: object 編集日時 2004-01-28 13:16 ]
やまろう
常連さん
会議室デビュー日: 2003/10/13
投稿数: 35
お住まい・勤務地: 埼玉・東京
投稿日時: 2004-01-28 13:53
なぜオブジェクト指向を使うのか?

手続き型言語に出来なくて、オブジェクト指向言語には出来ること。
(トリッキーなことをすれば手続き型言語でもできるのでしょうが)

それは、

「呼び出す側のコード(処理の流れ)を再利用(局所化)する」

ことです。

例えば、似たような処理が10種類あったとして、

Aをする。
Bをする。
Cをする。
処理ごとに違う処理をする。
Dをする。
Eをする。

というものだったとします。

これを手続き型言語のC言語で実装すると

proccessA();
proccessB();
proccessC();
処理ごとに違う処理を書く。
proccessD();
proccessE();

と言ったコード10個書くことになると思います。つまり、
「処理ごとに違う処理を書く。」部分以外は同じコードが重複します。


オブジェクト指向言語のJavaでTemplate Methodパターン(親のメソッド内で
抽象メソッドを呼ぶ)で書くと、

public abstract class BaseProcess {
 public abstract void doProccess();
 public void templateMethod() {
  proccessA();
  proccessB();
  proccessC();
  doProccess();
  proccessD();
  proccessE();
 }
}

public class HogeProcess extends BaseProcess {
 public abstract void doProccess() {
  処理ごとに違う処理を書く。
 }
}

となって、HogeProcessクラスのようなコードを10個書きます。
10個書くのは
public class ○○Process extends BaseProcess {
 public abstract void doProccess() {
  処理ごとに違う処理を書く。
 }
}
のような処理ごとに違う部分のみであって
proccessAからEを呼び出すコードは重複しません。

このようにAをしてBをして○○をしてCをしてみたいな
同じような流れの処理があるときにオブジェクト指向言語では
「○○をして」以外の部分、つまり呼び出す側のコード(処理の流れ)を
一箇所にまとめることができます。

StrutsはこれをCommandパターン(親の型で呼び出す)によって行っています。
リクエストを受け付けて、○○をして、JSPに遷移というWebの定型的な処理の
流れを局所化して再利用しています。つまり「○○をして」がAction.execute()

でこれらが出来るのが、オブジェクト指向のポリモーフィズム(親の型でクラスを
呼び出すことによって子が誰であってもそのコードで呼び出すことが出来、
呼び出したインスタンスのメソッドが呼ばれる)です。

手続き型言語の型(構造体等)はその型がデータだけであるのに対して、
オブジェクト指向言語の型(クラス)はデータと手続き(メソッド)なので、
親の型で子の手続きを呼び出すことが出来る、これが肝だと思います。

つまり、オブジェクト指向言語では
フレームワーク(処理の流れを使いまわすもの)を作れる(作りやすい)、
これがオブジェクト指向を使う大きな理由だと思います。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-01-28 14:14
るぱんです。

言葉の意味論になってくるかもしれませんが、
「Object-Oriented」=「オブジェクト指向」ですよね。

指向する=目指すとかって意味と捉えています。

以上の前提に立って考えた時に、
「んじゃ、なんで目指してるんだよ!」ってな話になると思うんですけど、

クラスをオブジェクトに見立てて設計などをしてきてるわけで、
「オブジェクト指向とはなにか?」ってところは根本的にあいまいなままなのかと。

話を広げれば、「サーバーを人に見立てて設計できたらいいなぁ。」
だとか、「このルータを人に見立てたら、どんなメソッドを突っ込まないといけないんだ?」
になると思うんです。

そこから、それ踏まえて、
「どうやら、こういう時にはオブジェクト指向が良い!」
とかっていう切り分けが個人に委ねられていて、一般則なんて物が無いから
混乱してるんじゃないかな?と考えてしまいました。

でも、これって下手をすると、「クラスに何本のメソッドを搭載するべきか・・・」
だとか、「こういう場合にはこっちの方が良いか?」
になりがちで、

「一般的になりうるかどうか?」っていうめんどくさいのを考えてないからじゃないかと思うんですよね?

クラスを作る時は抽象化はしても、「超汎用的な方法論として」ソフトウェアエンジニアリングの分野で「抽象化」してないだけなんじゃないかと。

んで、オブジェクト指向のメリットにはならないだけかと。。。

フレームワークが作れる・・・とかって、
VBとかで一番上の階層のSub Mainを使いまわすのと変わらないんじゃないでしょうか?

「意識して作れるようになっている」=「意識して作った」は等価じゃないですし、
そもそも、根本的に「何故意識しないのか?」って所を押えては居ないんですよね。

ん〜。でも、これって、贅沢なこと言ってるよなぁ・・・。(反省
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-01-28 15:06
はにまるです。

引用:

やまろうさんの書き込み (2004-01-28 13:53) より:
なぜオブジェクト指向を使うのか?

    (中略)

これがオブジェクト指向を使う大きな理由だと思います。


初心者の意見として、そこを付くのはいい!

初心者がオブジェクト指向の入口を叩いた場合に、
こんな返答でどうでしょう!(ってお前もだろ!)
# オブジェクト指向=オブジェクト指向言語で御送りします。

未経験者 「オブジェクト指向って言葉を聞いたのだが、そんなに凄いのか?」
経験者  「どの言語でもデータの変数てありますよね?」
未経験者 「ああ、それが?」
経験者  「変数使わずに開発を考えられますか?」
未経験者 「そりゃ無理だろ!」
経験者  「命令文をデータの変数の様に使える事を考えれると凄いと思いません?」
未経験者 「そりゃ凄いな!」
経験者  「オブジェクト指向(言語)では、それが出来るんです!」
     「命令文を変数的に使わず開発をするなんて信じられない状態になりますよ!」

未経験者 「すっげーーー!」
(まだ食い下がる場合は、下へ続行)

未経験者 「それ、今の部品化と一緒じゃねーか?」
経験者  「でも、枠組み自体は、テンプレート化し、
      テンプレートをコピーして穴埋めする形を取っていますよね?」
未経験者 「ああ、それが?」
経験者  「そのテンプレート自信がプログラムの部品で、
      現作業で、穴埋めしている部分を引数として渡す事が出来るんです。」
未経験者 「凄そうだね...」
経験者  「開発途中や検証中に、テンプレートの不備や改善点って出てきませんか?」
未経験者 「当り前!事前に必要な物が全て解る訳が無い!」
経験者  「テンプレート自体が、プログラム部品なので
      その部品さえ直せば、部品から派生した全プログラムが勝手に直るんです。」
未経験者 「すっげーーー!」

後は、オブジェクト指向の基本概念をうんたら、かんたら、
って感じですかね?
とりあえず、興味を引かせるには、いいですね!

以上、
はにまるより、着色料たっぷりで伝え致しました。^^/~~


[ メッセージ編集済み 編集者: はにまる 編集日時 2004-01-28 15:09 ]

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