- PR -

OOPがよくわかりません

投稿者投稿内容
YKID
常連さん
会議室デビュー日: 2002/04/09
投稿数: 29
投稿日時: 2002-12-10 15:48
こんばんわ、YKIDです。

#どんどん話題が派生していってますね。

引用:

tarnwoさんの書き込み (2002-12-10 15:09) より:
すべてのフィールドを public にすることは危険です。
外側のクラスから参照した場合,ほとんどのプログラマはstatic finalなものと思うのではないでしょうか。

絶対に自分だけしか使わないのであれば良いですが(良くないけど)
そのクラスを使って何か作れ!といわれると,品質が信用できないです。



その思い込みこそが危険ですよね。

全てのフィールドがpublicであってもその理由が明記されていれば、別に危険とも思えません。(理由が薄弱な場合は除く)
逆に、無意味かつ闇雲にアクセサ(getter,setter)を作るほうが、品質を落とす原因になると思うのですが。

#危険なコードとは、その意図や理由が第3者に伝わらないコードだと思いますよ。
tarnwo
ベテラン
会議室デビュー日: 2002/10/25
投稿数: 58
投稿日時: 2002-12-10 16:35
引用:

YKIDさんの書き込み (2002-12-10 15:48) より:
こんばんわ、YKIDです。

全てのフィールドがpublicであってもその理由が明記されていれば、別に危険とも思えません。(理由が薄弱な場合は除く)
逆に、無意味かつ闇雲にアクセサ(getter,setter)を作るほうが、品質を落とす原因になると思うのですが。



ちょっと表現が足りませんでしたね。
OOPの基本は,オブジェクトは内部の実装がどうなっているのかを隠蔽し、
可能な操作と属性のみを公開すべきと思うのですね。
そういう意味で,必要以上にpublicにするのはどうかと。
操作の不要なメンバ変数に対するアクセサも不要でしょう。

引用:

#危険なコードとは、その意図や理由が第3者に伝わらないコードだと思いますよ。



これは言うまでもありませんね

[ メッセージ編集済み 編集者: tarnwo 編集日時 2002-12-10 16:38 ]
sakito
常連さん
会議室デビュー日: 2002/08/25
投稿数: 23
投稿日時: 2002-12-10 16:44
引用:

悪夢を統べるものさんの書き込み (2002-12-10 13:17) より:
>まずデザインパターンは分析設計の分野です。決して実装の部分の概念ではありません。
これは同感.ただし,実装に密接に関係したものです.
設計というのは,本質的に実装と関係したものですから.
モデル化でさえそう.良いモデルを作成する際には実装まで考えて
モデル化します.それはJavaVM仕様書を見ればよく分かります.


分析・設計と実装はオブジェクト指向ソフトウェア開発においてはつかずはなれずな関係となります。
そこに分断はないです。
ただ、分析・設計は実装からある程度の距離感が必要です。
この距離感が難しいのです。

JavaVMの仕様書(最新の物)は設計とは別です。あくまでも仕様は要求定義の部分だと思います。
これだけの機能を実装せよ。それが要求である。と記述があるだけで、実装内部の定義はまったくありません。
よって設計はJavaVMの分析・設計者にまかせられます。
このため、jikesやその他のVMなどは根本的な設計がかなり異なります。

引用:

>つまりそもそも分析設計が正常におこなわれていればそういうクラスが
>発生する事はありえません。
また,これなどは原因と結果が逆な気がする.
「そういう肥大化したクラスが発生する設計は悪い設計である」
「そういうクラスが発生しないように設計する」
だけであって,
「正しい設計をすれば,そういうクラスが発生しない」
というものじゃない.


ただしくないクラスをださないための分析・設計というのは歪な設計です。
あくまでも分析・設計においてはそういうことを考えるものではありません。
分析・設計は問題領域を客観的に観察し、クラスを構築をおこなうという非情なまでに冷徹な行為です。
異常なクラスが出るのは己のセンスを恥じることはあっても、それが正しいのだと強弁するようなことをするのはおろかです。

引用:

>コード内容は分析設計では考慮しないものです。
>それは実装者が考慮する物ですからね。
こういう風に実装から乖離した設計は,意外に役に立たないもんです.


乖離に関しては距離感の問題です。
UMLのクラス図がどの程度実装を考慮しているかといえば、実際のところはそれほど考慮するものでもないでしょう。
実装できなそうだからUML図を変えるなどは本末転倒もいいところです。
YACとかPADは実装を考慮したといえますがそれは、コード直接書いてるのとあまり変わらず、設計というよりも分析・設計の実装側の飲み込み過程に過ぎません。

引用:

># しかし意外とオブジェクト指向という単語をしっていても
># その理論的背景を知っている人って少ないのでしょうか、、
理論的背景を知ってても,実際に役立たなければ意味がない.
結局は工学と理学の違いのようなもんじゃないですか.
#別に理学を軽視しているわけじゃないので念のため.


理論的背景しらずにオブジェクト指向のなんたるかは語れないです。
別にしらなくても経験だけでやってる、というのはおごりに過ぎません。
基盤なくして正確な理解はありえません。
役にたつ立たないで理論を語るのは変です。そもそもオブジェクト指向は理論により成立してる概念ですし、、、
理論しらずになぜUMLがああいう構成になってるのか、なぜそのデザインパターンがよいのかがどうやって理解しているのか疑問です。
経験的によさげだからよい、という理解なのでしょうか。
このあたりが疑問です。

引用:

YKIDさんの書き込み (2002-12-10 13:49) より:
で、私は、そうした用語の意味をあいまいなまま使ったり、そうしたあいまいな定義の用語を用いて説明するのは、齟齬を生みやすくするではないかと思うのです。


用語というのは実際は曖昧性はない場合はほとんどなのですが、理解者が無理解だと変な使い方になり勝ちです。
基盤がないとおかしいことになる。よって初心者がよく用語をおかしく利用するのは仕方ないことなのかもしれません。
まあ、あまり厳密に利用しても混乱を招く場合がありますが、、、

引用:

すべてのフィールドを public にすることは危険です。

その思い込みこそが危険ですよね
全てのフィールドがpublicであってもその理由が明記されていれば、別に危険とも思えません。


元発言は思いこみかどうかは不明ですが、このあたりの話は理論的に証明されていますので、議論の余地はあまりないです。
あとは、その問題領域の仕様によると思われます。

参考になれば。



H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-12-10 18:09
引用:

「属性(フィールド)」か「振る舞い(メソッド)」か、ということですが、私はメソッドこそ重要ではないかな、と思います。
クラスでは「カプセル化」と「抽象化」ということが言われます。
カプセル化というのは、皆さんの良く使うprivateってやつで、不正な値や矛盾した値が入らないようにする、つまりフィールドを外から触らせないこと。
抽象化というのは、例えば座標上の点を表すクラスがあるとしましょう。これはデカルト座標としても極座標としても値を得られるクラスだとします。
そのクラスを使う側からすれば、フィールドとしてデカルト座標で値を保持していようが極座標として保持していようが、両方を持っていて整合を取っていようが関係ないわけです。その値をfloatで保持していようがdoubleで保持していようが、二進化十進数で保持していようが、それも使う側では意識しなくて済みます。これが抽象化です。抽象的な「座標の点」のサービスを提供し、フィールドを外から意識させないことです。



ちょっと待ってください。属性と振る舞いが両方あってこそオブジェクトです。どういう意味で「フィールド」と言われているのかちょっと分かりませんが、privateにしてしまうから関係ないというのはおかしいと思います。そのオブジェクトがどのような属性を持っているのかは振る舞いを決めることと同じぐらいに大事です。

オブジェクト指向でモデリングだとか、設計だとかするときには
「このオブジェクトはこのような属性をもち、このような振る舞いをする。さらに、これらのオブジェクトとこういった関係がある」
といったモノを構築するわけで、privateだのpublicだのdoubleだとかを持ち出すのはちょっと違うかと。その名の通り「オブジェクト」指向です。だから一方的にメソッドのほうが大事なんだ!というのはそれこそオブジェクト指向ではありません。

それから、「属性」と「振る舞い」しか話題が出ていませんので、「関係」というのも付け足しておきます。
#もっと白熱するかな

[ メッセージ編集済み 編集者: H2 編集日時 2002-12-10 18:10 ]
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-12-10 18:26
>通称「憂鬱本」とよばれる以下の書籍を参考にしてください
>http://www.amazon.co.jp/exec/obidos/ASIN/4881356194/

よく見ると,UML,CASEツール,オブジェクト指向設計,C++.
おまけに悪名高き多重継承なんて章まである.....
#少なくとも,これから判断する限りでは,私ならこの本はお勧めしません.

Java,デザインパターン,リファクタリング,エクストリームプログラミング
という私とは,話が全然かみ合わない理由が分かった気がします.
sakito
常連さん
会議室デビュー日: 2002/08/25
投稿数: 23
投稿日時: 2002-12-10 19:14
引用:

H2さんの書き込み (2002-12-10 18:09) より:
ちょっと待ってください。属性と振る舞いが両方あってこそオブジェクトです。どういう意味で「フィールド」と言われているのかちょっと分かりませんが、privateにしてしまうから関係ないというのはおかしいと思います。そのオブジェクトがどのような属性を持っているのかは振る舞いを決めることと同じぐらいに大事です。


何事にもバランスは大切だと思います。

引用:

それから、「属性」と「振る舞い」しか話題が出ていませんので、「関係」というのも付け足しておきます。
#もっと白熱するかな


いくつかの前にぼくは関係に関して言及してます。
操作により関係が構築されるという感じです。

引用:

悪夢を統べるものさんの書き込み (2002-12-10 18:26) より:
>通称「憂鬱本」とよばれる以下の書籍を参考にしてください
>http://www.amazon.co.jp/exec/obidos/ASIN/4881356194/
よく見ると,UML,CASEツール,オブジェクト指向設計,C++.
おまけに悪名高き多重継承なんて章まである.....
#少なくとも,これから判断する限りでは,私ならこの本はお勧めしません.
Java,デザインパターン,リファクタリング,エクストリームプログラミング
という私とは,話が全然かみ合わない理由が分かった気がします.


この本は1998年に出版された本で著者がJavaを単語しか知らない人なので一部に問題ありますが、あくまでもオブジェクト指向とは、を説明した本です。
オブジェクト指向の基本事項はたいがい抑えてあります。
無論多重の継承が可能であることは説明してあるのはオブジェクト指向の説明としては当然だと思います。
#中ではあまり利用しないでね、って記述があるのですが、、
#当然継承に関してもあんまり利用しすぎはよくないって記述があります。

Javaによりあった本としては
オブジェクト指向とコンポーネントによるソフトウェア工学
http://www.amazon.co.jp/exec/obidos/ASIN/4894712636/
ですが、あまり基礎的って感じではないですね。。
あわせて読むと適切かもしれません。

#しかしぼくの記述は極端に読めるみたいだ。
#もうすこし緩やかな記述をつとめたいです。

H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-12-10 21:12
引用:

sakitoさんの書き込み (2002-12-10 19:14) より:
何事にもバランスは大切だと思います。


当たり前ですね。

引用:

sakitoさんの書き込み (2002-12-10 19:14) より:
いくつかの前にぼくは関係に関して言及してます。
操作により関係が構築されるという感じです。


読みましたよ。でも、あまり重点を置いていなかったように受けましたし、「操作こそ関係」と書いてありましたので操作と関係を同じものとしていたのかなぁと思ったので前記の投稿をしました。

何となく違うなぁと思うのが、「操作により関係が構築される」や「属性にあわせてメソッドを作成する事はない」などの振る舞い(メソッド)がオブジェクトの中心であるという部分です。「関係があるから操作が必要」と言えるし、「この属性の操作のためにメソッドを作る(特にBeanのプロパティはそういう傾向があります)」というのもアリだと思います。もちろん極端な話をされているのは分かりますが、初めてオブジェクト指向を触った人が誤解すると困ります。

また、オブジェクト指向とはアイディオロジーであり、メソドロジーではありません。ですので、「これがオブジェクト指向においての正しいやり方だ!」という答えはないかと。悪夢を統べるものさんが取るデザインパターン・リファクタリングのような実装フェーズを頭に置いた開発過程でも、sakitoさんが言われるような分析・設計を重視した開発過程でもどちらでも良いのではないでしょうか。バランスと言うやつですね。
(個人的にはsakitoさんのような分析・設計を重視していますが。)

引用:

Javaによりあった本としては
オブジェクト指向とコンポーネントによるソフトウェア工学
http://www.amazon.co.jp/exec/obidos/ASIN/4894712636/
ですが、あまり基礎的って感じではないですね。。
あわせて読むと適切かもしれません。


お勧めですか。メモメモ・・・。興味があるので早速読んでみたいと思います。感想はまた後ほど。
sakito
常連さん
会議室デビュー日: 2002/08/25
投稿数: 23
投稿日時: 2002-12-10 23:30
引用:

H2さんの書き込み (2002-12-10 21:12) より:
引用:

sakitoさんの書き込み (2002-12-10 19:14) より:
何事にもバランスは大切だと思います。


当たり前ですね。


ええ。でも意外に実践はできない物です。
かたよってしまう事も多く反省しなければとよく思います。

引用:

H2さんの書き込み (2002-12-10 21:12) より:
引用:

sakitoさんの書き込み (2002-12-10 19:14) より:
いくつかの前にぼくは関係に関して言及してます。
操作により関係が構築されるという感じです。


読みましたよ。でも、あまり重点を置いていなかったように受けましたし、「操作こそ関係」と書いてありましたので操作と関係を同じものとしていたのかなぁと思ったので前記の投稿をしました。


まあこの場で全てを書いているわけでないし書ききれないので(^_^;

引用:

何となく違うなぁと思うのが、「操作により関係が構築される」や「属性にあわせてメソッドを作成する事はない」などの振る舞い(メソッド)がオブジェクトの中心であるという部分です。「関係があるから操作が必要」と言えるし、「この属性の操作のためにメソッドを作る(特にBeanのプロパティはそういう傾向があります)」というのもアリだと思います。もちろん極端な話をされているのは分かりますが、初めてオブジェクト指向を触った人が誤解すると困ります。

また、オブジェクト指向とはアイディオロジーであり、メソドロジーではありません。ですので、「これがオブジェクト指向においての正しいやり方だ!」という答えはないかと。悪夢を統べるものさんが取るデザインパターン・リファクタリングのような実装フェーズを頭に置いた開発過程でも、sakitoさんが言われるような分析・設計を重視した開発過程でもどちらでも良いのではないでしょうか。バランスと言うやつですね。
(個人的にはsakitoさんのような分析・設計を重視していますが。)


なっとくできます。ぼくはある程度人に印象を与えるために一定方向に傾斜した文章を記述していますが、この記述で再考しない人はどちらにしてもあまり認識が深くならない可能性もあります。
つねに他者の記述した文章に対しては鵜呑みにせず、自己で検証する行為が必須と思います。
なんとなく違うな、って部分から、いろいろ検証再考察し、こうだからこの場合は違うというある程度の明確さを保持できるようになると、設計などによい影響があるのかもしれません。

引用:

引用:

Javaによりあった本としては
オブジェクト指向とコンポーネントによるソフトウェア工学
http://www.amazon.co.jp/exec/obidos/ASIN/4894712636/
ですが、あまり基礎的って感じではないですね。。
あわせて読むと適切かもしれません。


お勧めですか。メモメモ・・・。興味があるので早速読んでみたいと思います。感想はまた後ほど。


まあ、あくまでも参考という事で(^_^;

# 結構話しふくらんじゃいましたね。。息切れぎみです。
# まあすべて参考までにという事で。自己検証はわすれないでくださいね。
# ここ読んだ方へ。

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