1 :
オブジェ・デザパタ :
2010/05/02(日) 22:28:28 結局、オブジェクト設計、デザインパターンを使えるのは、ジャカルタ・プロジェクトみたいな 優秀な集団だけなんだよね。 オブジェクト設計がどうした? デザインパターンがどうした? とアホ面してStrutsなど使って たやつって何なのさ。StrutsのActionにスパゲッティソース書いていたので、Strutsが泣いていたよ。 大手の上位層の連中しか使わないのが、オブジェクト設計、デザインパターンなんだろうな。 と、上司に皮肉られた私である。 実際に、自作の、または参画しているプロジェクトで作成しているPGにオブジェクト設計、デザインパターン を使っている天才諸君、どうやったら使えるようになるの?
設計って意図してやると言うより、自然に出来ている物だと思う。 デザパタとかの知識だけ増やしてもあまり意味無い様な…
3 :
デフォルトの名無しさん :2010/05/02(日) 22:50:45
情報工系の大学生なら普通に使ってるだろ。 とくにデザインパターンなんて単なる「あるある」のマトメなんだから、 天才とかどうとかじゃなくてプログラム書いてりゃ普通に身に付くし、よく考えたら当たり前のことだろ。 ジャカルタがどういう体制で開発してるかしらんが、ぬわんじゃこりゃってAPIのライブラリも結構ある。ぬわーファクトリふぬーファクトリクラスとかな(笑)馬鹿かテメェって感じだわ。
ま、たしかに言葉遊びのようなもんだけど 騙される方も悪いわな 私怨はマ板で
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
6 :
オブジェ・デザパタ :2010/05/03(月) 00:11:16
やはり、大手IT企業の天才様はこのようなスレには書き込んでくれないみたいだ。 寝ることにするわ。
>>5 頼むから、いちいちアイちゃんの言語訓練に2chを使うなよ。
人の迷惑とか考えないの?
京都大学霊長類研究所って無能の集まりなの?
アイちゃんが勝手に立てちゃったんだから 許してやって下さい
オブジェクト設計&デザパタをやって、何かよくなると期待するのが間違い。 何をしようがよい設計をする人はよい設計をするし、 ダメな人はダメなんだから、良くも悪くもならないものだと考えておくべき
デザパタなんて基礎中の基礎だろ。 デザパタがわかるからといって、うまい設計ができるわけではない。 もちろんデザパタもわからんカスは設計なんてやるべきじゃない。
12 :
デフォルトの名無しさん :2010/05/03(月) 10:38:40
知ったかぶり多いな。
デザパタの話は大抵そうなる。
14 :
デフォルトの名無しさん :2010/05/03(月) 11:17:07
ほんとうにデザパタを使いこなしているやつらは2ちゃんには来ない。
使いこなすというほど大したもんじゃない。
>>1 >大手の上位層の連中しか使わないのが、オブジェクト設計、デザインパターンなんだろうな。
たしかに上司の言う通り。いろんな会社にいったけど、まともなフレームワークを作れるは大
手のR&D部署ぐらい(製品開発をやっている所ではない)だったな。そういう所は、勉強す
るの好きだったり、経費でコンサルを雇っていたりする。
少なくとも派遣主体でころころ人が変わる所、休憩時間にゲームや漫画とか読むのが好きな
人が多い所で、そういう開発を実践できているところはいないなあ。
オブジェクト設計とかwww デザパタとかwww オブジェクト指向なんて不自由な環境にいるから余計なものを有難がってるって早く気づけよwww
18 :
デフォルトの名無しさん :2010/05/09(日) 22:19:16
>>17 大手のSE,プログラマと接触してみる機会をもったら目から鱗です、よwo.
犬小屋作りからスカイツリーまで十把一絡げにする人がいる
20 :
デフォルトの名無しさん :2010/05/10(月) 07:07:08
犬子屋作りにオブジェクト設計、デザパタ適用を行う必要はない、と言われている。 そこそこの建物になったら使うべき。ちなみにデザパタは適用なのね。適用≠使用ではない。 レベルの低すぎる人は勉強しよう。という私も低いんだが。。。。
Strutsが悪い!
22 :
デフォルトの名無しさん :2010/08/29(日) 17:50:48
scheduled age heigh ass hole ! happy?
>>20 それはおかしくね?
デザパタは別に、規模の大小に関わらず、
あるよくある問題に対する 伝統的解決法やテクニック的な解答の識別子 であって、
規模が小さいから使えないとか、大きいから有効とかって物じゃない。
オブジェクト指向についてなら、まぁ分からなくもないけど、
小さいからこそ、しっかりオブジェクト指向で設計しとくと
他への流動性が上がりやすいんだけどな。
あと、やたらと一からオブジェクト指向で設計せねば!みたいな印象をうけるけど、
リファクタリングの際についでに、とか、ひとまず最低限の要求仕様を満たしたから
次のステップの前に。とかでスクラップアンドビルド的にやる方がマトモだと思う。
つか、人間に一から完全を求めるのはいい加減やめるべき。
デザパタはともかく、MVCをまともに実装してるのを見たこと無い。
>>24 まずは、Smalltalk-80のMVCのどこに問題があるのか、そこから語ってもらおうか。
>>25 Smalltalkはいいけど、JavaのMVCとか糞じゃん。
MVCで作りましたってコードは大抵ModelとControlerが破綻してるし。
MVCどうこう言うより、generics以前のJavaのフレームワークは糞。
Javaより、Cocoaのフレームワークの方が綺麗だな。
そもそもMVCは糞
つうか、MVCなんていう30年も昔のフレームワークをドヤ顔で教えて自己満足してるオッサンが オブジェクト指向の進歩を妨げているのだが、怖くで誰も言えない罠w
最新の代替案をkwsk
MVCよりはMVVMのほうが理にかなってると思われ。
AbstractionModel - DiscourseModel - InteractionModel
35 :
デフォルトの名無しさん :2011/05/04(水) 23:19:45.18
MVVMってControlerとModelが理解できず、VBのFormとクラス一体のスタイルから抜け出せない馬鹿向けじゃん。 TextModel text = new TextModel(); Menu copyMenu = new Menu(); TextArea textView = new TextArea(); copyMenu.addAction(new TextCopy(textModel,textView)); 例えばこのコードなら、TextCopy Controlerは、ViewとModelが変わっても使いまわしし続けられるけど、 MVVMモデルだと組み合わせごとにTextCopyを毎度ViewModelやらに書くわけだろバカバカしい。
香ばしすぎるwww
37 :
デフォルトの名無しさん :2011/05/07(土) 17:55:55.82
MVPの質問(相談)ってここでいい? Presenterって、Viewを構成するコントロールの具体的(物理的)な種類に 依存すべきでないでない認識だけど、あってる? たとえば、View上の数値入力欄が ただのテキストフィールドなのか、スピンコントロールなのか、 はたまた スライダーコントロールなのかを、Presenterは知らなくていいよね?
知らなくていいと思います。 ただeventから取れる場合はともかく、selfから取る場合には、 実装(というか処理系というか)により適切なコントロールの具象にキャストしないとダメかも知れません。
オブジェクト指向のこころ読み始めたけどよくわかんねえ
41 :
デフォルトの名無しさん :2011/10/08(土) 19:20:18.35
オブジェクト指向スレは3スレ目位で話題がなくなるな 前あったOOPスレも3スレで終わったし
>>41 ちょうど むだなOOPゴミスレも掃除できたし良かったんだよ。
次はここを消費してOOPが消えればいいかも 爆
43 :
デフォルトの名無しさん :2011/10/12(水) 20:29:02.44
commandやobserverパターンなど、デザパタのうち幾つかは クロージャとか関数オブジェクトを採用すると不要になったりしないかね?
44 :
デフォルトの名無しさん :2011/10/12(水) 20:33:43.47
方法そのものが無くなるわけじゃないけど、 「forループ」にわざわざパターン名を付けないように、 言語レベルで概念が用意されてれば、その世界では パターン名は不要だね。
functional design patternとかでググったら色々要らなくなったよって記事が出てきたはず(英語)
>>43 名前は忘れ去られるかもしれないが、考え方自体はなくなるのではなく、新たな言語パラダイムが作用して、別のパターンがうみだされるんじゃないかな。
47 :
デフォルトの名無しさん :2011/10/13(木) 15:19:06.77
オブジェクト指向設計とデザパタを勉強中の者です。 オブジェクト指向設計とデザパタは大手企業はガンガン使いこんでいるが、 一般的には使われていないのではなかろうか? と最近思い始めています。 使えなくて使わないのか、短納期で設計の時間がなくて使わないのか、 いまいち、その辺の事情がわからんです。 まさか必要がないと判断されているのぉ??? 情報通の方、この点について教えてください。 必要がないならこんな糞難しいものを勉強するのはやめます。
頻出問題に対する一般解答だと思ってくれればいいよ。
頻出問題に対する一般解答 うまいこと言うね デザパタは特定の頻出問題についての上手な実装方法だから 局所的に使われる傾向がある(シングルトンにする必要があれば使うし、なければ使わない) オブジェクト指向設計ってのは「設計方針」なんで広く浅く普及してると思うよ 今時のフレームワーク使ってたら自然と(とはいえ漠然と)身についてると思う
シングルトン使う奴はテストを考えていないイケヌマだと思う
シングルトンはどうでもいいやw あれはデザインパターンの練習問題みたいなもの。 シングルトンにしたければフレームワーク側で 制御してくれる。
>>47 どんな問題があって、それをどのように解決してるのかだけ、ざっくり頭に入れとくといいよ
じっくり学ぶのは必要になってからでいいじゃん
> オブジェクト指向設計とデザパタは大手企業はガンガン使いこんでいるが、 > 一般的には使われていないのではなかろうか? と最近思い始めています。 逆じゃね?w 大手ほど安い外注に出し、安い外注は安いだけが売り物。 技術は低い。大手だからそんなんでもやっていける。 中小のほうがよっぽどデザパタ使ってるだろ 自分の技術力が即会社の存続にかかってくるんだから。
有る程度以上フクザツなもんをスッキリ書こうとしたり、 柔軟さをもっと持たせようとしたら悩むっしょ? 糞設計を山ほど繰り返し、日々悩むっしょ? そこで手に取るもののひとつがデザパタにすぎない。 設計道の一歩目にすぎない。
コールバックを関数ポインタとは言わんからな。 ラムダを自然に使えるようになっても、commandだのobserverだの 名前は使われるんじゃね。
>>53 取引相手から金貰うやり方にもよるんだと思うよ。
大企業を相手にソースをリリースしていると「何か変更を加えたときに混入するバグ」を恐れて硬直化する。
修正するのに一々マニュアルまであったりしてオーバーヘッドがすごくなる。
俺が前居た会社だと、一案件変更しようとする毎に
・見積もり書
・外部仕様書
・内部仕様書
・単体試験仕様書
・組み合わせ試験仕様書
をかっちり書かされて大変だった。更に各ドキュメントのページ数やらも管理する。
そのドキュメントでも金貰えてたんだけど。
んなことやってるからリファクタリングなんて夢のまた夢って感じだった。
俺はコメントの修正前のコードを残すルールのある会社の仕事したことある コメントアウトされた修正前のコードがどっさり
>>57 なにかバージョン管理システムを使えばいいのにね。
オブジェクト指向設計をきちんと覚えたい。 実際に設計しながら覚えたいんだけど,良い例題(と模範解答)はないでしょうか。 入門サイトを見ると,「1+2*3」みたいなのを計算するプログラムが挙げられたりするけど, その程度だったら再起関数で済むと思う。 わざわざ演算子のInterface定義して,Plus型MINUS型のcalc()を実行! みたいなサンプルを見かけるけど全然参考にならない。
>>59 優れた設計を学ぶには優れた設計に触れるしか無いが、何が優れた設計なのかは実は誰もわかってない。
オプソにしても何を見て学べばいいのかわからないし。
>>59 ひとまずデザパタ見れ。
関数型の考え方などから見ると古かったり必要のないものもあるけど、未だにオブジェクト指向のエッセンス詰まってると思う。
>>59 デザパタとリファクタリングは車の両輪
リファクタリングがうまくなったら自然とうまい設計がわかってくる
>>59 実例はフレームワークのソース見るといいよ。手始めには辛いかもだけど、javaのcollection frameworkなんてどう?
>>62 同意。OOPの理解を深めようとするのなら、その二つはまさに両輪。
ただ、悲しいかな、それをつきつめた先に設計の極意があるか、
自分の設計力を高みに持っていけるかというとそれはまた別。
どこまで行ってもクソ設計を繰り返すことになるだろう。
それは、個人の設計力、設計センスよりもいつだって、
プログラミングすべき問題のほうがややこしいから。
そうかなあ。 デザパタなんてコロンブスの卵にしか思えんけど。 恐らく散々言い尽くされたことだと思うけど、デザパタには確かに意義があるが、 それは技術サンプルとしての意義じゃなくて、コミュニケーションツールとしての意義だよ。 「ここは○○パターン的な発送で作ってあるよ」と言う事で、意思疎通のコストを縮減できる、 それがデザパタの意義であって、それ以上でも以下でもない。
まぁまぁ。そう視野を狭めちゃ勿体無いよ。 騙されたと思ってパターン指向リファクタリング入門読んでみ?
>65 今のご時世、プログラミングを始めたときにはすでにデザパタが常識になってたって奴もいっぱいいて、 実際そいつらは、デザパタを通して設計を学んでるわけで ていうか「意義」をひとつに決めようとする必要ないし
デザパタは基礎知識としては重要だけど、それを通して設計を学ぶ類のものでは無いと思う
より上位の設計があって、その設計を実現させるための手段としてデザパタがあるという印象
で、
>>59 が求めているのはそういう上位の設計なんじゃないか?
俺の見た限りデザパタのカタログ的用法は疑わしい。 なぜなら、多くの人にとってのパターンの理解度が単に疑わしい。 その定義やメリットについてMLなどでわりと揉めちゃってるのを見る。 例えば、JavaHouseのログを見るといい。Factory Methodパターンなど。 ほかにも、実際2ちゃんでもAbstruct Factoryパターンを、 単なるファクトリメソッドのオーバーライドとして理解している人を見た。 これらは、カタログとしてデザパタが失敗しているというよりは、 やっぱデザパタそのものの理解が難しい、 さらにやっぱり、そもそもスカッとした設計自体が難しいってことと思う。 でなもんで、おとなしく学習のツールとして使うのもどんどん推奨されるべき。
誰が何から設計を学ぶかは君の決めることではないと思うが 選択肢を増やす意見ならともかく、出た案を否定することに意味はあるのか?
interfaceの考え方がピンとこなかった初心者が、デザパタを学んでなるほどと思う またよろこばしからずや
>>70 デザパタを学んだことで設計を学んだと勘違いしてしまうと、むしろ害があると思っているから
否定しておきたかったってのはある。
害っていうのは、本来はパターンを使わない方が自然であったり、使うべきでないところに無理やり
パターンを当てはめてしまうようなことがあること。
たぶんデザパタを学んだ多くの人は経験していると思うんだけど。
それを踏まえた上で勉強する分には構わないと思う。
代案を出せればいいんだけど、良い方法を自分も知らないから…。
>>72 > 害っていうのは、本来はパターンを使わない方が自然であったり、
> 使うべきでないところに無理やりパターンを当てはめてしまうようなことがあること。
結局ね、実害がない限りそういうのもドンドンやってみるべきなんだよ。
そんでもって、学ぶ。どうまずいのか、どう不自由になっていったのか学ぶ。
そもそも、デザパタ単体で学ぼうとして挫折したやつ多く見た。
小さいサンプル書いてみたところで何が学べようか。
個々のデザパタが何をそれぞれ解決してくれるのかを学ぶには、
デザパタ適応以前の苦痛をしっておきたいところ。納得度が違う。
設計&デザパタ&リファクタでもんどりうちながら学ぶ。
いつでも学ぶ。いつでも臭い設計になっちゃうのでまた学ぶ。
悪い設計を目の前にして、右手にデザパタ本、左手にリファクタ本で学ぶ。
きれいに実装されたテンプレートパターンなんて見たことねーよ。 単純に if 分岐で関数切り出しでもされてた方がよっぽど見やすいわ。 テンプレートパターンがうまくいくのは 「具体的には違う処理だが抽象的には同一の処理」の塊が 長く続いてるコードだと思うんだがそんな都合のいいシチュエーションって そうそうないだろ。
自分の経験を一般化しすぎるのはどうかと思うが
「俺は綺麗に実装されたテンプレートパターン見たことあるぞ」と言う奴がいれば根拠崩れるぞ
>>73 自分も同趣旨の事書きかけてたけどそっちの方が文章うまいね
>>74 少なくともif分岐はないわ-
テンプレートパターンは、今は具象インスタンスから可変ポイントになるもののラムダを渡して実行って感じになってるがやってることは一緒。
そもそもデザパタは局所的に使う物でしょ 「この部分は○○パターンでここのこの部分は…」みたいな 使える所があれば使えばいいし、出番が無いこともある そういうものなんで、リファクタリングしながら適用するのはいいと思う
色々アドバイスありがとう。 デザパタについては,浅く理解していると思う。 ただ,デザパタを実際の設計に結びつけれるほどは理解していない。 結びつけられるようになればレベルアップのような気がして, まずはデザパタも含めて「良い設計」の実例を見てみたかった。 JavaのCollectionFramework参考にしたいと思う! 他にも何か良い例があれば教えて下さい。
>>74 Template Method(の事だよな?)は、Straregyのように同一インターフェースだが、多くの実装のバリエーションがある場合に、骨格抽象実装(スケルトンクラス)として、よく利用している。
(つづく)
例えば、呼び出し元からメソッドの最後で実行して欲しいコールバック関数が渡された場合に、 全ての末端のクラスでnullチェックして、実行って記述すると冗長なので、共通部分をスケルトンクラスに移管させ、 バリエーション記述のためにprotectedなabstractメソッドを用意しておく。 末端のクラスはこの抽象メソッドを実装するといった感じで。 これに限らず、「インターフェース ー スケルトンクラス ー 実クラス」という形は結構でてくるものよ。
>>77 >そもそもデザパタは局所的に使う物でしょ
デザパタに出てくるものってソフト全体に絡むと思うぞ。大きいものから小さいものまで。
その意見をとやかくいうのではないけど、そういう捉え方をする人がいる人にビクーリした
デザインパターンを構成要素としてより大きなパターンが出来てるだけじゃないの? アーキテクチャパターンとか聞いたことない?
ぶっちゃけ言うとデザパタもアーキテクチャパターンも本質は同じだと思ってる。 両者を明確に区別すべき理由はないでしょ。
コードから出てきたのがデザパタ コード書かずに図を弄ぶのがアキパタ
デザパタの 拡大解釈 やな予感
リファクタリングを繰り返して物凄く汎用性高い設計 あまりレベルの高くないプロジェクトメンバーでも長期に渡って保守可能な設計 これらは両立しなくてどっちも大事だと思うんだけど,両方上達する方法ない?
物凄く汎用性高い設計なんてものを、 まずお目にかかったことが無いw
リファクタリングなんて必要なとき必要なだけやれば十分、汎用性なんて気にしなくていい 長期に渡って保守しておいてレベルの低いままのメンバーなんて切ればいい 下手糞が保守できるからいいソースとは限らない →どっちも大事じゃない
>下手糞が保守できるからいいソースとは限らない ココロに響くお言葉
せっかく保守・拡張しやすいように考えて書いたソースでも それがわかんない人はどういう変更してくるかマジわからんし。 前の会社で、俺が設計・コーディングして、手を離れたやつに機能追加しようとした先輩がいてさ。 うまくいかないってソース持ってこられて(!)見てみたらコレが酷いのなんの。 俺「そこはサブクラス追加だけで良いですよ、そういう風に変えたら広範囲に悪影響あります、…(しばらく駄目出し)」 先輩「…全然駄目ですか」 俺「駄目駄目です」
>>90 それは先輩もあれだが、正しくドキュメントとか残したん?
設計思想ってのはドキュメント化しにくい上に工数認めてもらえないこと多くね?
コメントで「〇〇〇パターン使ってます」って書いときゃ大体伝わる。 と思ってた時期が以下略
>>91 >92-94が正にそん時の状況を表してるw
一応、設計中に作成したメモ書きよりは上等程度のんは残してたけど。
まさか数キロステップ程度のプログラムで悩まれるとは思わんかったし、
彼もOCPとLSPが分かってたらやっちゃいけない事くらい分かったろうし…。
他にやる事あったのにそこまで面倒見切れんかった。
そういうのは実際にコードを見てみないと何とも言えない その先輩のようにOOに疎い人は確かに多いんだけど 自信ありげに語ってる側もまた酷いコードを書いてることが多い
あるある。かなり、あるある。
自信満々でコメントの一切無いソース見せられたことある しかも変数名や関数名は母音抜き
>>98 コメントはちょっと扱いが難しい。コメントが嘘をつくことがあるから。
つまり、コードの改変にコメントが追いつかないことがある。
コメント書かないほうがまし、と思うことが最近多くなってきた。
>>90 下に合わせてもキリがないのはすごく分かる。
設計思想を理解してもらう部分にコストが掛かるから難しい。
作り手は工数かけてドキュメント作成しなきゃいけないし,
その後も更新に合わせて整備しないとぐだぐだになる。
かといってドキュメント残さないで設計思想を安定して読み解ける人は
安定供給されないw
シンプルに作った時の問題点が多くなかったり別の解決が出来るならシンプルに
作った方が良い時もあると思う。シンプルってなんだ?っていうのは置いといて。
例えば,使われる側のクラス設計的に問題があって,使う側に少し制約が付くとしても
変に複雑にクラス設計するよりシンプルにつくって何らかの台帳で制約を共有するとかね。
>>99 それ凄く多い。
あと少し違うかもしれないけど,
顔合わせない派遣さんとかが付けたSVNのコメントも混乱の要因になったりする。
シンプルって俺は「同時に憶えておかなければならない範囲が少ないこと」としておくけど、 オブジェクト指向原則ってプログラムをシンプルに保つためのもんだよね。 LSPに沿っていれば、あるインターフェースでオブジェクトを扱う使用側は個々の具象クラスの事に気を使う必要はない、とか。 シングルタスクで記憶容量の少ない、低クロックCPUの俺のような奴にこそオブジェクト指向原則は必要だと思う。 それに沿って作られてるだけで頭に掛かる負担が全然違うし。
コメントもなーw // メインループ // テンポラリ変数 // イテレータ // 文字列をコピー ↑こーいうw
>>99 コード直すときにコメントも直すだろ
コードと一緒にコメントも直す習慣が無いやつが書いた
ワードやエクセルのドキュメントなんて信用できるのか?
>>103 根本的解決になっていない。
コメントがコーダに及ぼす影響を考慮すると、コードの内容に即したコメントになっているかどうかをコンパイラがチェックできなければならない。
それができないのならばコメントはいらない。
コード直すときにコメントも直すだろ、という精神論は竹槍でB29を落とし、バケツリレーで焼夷弾を消火せんばかりの旧日本軍的思考となんらかわりない。
>>104 心情的に同意したくはあるんだけど、もうちょい穏やかな言い方にならん?
プログラム書いてるときとドキュメント書いてるときって脳の使うとこが違うよね
「なんかの作業してて調子が出てくるのに2時間くらいかかる」ってどっかで聞いたことある(気がする)けど、
それでいくとプログラム・ドキュメント並行作業ってあまり良くない気がする。
と言って、交互にすると抜けはどうしても出てくるだろうし。
…ってオブジェクト指向もデザパタも関係ない話になってきてね?
自分の書いたコードを読むのが、コメントなしでもコードの意図を汲み取れる人だけなら コメントなんて書かなくてもいいんじゃね レベルの低い奴が修正する可能性があるってわかってるのにコメントを書かないのなら、 設計思想を無視した修正をされても黙ってろってかんじ
QZらしからぬ煽り耐性の無さだなw 宿題スレで金儲けはもうやらんの?
コメント付けただけでレベル低い奴が無茶苦茶すんのを阻止できるとでも? そもそも設計思想なんてコメントで残すものでもない。
そんなにコメントって頻繁に直す必要が出てくるか?
リファクタリングしてるとクラス自体が出来たり無くなったり、 結構ダイナミックに変わると思うけど
そういう場合は丸ごと消したり付けたりするから嘘を付いてるような状況にはなりにくくないか
i--; // iをインクリメント i += 3; // iに5を足す
コメント無いと他人がみても何やってるかわからない様なプログラム書けてこそのプログラマーだろ? 誰でも読める様なソースはプログラムじゃなくて、だだのマクロだよ。
釣り針は置いといて、俺はむしろ自分のためにコメントを書くぞ。 そのほうがトータルコストは低くなる。ソースの頭に色々と関連した前提を長々と文章で書いてる。 あとはややこしいところに一目でわかるように意図を書いてる。
トータルのコストで考えないとね 必ず書くとか絶対書かないとか、ただの思考停止
>>114 職人的発想だね。
商業漫画家の中にアマチュアだけど物凄い技術ある漫画家が混じってくるような感じ。
商業的な観点で保守性考えたときに,果たして最良のコードかどうかをよく考えた方が良いと思う。
考えた上で最良と判断したならそれでいいだろうけど。
>>115 それで上手くいくかは何人でコード書いてるのかによると思う。
「自分のためのコメントだから!」とか言って15人ぐらいがそれぞれ我流のヘッダ付けて
我流のコメント入れてたら嫌だね。
15人が一つのソースいじるような案件なら コーディング規約にコメントルールもある…よな?
コメントなんてそこで何やってるかの意図がわかればいいんであって、一目見ればわかるような関数に定形でパラメータが何だ戻り値が何だとか書くのも書かせるのもやめていただきたい。 少人数で開発できて幸せだわ。 軍曹みたいな現場に放り込まれたら一日で切れそうだw
前んとこで抽象クラスを介していろんな具象クラス同士が緊密に結合してるプログラム見て発狂しそうになったよ。 どのクラスも単独で使えなくて、CppUnitとか全然入れられないの。 単体も組み合わせも全てIDEでステップ実行のホワイトボックステスト(それしか出来ない)で、 自動化?なにそれ?みたいな感じ。
テストが自動化できるような部分て、自動生成できるような機械的なコードの部分だから、テストの自動化で大幅に生産性が上がるシステムはそもそもコードの記述が冗長で糞。
自動化プログラムの下の世話のが手間かかるんだよな 「あ!止まった!」 とか思ってもだいたい自動化プログラムのエラーだったりねw
> テストが自動化できるような部分て、自動生成できるような機械的なコードの部分 へー、ユニットテストっていつ自動生成できるようになったの?
>>123 UWSCとかbot御用達の技術
企業だとユニットテストに使われてる
>>126 なんかどこおしてほしいのかわかんない
わざわざh抜く必要もないんじゃない
それかGoogleで先頭に出るキーワード貼ってよ
>>120 の言ってる自動化は
自動生成のことじゃないだろ
>>108 金儲けじゃありませんモリタポ儲けです(棒)
>>129 あー、うん。用意した一連の単体試験をガーッと実行させてOK/NG出させるのを自動化って言ってた。
ソースコードの1ステップずつの動作を日本語で書き直した、
関数XXXX
期待動作 確認結果
aaa = getXXX(); を実行する OK
aaaがNのとき
o->setInfo(aaa); を実行する OK
aaaがそれ以外のとき
retが0であることを確認する OK
:
:
みたいな試験仕様書を延々とVC++のステップ実行&ウォッチで目視確認してたもんで。
FORTRANでもできそうな、スレタイと全く関係ない流れだな・・・
しまった。スレタイに関係ある話題に引き戻そうとネタ振ったのに… テストを自動化するときって元プログラムの方にもある程度の良設計求められるし、 テストしやすくするためには多少詳細を弄らなければならなくなることもあるでしょ。 ところが元プログラム弄るのは仕様追加・変更・修正などの案件があるときのみ、 みたいな縛りがあって、それもままならなかった。 リ フ ァ ク タ リ ン グ 、 さ せ て く れ と思ってたら、そのうち冗談みたいな一大プロジェクトが出てきた。 リファクタリングしましょう! スケジュールに「リファクタリング」の文字が組み込まれ、 そのための打ち合わせが増えた。
アホくせ もう十年以上PGやってるけど業務のソースみるとなにが「いい」のかまったく基準がわからない 俺の個人的な基準だとwin32レベルの知名度のあるライブラリでもないのに グローバル変数や関数使った時点でアウトだけど 平均レベルただよってるレベルのひっくいPGじゃ俺のいってることさっぱりわかんねーだろーな
コードレビューとか長年やってるだろうに説明下手すぎ そのレスでわかれっつー方が無理 エスパーしてみるけど、 ・135は知名度の低いライブラリの開発に従事している ・そのライブラリはグローバル変数や関数を使っている でおk?
>>136 アホくせ
わからないなら黙ってろよ
わからないんだろ?
放っておけ 文章から知性の低さが滲み出てる上に 俺のエスパーによるとオブジェクト指向とは関係ないから
オブジェクト指向スレでWin32とか言ってる時点でお里が知れる(´・ω・`)
しかもWin32はライブラリではなくてAPIだよね。
>>135 の言い方だとwin32くらい知名度のある場合は、グローバル変数を使って良いということか?
よくわからん・・・
コンパイラが必要だな
>>141 おう、いいぜ
仕様も挙動もみんなが把握している場合に限りなんでもオッケーだと思う
ただし、マイナー・・・特に自分ライブラリなんてそんなもん誰もしらんから自重してほしい
143 :
デフォルトの名無しさん :2011/11/06(日) 09:20:08.66
クラス図とかシーケンス図とか作成している人、このスレにいますか? いないような気がするのですが。
クラス図は、ある程度コードを書いた後にリバースで出力します。 シーケンス図は客から要求されない限り書かないですね。 実装レベルでは、素直にコールグラフをスケッチする方が分かり易いと思ってます。 シーケンス図はその名のとおり呼び出しの時系列を追えるところがよいのだと思いますが、 ごく普通に構造化されたコードなら、ほとんどの場合「シーケンス」は一目瞭然。 図を描かなければ理解しにくいのは、むしろ深い呼び出しの階層構造だと思います。
145 :
デフォルトの名無しさん :2011/11/06(日) 11:48:19.80
>>144 サンクスです。
クラス図をリバースで出力します、にはクラス図重要視派の私には、ショックです。
バイト先でシーケンス図書いてます
オブジェクトが動的に増えないプログラム(組込み)なんかだと クラス図はわりとどうでもいいと感じるようになるね シーケンス図は真面目にやると大変だけど重要だと思う
>>139 横レスするが、WinAPIも一応OO標榜してたんだぞ。
HWND
window = CreateWindowEx(・・・略・・・),
button = CreateWindowEx(・・・略・・・):
SendMessage( window, WM_GETTEXT, ・・・略・・・ );
SendMessage( window, WM_SETTEXT, ・・・略・・・ );
SendMessage( button, WM_GETTEXT, ・・・略・・・ );
SendMessage( button, WM_SETTEXT, ・・・略・・・ );
SendMessage( button WM_GETTEXT, ・・・略・・・ );
SendMessage( windown, WM_SETTEXT, ・・・略・・・ );
こういうことってない? Cell { int a; float b; char c; }でCell[][] table;とするか、 int[][] atable; float[][] btable; char[][] ctableとするか。 後者の方が変数が複数になってしまっているが、 実際は簡潔な分類を施した結果であり、 より変数の再利用性が高まってると思う。 妙なモッチャリ固まりクラスの使用を、 ライブラリ利用者に強いるのって結局のところ濁らせてるだけ。
>>150 高速検索様に、こういうのならあるが。
ま、違うか。
List<Cell>
columnA = new LinkedList<Cell>(),
columnB = new LinkedList<Cell>(),
columnC = new LinkedList<Cell>();
Cell
row;
row = new Cell();
columnA.add( row );
columnB.add( row );
columnC.add( row );
row = new Cell();
columnA.add( row );
columnB.add( row );
columnC.add( row );
>>150 「a、b、cが常に一塊で無いとマズい」と言うデータ構造を表現するなら前者だな
コードの最適化はデータ構造を破壊しがちだよ
インデックスのキャッシュを二次的に作成
(Windowsアプリの)プラグインのフレームワーク作ろうとしたら頭こんがらがってきた 本体アプリから呼ばれる部分のパッケージ(Base)は一番安定している筈。 で、プラグイン固有機能を実装するパッケージ(Derived)はBaseに依存している。 ここまではいい。 困ってるのは、 「Base内にあるDLLのエントリポイントでDerivedに属するクラスを生成するのはADP違反じゃないの?」 という点。(ADPってパッケージの依存関係を循環させんなってやつね) Base内のEntryPoint.cpp(仮名)でonLoadが最初に呼ばれるとして、擬似コードがこんな感じ。 BOOL __cdecl onLoad( char *path ) { gPlugin = new DerivedPlugin( path ); return gPlugin->onLoad(); } 別のプラグイン作成でBaseを流用したとき、毎回この関数を修正するのは変な気がするんだけど…。 上手く説明出来てなかったらすんません。
そこでなんでDerivedとして継承してるのかしらんが、DerivedはInterfaceのImplementとしてそのImplementしたクラスをリフレクション的に登録、Base的な部分では実際の中身は知らないインジェクトされたinterfaceを使ってCreateすることでDerivedのinstanceを作ればいい。 今の設計はBaseがDerivedを知ってる時点で間違ってる。
BaseがDerivedを知ってるのが間違ってるのくらいは良く理解してる…。 上の例で、DerivedPluginとして“やむを得ず”使ってしまってるのが唯一のADP違反部分で、 他の部分にはそういうところはなし。 問題は例のところで生成すべきクラスをどう指定すべきだったのかというところ。 解決法を>155で書いてくれてるんだろうけど、 「リフレクション的に登録」とか「インジェクトされた〜」とかが良く分からん。
>>156 new DerivedPluginとしてるところは、DerivedPlugin自体を知ってる必要はなく、IPlugin的なインターフェースを持つ何かだよね?
だとしたらその場で作成するIPluginである何か(DerivedPlugin)についてどこからか登録すればいい。
それは設定ファイルなり、プラグインが登録されている指定されたフォルダを全部舐めることで動的に登録するなりやり方は色々。
登録する・・・がインジェクトと言ってたものであり、リフレクション・・・と言ってたのはフォルダを舐めて・・・の部分。
DependencyInjectionとかでしらべたまい。
> new DerivedPluginとしてるところは、DerivedPlugin自体を知ってる必要はなく、 > IPlugin的なインターフェースを持つ何かだよね? そうです。実際の操作はインターフェースによってのみ行うようにしてる。 > それは設定ファイルなり、〜 ああ、なるほど。 依存性をソースファイル外に追い出すってことか。ありがと!
>>154 どうでもいいが、フレームワークをどういう意味で使ってる?
ただのオレオレクラスライブラリじゃないのか。
基本、枠組みはそのまま使って必要部分を拡張するやつ 主:フレームワーク、従:拡張部分 作ろうとしている段階なので現状そこまで行ってなくて、 オレオレクラスライブラリであるのは間違いないけど。 機能拡張が一定のやり方で出来ないようなら それはそれでクラスライブラリとして完成させてもいいし。
まぁべつにそこを明確にする意味ってないよね
GOF本にはそう書いてるだけだけどね。 「本にそう書かれてるから正しい」なんて言うような原理主義者でもないけど 異議を唱える程の自己主張も無いし。
>>158 そもそもエントリーポイントを何でBaseに入れる必要があるんだ?
エントリーポイント用意して毎回吐かせりゃいいじゃねぇの?
//ヘッダに固定
namespace Plug
{
void Export( Registry &);
}
//DLLにリンクするライブラリに固定
extern"C" __declspec(export) void RealEntry( Registry& registry ) { Plug::Export(registry);}
// DLL毎に記述
void Plug::Export( Register ®ister )
{
registry.Register( "Alpha", new Plugin() );
}
164 :
デフォルトの名無しさん :2011/11/23(水) 12:07:51.02
インターフェースの設計はどういう観点から行うのが有効なのでしょう。
そのインターフェースが表すものが備えてるものを備えてるようにすることかの。
166 :
デフォルトの名無しさん :2011/11/23(水) 14:17:45.35
>>165 それって、どの本にも書いてあることだの。その先が知りたいのに。ムカッ。
じゃぁプログラム構造の中の空間的分割を行うための変換子として扱えばいいよ。
逆に言うと公開しないものはインターフェース以外って事でしょ 外部から実行出来る(依頼とか操作とか)ようにするものは何か? = インターフェースだよね 必要なものだけにしときます まぁポリモーフするからってインターフェースを考える場合もあるけど
>>166 必要に迫られて自分でやらなきゃ分からんよ
伝聞はすぐ忘れる
>>164 既存のライブラリ群を見て、 「どういう物がインターフェースとして実装されているか」 を考えれば解るんでない?
例えば、C#の IComparable とか。
使う側で考えて、その結果インターフェースにしたほうが早い。 しょっぱなからインタフェース書くんじゃなくて、例えば、下みたいな 呼び出しコードを書いてみてから、どうすればキレイにできるか考える。 RuleSet rule = new Required( new Number( new Min( 0 ), new Max( 100 ) ) ); rule.validate( textbox, "透明度" );
172 :
デフォルトの名無しさん :2011/11/24(木) 21:26:20.01
>>171 さっぱり、わからん。
ちなみに、本などに書かれているのだが、「設計段階でインターフェースの抽出を行いましょう。」
っていうのは、
>>171 と真逆な感じがする。
>>171 じゃ無いが
最初は、インターフェースとか全く考えずにプロトタイプを作る。
んで、プロトタイプを捨てて再設計する段階で
インターフェース化出来る部分が有るか、ついでに検討する。
まぁ両方からだね。 最初から個々はインターフェースにナイスにまとめられるよねって分かる部分と、作ってるうちにここをインターフェースにまとめたらナイスにまとまるんじゃね?ってのと。 だんだん前者が多くなってくると思われ。
>>172 プロトタイプを製作してみて、その傾向から設計を引き直してインターフェースを導出するって事なんかね?
>>171 のはさ。
>>175 作成まではしなくてもいいんじゃないかな
「他のクラスからどう呼ばれると自然か?」って方向の
思考実験してみるだけでも良いかと
177 :
171 :2011/11/25(金) 23:13:05.29
呼び出しコードを書いてからとは書いたけど、
強調したいのはコードそのものじゃなくて、
呼び出し方、使い方を最初に考える事だよ。
コードを書くと言ったのは、大雑把でもコードに落として考えると
イメージしやすいというだけ。
例えば、
>>171 を見ると
RuleSet rule = (RuleSet)new Required( (Rule)(RuleSet)new Number( (NumericRule)new Min( 0 ), (NumericRule)new Max( 100 ) ) );
rule.validate( textbox, "透明度" );
みたいな感じで、必要なインターフェースが浮かぶ。図とかだけで思い浮かべるのはややメンドイ。
ちなみにコード自体意味が解からない人がいるかもしれないから補足すると、
このコードは[必須である[数値である[0以上である, 100以下である]]]という検査条件をオブジェクトで表現し、
textboxをチェックしてる。
textboxをチェックといわれても曖昧だな。 結局、使う側がいっぱい学習しないといけなさそうなインタフェースだよなそれ。
実際はtextboxじゃなくString型のモノをそのまま渡すんだけどね。 TextBoxの入力チェックの方が解りやすいかと思ってtextboxとは書いたけど。
理解するのに15分も掛からなそうだが・・・。そんなに学習がひつようか?
リファクタリングもデザパタもsmalltalkerなんだよな。おめーら smalltalkerに足を向けて寝るんじゃねーぞ。
フォン・ノイマンに足を向けて寝るんじゃねーぞ。
183 :
デフォルトの名無しさん :2011/11/26(土) 09:33:08.95
っていうか、このスレに出現している椰子はオブジェクト指向設計を やったことがない者ばかりじゃないだろうか? インターフェースは、設計の段階でほぼきっちりと把握できる。 リファクタリングは、納期に迫られて設計不十分で見切り発車したプログラムを あとから見直す場合に行うと考えたほうがよい。 ああ、やはり大手IT企業の中央部署の人しかオブジェクト指向設計をやっていないことがわかった。 っで、このスレに来る椰子は末端のプログラマだけだね。まあ、テクニックだけは高い人もいるようだが。
>>183 末端のプログラマがオブジェクト設計しなきゃいけないプロジェクトはその時点で終わってる。
前段、なにをいまさら得意げに言い直してるのかw
一昔前(2000年初頭)の苦い経験から、末端側がそれほどオブジェクト設計を意識しなくていいような、フレームワークという概念が台頭してきたんだよ。
Sunは設計不十分で見切り発車で作ってたから Javaなんてdeprecatedなメソッドが盛り沢山。
>>183 っ[ アジャイル ]
っ[ スパイラルモデル ]
っ[ プロトタイピング ]
っ[ TDD ]
189 :
デフォルトの名無しさん :2011/11/26(土) 11:57:02.80
はいはい。ハイハイして去ります。私がアホでした。
>>183 オブジェクト指向設計やったことある?
ドメインモデルとトランザクションスクリプト
どちらの設計を使ってる?
トランザクションスクリプトはオブジェクト指向設計風ではないけれど
よく使われてるよね。俺も完全なオブジェクト指向設計よりも
トランザクションスクリプトの方が開発しやすいと思うんだけど。
ドメインモデルはなんか設計がガチガチで柔軟性がないか
柔軟性を保つために何度も再設計をすることになりそう。
191 :
デフォルトの名無しさん :2011/11/26(土) 12:23:08.40
>>190 クラス図設計とシーケンス図設計のみ。
ドメインモデルとトランザクションスクリプト。ふん、なんか言葉では見たか、聞いたかかもしれないが
あまり気にしてない。
クラス図を作成するのが大変だった。特に、インターフェースを抽出するのがね。
>>191 話にならんな。
シーケンス図はオブジェクト指向と全く関係ないし、
クラス図はUMLの中で一番使えないものとされてる。
クラス図はコードのクラス定義そのものだからね。
193 :
デフォルトの名無しさん :2011/11/26(土) 12:31:05.13
クラス図なんか、コードを書きながら設計すれば良い。 これは手抜きではなく、試行錯誤だ。 適切な言語を選べば、インターフェースを抽出するなんて ほんの少しコマンドを実行すれば終わる。 メソッドを親クラスに移動したり、反対に子クラスに移動したり、 コードをまとめたりといった作業のコストは低い。(言語と開発環境によるが)
クラス図のなにが悪いかって書くのが面倒な上に、 ソースコードから生成できるから意味が無いってこと。 マウスでポチポチやって図を書くよりもコードを書くほうがはるかに楽。 一時期はクラス図からソースコードを生成するってのが流行ったが、 逆にソースコードを書いてそこからクラス図を生成したほうが良い。 どうせクラス図は完璧には書かないんだから。(最初にすべてのメソッドかけますか?) ソースコードからクラス図を生成するようにしておけば クラス図とソースコードに違いが出ることもない。
>>193 横レスであれだが、決して言い過ぎじゃないと思うぜ…
197 :
デフォルトの名無しさん :2011/11/26(土) 13:06:45.29
プログラマ版ではこのスレのお題は重すぎる。
そもそもクラス図を作ったところで使う機会が無いというのが最大の問題点じゃないか クラス図の役割って殆どIDEでカバー出来ると思う
プログラミングを単なる実装と思ってしまうから、 実装の前に設計が必要だと思ってしまうんだよ。 メソッドの中身までは書かなくてもいいが、 設計をコードでクラス定義として書くほうが 柔軟で書きやすい。
やり方は色々だろうけど。 クラス図に中身空っぽのクラス並べて構造を俯瞰できるようにして、 シーケンス図書きながらクラス図にpublicなメソッドを足してく訳だよ。 だから俯瞰する能力が高くてシーケンス図なんざ書かなくても 協調が把握できる人なら、クラス図は要らない、というか まぁそもそもそんな仕事で良ければアーキ設計書もUMLも要らないという話だが、 世の中の開発者はそんなスーパーマンばかりではない。
>>200 誰も、シーケンス図が無駄とは言ってない。
シーケンス図はオブジェクト指向と無関係だということ。
あと、シーケンス図はクラス図と関連はない。
他人のプログラム読む場合 シーケンス図があるとないとで全然違う
シーケンス図が必要なほど呼び出し順が入り組んでるものはいやだ。
まさか全ての処理にシーケンス図描いてるのか
>>195 オブジェクト図で叩き台作って、クラス図を作ってチームで打ち合わせしとくと、
コード書き始めるより遥かに出戻りが少なくなるぞ。
206 :
デフォルトの名無しさん :2011/11/26(土) 14:52:42.47
>>201 は、いろいろと知らなさすぎる。
何をかじっているのだろう。
ユースケース毎にシーケンス図があると間違いが起きにくいよ
>>192 > クラス図はUMLの中で一番使えないものとされてる。
されてないし、されてる訳がない。通常、最も多く使われるのがクラス図。
いったいどこの誰がこんな馬鹿げたことを言っているのか…
>>195 根本的に間違えてる。
設計段階のクラス図は、自分の考えを整理したり他人とのコミュニケションの
道具として使うために、紙とペンを使って素早く書くもの。
(もちろんホワイトボードでもいいし、ツールを使った方が早ければそれでも)
ソースコードから生成するのは、主に最終的なドキュメントとして必要な場合。
ていうかドメインモデルとトランザクションスクリプトを持ち出すならせめて
DDDくらいは読んでおけよ。いろいろと酷過ぎる。
209 :
デフォルトの名無しさん :2011/11/26(土) 15:05:39.39
ユースケースは使わない。ユースケースは無理やり考えられた代物に思われる。
馬鹿ばっかりw
馬鹿が一人w
つまりクラス図はフローチャートくらいには必要
フローチャートとシーケンス図はまったく必要ないと思うけど クラス図は結構好きだけどな ってかPGのレベルが低くてまったく関連のない処理を 他のクラスにぶち込もうとしてる奴に歯止めをかけることができる まあ、詳しい処理の話になったらクラス図の出番はないけどねw
厳密に書くと役に立たない(線が多すぎて解読不能) あくまで説明用に対象のクラスがざっと書いてあるレベルで役に立つ
図の上の方に他への依存性が低いクラスを書き、 図の下に行くに連れて他への依存性の高いクラスを書くとか お前等はしないのか? キレイに上下依存関係が別れないクラスは、インターフェースに分割したり、 機能的に類似性が高いクラスはインターフェースを統一したりとか、 打ち合わせで図を見ながら考える事はあるだろうに。 やっぱ派遣だとそんな打ち合わせする暇はないのかね。
ないな そもそも仕様書に出てくる用語以外のクラスを作成しちまうとやたら詳しく説明を求められるから そういう変なクラス作らないし
ウォーターフローモデルでの開発では 必須というだけの話。 アジャイルなら変化しながら開発が進む
>>216 仕様書が完璧ならそれでいいんだけどねw
いや、下位工程に回す前に、上位工程では完璧に作るのは常識でしょ。 じゃないと、下位工程でバグが見つかって上位工程に戻すと工数がかかり過ぎる。
>>218 その場合は仕様変更だからちゃんと工数もらえるから時間とっていいんだ
そこを吸収してやるようには作らなくていい
やっぱ自社で1システム受注できないところは、OO開発は向かないのな。 そりゃUML使えないと言ってても仕方ないか。
お前等、基本設計から納品まで出来る企業に転職したら? 自社でライブラリすら持ってなくて、スクラップアンドビルド ばっかしてる仕事は、穴埋め囚人みたいで辛いだろ。
てか、大手も実装工程は作り直しても大して時間とらない(=金かからない)ってことに気がついてるから わざわざ開発手法にまで手を入れてこない 仕様決めとかそっちのが時間かかるからなぁ
大手は、そもそも案件を下請けに投げるだけだろ? 営業から納品までやってんのは大概中小企業じゃね?
そうなると基本設計から納品までなんて会社はないんじゃないか?
ウチの会社はやってるし、ライバル会社もやってるから、結構いる筈。 自社パッケージ持ってるのが、一括受注できる原因だろうけどね。
つか、納品する仕事なんてやりたくない。 せっかく作ったシステムの権利をあげたら自分になにも残らないだろ。
>>226 大手からすると無駄が多いって考えだろうな
基本的に設計やる人間と実装やる人間の単価が違うってとこまでコストカットしてないと
設計と実装の人間を変えることないべ?
だから自社パッケなんてのは無駄ばかりだから成り立つもんなんだよ
そのうち開発メンバーが年取ってくれば給料とかコストが増えるから自社パッケはなくなるだろうな
ん?成果物は全部自社管理すんだから、 作ったソースやドキュメントは自社のもんじゃん。 ライブラリなんてシステム見積もるときにライセンス買わせてるし。
>>228 開発者が歳をとろうと自社パッケージをなくすことは無理だよ。少なくともウチでは。
こんな不況下でも黒字をたたき出す。受注に比べほっといても売れるから
圧倒的に採算がいいらしい。ただ、それでも情報収集が必要だからって理由で
受注開発はしてる。
231 :
デフォルトの名無しさん :2011/11/26(土) 16:37:30.50
儲かる仕事を繰り返すためにも設計書は必須だ。
詳細設計書はともかく、基本設計書もない環境なんて無いだろ。
>>230 したらどうして大手は自社で開発をもたないの?
って疑問はお前の理論じゃ成り立たないべ?
>>233 230じゃないが。
車輪の再発明するより枯れた他社パッケージを買う方が利ザヤがデカいからだろ。
大手の方が販路デカいし、売ることが出来る会社ならパッケージ作ってソフトを売るより
パッケージ買ってソリューションを売る方が金になる。
まぁ一般論であって、その大手って具体的にどこなのか分からないから、
そういう話でも無いのかも知れないけど、どこの会社のこと?
言ってもソコソコ売れてるパッケージは金になるよ。
作ってしまえばあとは保守にゃあんまり金掛からないのに、
サポートで金取れるし、機能追加で金取れるし。
そんかわり軌道に乗るまでは赤字吹きまくる。
インターフェースを理解できないやつはJava The Good Partsの型システムの章を読め
少ないページでどう利用するのかがすぐにイメージできる
クラス図議論は
>>208 に同意
理解できないやつはUMLモデリングのエッセンスを読め
1〜5,9章読めばOK 他は余裕があれば読めばいい
シーケンス図も抽象的な物は設計段階で書いておくと自分の考えを整理しやすい
これは実際のコードに対応していちいち修正する必要はない
自分の考えがまとまらないなら修正して考えれてみればいい
クラス図からのコード生成はMDAというものがあるし実際やったことあるけど糞
結局脳内でコーディングして、それを無理矢理図に落として(ここに無駄にく苦労する)、コードが自動生成されるだけ
メリットとして、設計図とコードが一貫性を保てるという話があるけど、そもそもそこまで設計図に拘る意味がわからん
もしドキュメントが後々必要ならそのとき初めて作成すればいいだけ 今流行の遅延評価w
あとオブジェクト指向語るならリファクタリング本も必須
やっぱりオブジェクト指向って言ったら Javaの独壇場か。
Javaが一番アカデミックだよね。 ちゃんと熟考して作るという開発ができる。 他の言語、特に動的型付け言語なんか、適当に考えて 問題出たらパッチ当てる感覚で修正するから、 その時はすぐに問題を解決できても、すぐにボロが出てしまう。
>>233 いや、単にウチの事情を書いただけだし。
理論は成り立たないと言われてもねぇ。
>>237 いや、純粋なOOで言えばCOMやCORBA、COCOAの方がマシなぐらいだが。
bean機構なんて導入したのが、どうしようもなく退化してるしな
>>237-238 オブジェクト指向の基礎を学ぶならJavaは適してると思う
アクセス修飾子、静的型、抽象クラス、抽象メソッド、インターフェース、継承をしっかりと機能が用意されているので学びやすい
C++は継承を学ぶために余計なことを色々意識しないといけないし、型推論ついたし微妙
最近のブームだと
Rubyは動的型付けだけど上に書いた項目を理解していないと、そのメリットすら意識できない
Scalaの型推論も同様 あとはJava+関数型言語のようなものなので、Javaを学んだ後+αとして関数型を学ぶときに使えばいい
っということでとりあえずはやっぱりJava
OOの重鎮達が推奨するsmalltalkも1度学びたいとは思ってるが知らない
C++もOOの基礎を理解したら スタック、ヒープや 参照渡し、ポインタ渡し、値渡し、Javaの参照渡しなど メモリ関連を理解するためには1度学んでもいいかもしれない
beanもアレだけどJavaは戻り値を多用して、ダウンキャストが多いのがナンセンス。 smalltalkやC++の用に引数で受け取ったオブジェクトに再度メッセージを送るほうが、 OOとしては理に叶ってるのにな。
> smalltalkやC++の用に引数で受け取ったオブジェクトに再度メッセージを送るほうが、 意味不明
メッセージについて勉強しなおしてこい
引数で受け取ったオブジェクトに再度メッセージを送りたいなら
送ればいいだけだと思うけど、俺も
>>244 がなにを言いたいのかわからんな。
これだけの話なんだけどな。 java.beans.XMLDecoder decoder = new java.beans.XMLDecoder( new java.io.FileInputStream( "Test.xml" ) ); // ダウンキャストが必要な今の実装 RootBean bean = (RootBean)decoder.readObject(); // Java以外だとよく見る素直な実装 RootBean bean = new RootBean(); decoder.readTo( bean );
>>247 じゃメッセージフォワーディングのメリットぐらい解るだろ。
ちゃんとコードの解説をしろ
>>250 したいならすればいいんじゃないですかぁ?
>>251 ダウンキャストの使用頻度が高くて、OOPLとしてはデザインが汚いですよね。
他の言語のほうがマシに見えるぐらい。
おわり。
>RootBean bean = new RootBean(); >decoder.readTo( bean ); 確かにこれができると便利だけどね こういう風に読み込み前にオブジェクト弄れるし decoder.readTo(new Adapter(bean, param));
わざわざ参照多用するような構造を肯定するのは グローバル変数便利だよ引数省略できるし並みに痛い気がするんだが
それはJavaに洗脳されてるからじゃないの? 戻り値多用するOOPLは少数派だべ
>>255 オブジェクトトポロジーを理解してないお前のほうが痛い
デザパタ本も参照(ポインタ)使いまくってるしなぁ
ダウンキャストと参照どっちを取れといわれれば、まだ参照だわ。
どっちもいらんからね
Javaの問題ではなく、ライブラリの設計の問題じゃねーか。
decoderみたいの設計するとき どんなふうにするのがいいんですかね こんな感じとかかしら RootBean bean = decoder.readTo( RootBean.class );
auto hoge = reader.read<Hoge>(); で
Javaは土方で、アカデミックとは真逆の位置にいるもんな
>>266 お前にとってのアカデミックって
ドカタだろw
全てがオブジェクトの言語に触れてからほざけよ土方
>>263 型推論使うんなら型指定そのものも無くなってほしいけど
C++とかだとそこまでは無理なんだっけ
C++じゃ無くてもOCamlだろうと無理です
Javaでアルゴリズムを教えようとすると、大変だと思うよ。 アルゴリズム以外の要素が邪魔すぎて。アルゴリズムなんて どうでもよくて、ただ、ライブラリを持ってきて並べるだけの仕事 ならばJavaは向いてると思うが。。。
オブジェクト指向の有名な教科書ってエッフェルだったよな? オブジェクト指向言語の代表選手として、Javaを扱ってるのもある。 デザパタの出処はsmalltalkみたいだし。
昔勉強した頃はエッフェルという名前も聞いたけど 言語の研究分野でしか聞いたことがないなぁ Smalltalkは啓蒙してる人が濃ゆいけどw新参ではお金にならん 非商用版なら無料だから眺めたい人はご自由に 市井のプログラマとしてはJavaでウェブっていう案件は多い VB.net、VC++より多いんじゃないかな
実装言語の話はさておいて ユースケース記述とシーケンス図がしっかりしてるのは 設計先行のいいプロジェクトの傾向だと思う
シーケンス図がしっりしてるのはバッドスメルだろ。コスト配分に問題ありそう
>>269 型推論は型宣言を省略するための仕組みじゃないよ
型指定を型宣言といいかえて否定するとはこれいかに
ほおー、型推論は型指定を省略するためのものなのか?www 馬鹿丸出しw
↑この人です
またものすごい珍説が飛び出したものだ
281 :
デフォルトの名無しさん :2011/11/27(日) 11:04:59.50
カタカタw
>>278 え、ちがうの?
参考までにご高説を賜りたく( ^ω^)・・・
型推論は、〜略 超高度な推論機能によって 略 〜 その結果、型指定が省略できるのです。
>>269 返り値の型しか違わないオーバーロードが可能な言語って、どんな変態文法だよ
>>285 へえ、Scalaだと
hoge(read())
で、hoge(x:Int)かhoge(x:String)かどちらが呼ばれるかわかるの。へえ
型がない言語だと関数内部で、引数の型を調べて 処理を分岐させるコードを書かないといけないから面倒臭い。
>>282 型推論は型検査をするためのものだろwwwww
ソースはウィキペwww腹イテwwww
> 型推論を持つ言語としてはHaskell、ML、Vala、C#、Scala、Objective Caml、D言語、Concurrent Cleanなどがある。 > JavaやC++0xでも導入が検討されている。静的型付け関数型言語のほとんどが型推論の機能を持っている。 Rubyには型推論搭載されんの?
ソースは2ちゃんねる。
>>288 「型検査 型推論 違い」でぐぐってみ。
この2つは明らかに別もの。
>>288 静的型検査を型を記述しなくても可能にするためのものだろ。
バカすぐるwwwww
>>294 いや、逐一型指定しても型推論(型単一化)は行われるよ。
キミさ、型推論の仕組みがわかった上で言ってるの?
型推論を実装したことある?
>>295 実装したことがあるから言ってる。
似てるだけで概念的には別物。
あんたは実装した奴が陥る罠に落ちいてるだけだよ。
実装が似ているものを同じだと思ってしまう。
概念は別物。
本物のパラメトリック多相型のある言語の型検査には型推論は必須。 そして型推論での単一化は型検査にほかならない。 ということを承知の上で別物だとか言うわけ?
> 型検査には型推論は必須。 この2つを区別して書いてることから、 お前も別物として扱ってるだろ。
× 本物のパラメトリック多相型のある言語の型検査には型推論は必須。 ○ 特定の条件の言語の、型検査には型推論は必須。 そうでない言語では必須ではない。
>>295 型検査するけど型推論実装してない言語がある以上、別物だろ。
>>291 Rubyは動的型付け
実行するまで型は関係なし
型推論は静的型付けで型を省略すること
だけどちゃんと型は認識されてる
言語仕様に付いてやってる連中、スレチもたいがいにしろ
うゆが書いてんのかと思ってたぜ
304 :
デフォルトの名無しさん :2011/11/27(日) 17:28:50.13
まあ、型について議論が始まったことは良いこと。 オブジェクト指向は型(インターフェース)でプログラミングしておくっていうことで 俺なんかは満足している。いかにメインのプログラムを型(インターフェース)でプロ グラミングできるかが重要だといつも思っている。 これを実現するためには何度も何度もクラス図を書いて、適切な型(インターフェース) を取り出す。この辺がなかなか時間がかかりPMに「何をやっているんだ。仕事が遅い」 と怒鳴られる。泣きてえーーー。
愚痴はツイッターでやれ
>>300 しかし型検査ぬきの型推論は原理上ありえない
スレにあってそうなテーマをここでひとつ。 コーディング前の紙の上(設計書)での設計はどのくらいやっておくのがベストプラクティスなの?
>>304 >いかにメインのプログラムを型(インターフェース)でプロ
>グラミングできるかが重要だといつも思っている。
自分もそう考えている
極論を言えば、「オブジェクト指向設計とは型定義である」と
後半は、まぁ愚痴だねw
>>307 非機能要件で全然変わってくるから、ベストって無いんじゃないの?
動的型付け言語は出来損ないのオブジェクト指向だからねぇ。 出来損ないをアセンブラでカバーしてください。 アセンブラ使えばなんでもできますから。
>>311 嫉妬心丸出しで見ていて恥ずかしくなったw
そうか、そんなにJavaに嫉妬してるのか
俺、JavaよりはC#の方が…
>>307 業種や何やらの条件で色々違うだろうね
・ユースケース記述が出尽くす
・概念レベルでクラス分けができる
・メソッドを適したクラスに割り当てられる
・ユースケース記述にそってシーケンス図が描ける
実装前にこれくらい設計できればなぁ…
デザインパターンの適応もコーディング前の段階で検討できるし
コーディングは楽になると思う
静的型付けオブジェクト指向なんて、貧乏人向けのオブジェクト指向だろ。 補助輪付きの自転車みたいなものだw
誰かつられてやれよw
>>306 だれも型検査抜きの型推論のことは話してないと思うが。
上であがってるのは
・型推論!=型検査
・型推論は静的型検査を行う言語で型の記述を省く仕組み
かどうかの話だろ。
型推論をする時にコンパイラが型を認識してるのは当たり前で、それは型検査じゃないよ?
型を認識するだけでなく、型の整合性を検証しているんだよ。単一化によって。 型推論を実装したのにわからないなんて、おかしいなあw
>>317 >・型推論!=型検査
を主張してる奴らは、その是非が
>・型推論は静的型検査を行う言語で型の記述を省く仕組み
かどうかに帰結するわけじゃないことに
気づいてなさそうな話の展開のさせ方してるよな。
ほんと謎の思考だ
>>318 整合性の検証は型検査でしょ
これは型推論が実装されているいないに関わらず静的片付けなら実装されてる
だから・型推論!=型検査
ということじゃないの?
納豆は大豆を腐らせて作るものだが、 納豆と大豆とは別物として扱われているのと同じだ。
設計やってないコーダーが多いことが分かって俺は悲しい orz
Javaプログラマぐらいだよね。 コーディングの話題に設計の話が出てくるのは。 デザパタとかDIとかドメインモデルとか そういう用語が他言語ででることは極端に少ない。
DIはわざわざ話題に出さなくとも、習慣的にやってるからなあ
出来損ないの言語仕様の埋め合わせを 設計でやってるから
>>324 それってその場ののりでなにも考えずにやってるだけでしょ?
それはDIじゃなくて、ただのパッチ
JavaでSingleton作る時にDouble-Checked Lockingが駄目なのって、まだ解消されてないんだっけ?
今はSingletonはDIの設定に任せるからあまり関係ないね。 システムではSingletonでも、テスト時には多数作りたいことがあったりで コードで書くのは良くないパターンとされている。
>>327 volatileで解決できるようになってたと思うけど
>>329 え?そうだっけ??
ダブル…の延長線上ではどうあがいで駄目だったような
>>321 違うな。
型推論は型検査じゃない派の論旨
・1+2と3は表現式として違うから1+2は3じゃない。
・3だからといって、1+2から求まったとは限らない。4-1かもしれないじゃないか。
型推論は型検査だ派の論旨
・1+2と3は表現が異なるだけで、どちらも3という値であり、同じことだ
・4-1も3だね。で、だからといって、1+2と3が異なる値にはならないけど、何か?
設計とコーディングを別々の作業だと思ってるSIドカタ・・・かわいそw
かわいそうに、命令型のショボい型推論しか知らないと
>>321 みたいに間違った理解をしてしまうんだね。
オブジェクト指向やってる人は視野が狭くて、
関数型のちゃんとした型推論を知らないんだ。
そもそも中身がstaticになるようなものを 盲目的に使って動くものができると思えんが
>>336 そう思えるのは、あんたが命令型のショボい型推論しか知らないからww
井の中の蛙だねえwww
>>321 が言うとおり、
納豆を指して「これは大豆だから」と言った人に
「これは大豆じゃないよ、納豆だよ」と言い出してるのが
型推論は型検査じゃない派のドカチン君ですねwww
たまに居るね 自分の設計思想を信じ相手は馬鹿であると見下し よくわからないしょぼいものしかつくれない
こういうことじゃないかと思う
・型推論は型検査じゃない派 --> 目的と結果を分けて考えよう
・型推論は型検査じゃない派 --> 目的と結果をを混同してもええやないけ
ここで、
・型推論の目的:型の整合性の検証(型が無矛盾であることの証明),
>>318 から引用
・型推論の結果:型検査および型宣言の省略化
自分は型推論は型検査じゃない派だな
>>343 型推論の目的
>>318 は微妙だなあ。その目的を満たすなら型推論しないほうが合目的的だし。
>>343 型推論の目的は、型検査をするための記述を少なくすることですよ。
>>343 型推論は型検査じゃない派しかいないぞw
型検査じゃない!派 型検査じゃない?派
>>346 おっと、ミスッたぜ。
>>343 を以下のように訂正する。
>・型推論は型検査じゃない派 --> 目的と結果を分けて考えよう
>・型推論は型検査だ派 --> 目的と結果をを混同してもええやないけ
型推論が型検査と一緒もしくは一緒じゃないことがわかることでどういう嬉しさがあるの?
>>349 型検査だけできるってことが理解できる。
>>350 ならJavaとかは型検査してるけど型推論しないから初めから結論でてるんじゃないの
>>344 その目的に前提を含めて書けば、
・暗黙の(=省略された)型宣言があっても検証(=証明)できること
になるね
これを実現するために推論が必要になった、という話だと思う
>>349 言語を利用する立場であれば、会話の中で両者を一緒にしても推定できるから、
たぶん支障は無いと思う。多くがこのケースだから、一般的には一緒でかまわない。
ただし、言語を実装する立場であれば、両者を明確に区別して定義/理解できないと
苦労するはめになる(過去の自分)
>>284 C++でも出来るぞ
オーバーロードが曖昧な場合はキャストが居る。
ExampleType x = Function( 1, 2 ); が auto x = Function( 1, 2 ); って書けるだけだろ。 何下らないことでひきずってんの?
どう考えても別物だろ Javaは型検査してるけど、型推論できない 完全に使い分けできるじゃん
ここは設計とデザパタのスレだ
どっか他所のスレでやってくれ
全ての型検査は必ず型推論を伴う。 例えば、 double x = "abc"; は型エラーだが、これはxの型について - double xという宣言からxはdouble型である - x = "abc"からxはString型である の2つの推論結果をunifyできないことからエラーを検出する。 全ての型推論は必ず型検査を伴う。 これは、表現式の型を1つ1つ確定していくプロセスにおいて 必ず矛盾がないかを検証するから。 全ての型検査は型推論を伴い、全ての型推論は型検査を伴うのであれば、 型検査と型推論は同じものの別名にすぎない。Q.E.D.
そのネタはどうでもいいから帰れ
このスレは実装技術についていけずに 設計と称して四角形と直線をひくしか脳がない 底辺SEの巣だからなw
>>361 多分お前が言ってる型推論と皆が考えている型推論は別のものだと思うよ?
其れすらわからないで俺スゲー垂れ流してるのがあわれすぐるwww
自分の世界に生きてるヤツはほっとけよ。 こっちに引き戻そうとしたって無駄なだけだろ。
>>364 少なくとも20年前には既に型推論と型検査は同一技術だというのが
関数型言語界隈での常識だったが?
自分の無知を自慢するのって、楽しい?
>>366 わかったからJAVAで型検査と型推論の分離ができている訳を教えてくれ
型システム自体がショボいから。
しかし、Javaしかわからない(というかJavaすらマトモにわかってない)馬鹿は 言うことがメチャクチャで笑えるw
度々このスレユースケース図の話題でるけど、 UML自体はOOサポートしてるだけで、OOを志向してる訳じゃないから オブジェクト指向型システム設計とはあんまり関係ないよな。 UML全体としてみれば飽くまでラショナルプロセスを支えるツール。
話題に出てるのはユースケース図じゃなくてユースケースね
ユースケースサンタマリア
オブジェクト指向のオススメの書籍教えて
Bluebook
試験答案帳。表紙が青いことからこの名前がついています。主として作文形式の試験に使われます。
Blue Book 読み方:ブルーブック Blue Bookとは、CD-EXTRAの仕様書のことである。 ソニーとオランダのPhilips社によって開発されたものである。 マルチセッションでデータを記録できるようになっており、 第一セッションには、音声データが、第二セッションには、 パソコン用のデータが保存される。このCD-Extraの仕様書の 表紙が青かったことから、Blue Bookという名称が付いた。
378 :
デフォルトの名無しさん :2011/11/28(月) 22:58:23.56
PSの青本のことかと思ってしまう。 赤青緑
本当はブルーブックがいいけど、今ならパープルブックで我慢だな
オブジェクト指向入門のこと?
今はブラックブックだろ?
383 :
デフォルトの名無しさん :2011/11/30(水) 22:01:58.18
デザパタなんてだれも仕事では使ってないよな? 本気で使ってる奴いる?
384 :
デフォルトの名無しさん :2011/11/30(水) 22:08:43.06
やってみようとしたがVisitorがムズくてやめたw
そういうアプローチの仕方するもんじゃないような
煽りじゃなくこのスレレベル低いのな ちょっとがっかりしたんだぜ
デザパタ使わずに仕事してる奴なんているのか? Strategyすら使わないとなると逆に難しいだろ
388 :
デフォルトの名無しさん :2011/12/01(木) 08:32:49.79
デザパタの何使ってる?
389 :
デフォルトの名無しさん :2011/12/01(木) 09:18:36.19
AbstractFactory, Composite, Facade, Strategyあたりが多いかな。
390 :
デフォルトの名無しさん :2011/12/01(木) 09:55:31.05
ほー,Composite, Iterater, Visitor, Builderじゃないの?
じゃないからそう言ってるんだろ(´・ω・`)
Singleton、Iterator、Observer は意図しなくても自然に使ってると思うんだが。
デザパタを使ったクラスライブラリ等を使うのと、 クラスライブラリ等を作るためにデザパタを使うのと、どっち? 後者のことだけ話題にしてると思ったが?
みんな後者だと思うよ。というか、デザパタって意図的に使おうとしなくても、 オブジェクト指向言語を使って普通に開発を進めてれば、 自然に当てはまる構造がコードのあっちこっちに見つかるようになると思うんだけど。
インターフェース的なもので抽象化するものは結構デザパタのどれかに当てはまるだろ。 むしろデザパタのほとんどがインターフェース的なもので抽象化されたものだとも言えるが。
396 :
デフォルトの名無しさん :2011/12/01(木) 19:41:14.73
Javaなんかコアクラス使ってるだけでデザパタべったりになるんじゃない?
MVVMはデザパタに入れても良いんだろうか 入れても良いなら毎回必ずと言っていいほど使ってる
MVCと同じで、原子的パターンじゃないから却下。 デザパタを組み合わせた、分子的なパターンを含め始めたらきりがない。
>>392 > Singleton
役に立ったためしがない
つか、どんなときに使ってるんだよ
百害あって一利無しだよな>Singleton
動的型付け言語にはデザインパターンは不要。 デザインパターンは静的型付け言語が不便だからできた バッドノウハウ。
IteratorとかObserverとかどう考えても型付け関係無いパターン多いだろ
>>401 まったくその通りだと思う
少なくともGoF本の著者陣はそれを認識しているし、たとえそうであっても
それらをパターンとして命名しカタログ化した点にGoF本の意義があると述べている
ところが、なぜか「デザインパターンに沿ってなければOOPにあらず」という
不思議な風潮を(特にジャバラから)よく耳にするのが笑えるところ
やった。馬鹿が釣れたw デザインパターンってSmalltalkの世界から生まれたものなんだけどwwww
動的型付けにも部分的には使えるだろうけど、別に動的型付け用のデザインパターンを作った方がいいな
>>399 Cライブラリをラッパーしたユーティリティクラスみたいなもの
イミュータブルで値を保持させておきたいクラス
どちらも複数生成する必要がないしどこから参照されても問題ないからSingletonにしたんだけど何か問題あるかな?
Singletonは使いどころが難しい…
>>404 Smalltalkではパターンとして整理しなくても普通に使えていたイディオムを
Javaではいちいち形を決めて名前を付けて整理しないとうまく使えない、
ってことでしょw
だからその名前をつけたのが Smalltalk時代なんだってばw
409 :
デフォルトの名無しさん :2011/12/02(金) 10:55:35.75
>>401 >動的型付け言語にはデザインパターンは不要。
これってどういうこと?デザパタと型付けは関係無いと思うが.
>バッドノウハウ
これは同意だが.
まったく不要かはともかく、ちまたによくあるJava前提のデザインパターンは動的型付けの言語じゃ不要なものは多い。
411 :
デフォルトの名無しさん :2011/12/02(金) 12:34:06.30
いやいや使ってるならまだ救えるが、デザパタ得意って奴は他で使えん のが多い気がする
デザパタ得意って何か怖いw 得意かどうかという、ステータス的捉え方が恐ろしい。
413 :
デフォルトの名無しさん :2011/12/02(金) 13:27:32.20
得意って比較的よく知ってて肯定的くらいのことだろ。
手段と目的を取り違えてるニオイがするってことさ
>>409 例えばStrategyなんかは共通のインターフェースを用意することにより、戦略を使い回すけど動的型付け言語ならそもそもインターフェースを用意する必要なく使い回せるということじゃないかな
デザインパターンは適したところに採用すれば素晴らしく便利なもの しかし適材適所というのは別にデザインパターンに限らない一般的な話 だから変な使い方をする奴がいるからといってデザインパターンを否定するのは間違い あと デザインパターンはオブジェクト指向の感覚を掴むきっかけとしては良いものだと思う
ぶっちゃけ、先人の作ったコードの中から似た物抽出して それらしい名前つけただけの、なんちゃって技術だろ? 縛られ過ぎる方がおかしいw
>>415 動的型付けは、インターフェースを書かなくて済むだけで、
最低限のインターフェースを持ってないとどのみちエラーになるだろ。(nullや転送できるものを除く)
デザパタと動的型付けかどうかは関係ない。
>>406 そういう使い方をするものをシングルトンとはいわんだろ。
シングルトンってのは、デバイスの書き込み制御を独占管理したり、
アプリケーションに送られてくるメッセージを独占管理する時に使うもん。
あと、C++系固有の話だが、グローバル変数と違い、
初期化順序を制御できるという点がある。
420 :
デフォルトの名無しさん :2011/12/02(金) 21:08:27.72
このスレにふさわしい人たちが現れ始めたような気がする。
421 :
デフォルトの名無しさん :2011/12/02(金) 21:17:30.86
>>414 そもそもオブジェクト指向&デザパタ自身がそのニオイがするのだが
オブジェクト指向=縦割り デザパタ=輪切り こんな感じかえ?
423 :
デフォルトの名無しさん :2011/12/02(金) 21:30:37.66
>>416 あなたはオブジェクト指向とは何か、デザインパターンのそれぞれが
何であるかをきちんと言えますか?感覚ではなく。
>>423 デザインパターン = 書籍『オブジェクト指向における再利用のためのデザインパターン』で紹介されたパターンの事
某言語は何でメソッドがオブジェクトじゃないんだろうな。 double Function( double ) function = Math.abs; function( 100 ); 実際にメモリにオブジェクトとしての実体は持たなくてもいいから、 参照に引き渡されたら自動的にオブジェクトを生成してくれりゃ良かったんだけど。 FunctionDoubleDouble function = MathLibrary.abs; function.call( 100 ); まぁ、現状でも同等のものを作れないわけじゃ無いんだけれども。
>>410 > まったく不要かはともかく、ちまたによくあるJava前提のデザインパターンは動的型付けの言語じゃ不要なものは多い。
いや、全くわかってないw
デザインパターンは実装ではなくて考え方。
Java前提のデザインパターンとか
動的型付け言語で不要とか言うのは、
デザインパターンの本質をわかってない。
お前が言ってるのは実装が不要ってだけの話だろ。
いや、全くわかってないw
427 :
デフォルトの名無しさん :2011/12/02(金) 22:27:56.33
>>426 >デザインパターンは実装ではなくて考え方。
各デザインパターンの”考え方””本質”をきちんと言ってみてくれるかい?
>>427 クラスを変更せず、オブジェクト構造により拡張していく疎結合主義だろ。
>>419 Singletonって使い方限定されているものなの?
クラスのインスタンスを1つしか生成できないようなものをSingletonというのかと思っていたけど
>>427 結城本から
デザインパターンはクラスライブラリそのものではない
デザインパターンはクラスライブラリよりも一般的な概念です。
具体的なプログラム例を読むことも理解の助けにはなりますが、その特定の
プログラムだけがAbstract Factoryパターンなのではありません。肝心なのは
どういう種類のクラスやインターフェースが出てきて、、それらが
お互いにどういう関係にあるか、なのです。
>>429 状態が1つでいいなら、モノステートでいいだろ。
実体が一つである理由を考えてみ。
「Rubyには○○パターンは不要!」 「え?じゃあRubyだとどうするの?」 「こうするだけで実装できる!」 「なにが実装できるの?」 「○○パターンだけど」 「そうだね、それがRubyにおける○○パターンの実装だよ」 将来>426が経験することになる実話w
>>423 デザパタは
>>424 の通り
オブジェクト指向プログラミングは、対象物を中心に置いたプログラミング
100円を両替するをプログラムで表すと、Moneyクラスのexchangeメソッドを引数100を与えて実行する、money.exchange(100) つまりI exchange money 100
SVOのOでObject目的語つまり対象を意味する
これを中心に置いている
OOPではないC言語はで同じことをするとexchange(money,100)moneyも100も引数として同列に扱う
ここが大きな違い
>>431 状態が1つならSingletonにせずにstaticクラスにしてしまえばいい
状態を複数許して実体を1つにしたいときにSingletonを使うということであってる?
何故実体を1つにしたいかは、複数から操作されてしまうと困るから?
いまいちわかってないや
>>429 状態が連続していることを期待した使い方をするとグローバル変数と同じハメになる。
例えば、メソッド間の値の受け渡しに使えば、無限ループが発生することもある。
分岐の予想も困難になる。
まず、そういう用途に使っちゃいけないという点で限定される。
基本的に、どこからどう操作しようと他に影響が無いものじゃないといけない。
それから、シングルトンは、オブジェクトとしての実体をもっている事が一番重要。
CharDevice.Instance().Write(""); のような直接メソッドを呼ぶ用途じゃなく、
Device device = CharDevice.Instance(); のようにインスタンスを突っ込む用途に使用する。
昔は順次、分岐、繰り返しの3つのデザインパターンしかなかったよな などとつぶやいてみる
>>434 あんまりOOらしくないな。あと、Cで書くとじゃなく手続きで書くとじゃね。
金銭の例で言うと、レートのほうが解りやすい。
const Rate jp_yen_to_us_dollar( 75 );
const Rate us_dollar_to_jp_yen = jp_yen_to_us_dollar.Inverse();
jp_yen_to_us_dollar.Conversion( 100 ); // 100円をドルに換算
jus_dollar_to_jp_yen.Conversion( 100 ); // 100ドルを円に換算
クラスだけじゃなく、オブジェクトとして考えることが重要ね。
439 :
デフォルトの名無しさん :2011/12/02(金) 23:23:40.67
デザインパターンを明確に、正確に理解している = オブジェクト指向を明確に、正確に理解している
440 :
デフォルトの名無しさん :2011/12/02(金) 23:27:53.72
>>424 答えてくれてありがとう。
でもそれが答えになっていないことはあなた自身が分かっていますよね。
>>434 まじめに答えてくれてありがとう。
そうですね。最初はそういう説明をしたりされたりするね。
”オブジェクト指向”を”対象中心”と言い換えてくれたんですね。
では”対象中心”とは何かと聞きたくなりますが。
例がついているのはありがたいですね。SVOのOっていうのはほんとですか?
Sは中心にはならないのですね?
>>424 や
>>434 のようなデタラメをもっともらしく言うのは頼むからやめてくれよ
冗談のつもりなのかもしれないが、
>>420 のように騙される人も出てくるからさ
デザインパターンはドカタの方がよく知ってるなw
俺はドカタじゃないから、デザインパターンなんて知らなくていいんだよ。とか 本気で言ってそうwww
動的型付け言語にはデザインパターンはないとかいうような バカどもですからねwww
Object = 目的語 これを言い出す人多いよね。自動詞的メソッドをどう説明するんだろうか? Thread#runなど。
447 :
デフォルトの名無しさん :2011/12/02(金) 23:34:56.79
>>427 結城本から
デザインパターンはクラスライブラリそのものではない
デザインパターンはクラスライブラリよりも一般的な概念です。
具体的なプログラム例を読むことも理解の助けにはなりますが、その特定の
プログラムだけがAbstract Factoryパターンなのではありません。肝心なのは
どういう種類のクラスやインターフェースが出てきて、、それらが
お互いにどういう関係にあるか、なのです。
>>440 SVOのOはObject
OOPのOもObject
smalltalkのメッセージ送信の対象という意味でも合致していると思ってる
>>449 ( Message object object object object )
これどうすんの?
>>446 Threadクラスに対してrunというメッセージを送信する
I send run message to Thread
これの目的語というのが正しい気がする
453 :
デフォルトの名無しさん :2011/12/02(金) 23:44:28.14
>>448 結局結城本では、
デザインパターンとは,どういう種類のクラスやインターフェースが出てきて、、それらが
お互いにどういう関係にあるかであると言っているのですね。
各デザインパターンについてそういう形の説明ができますか?
>>431 横レスだがモノステートは調べて今知った。でもこれだと、派生クラスに適用したい場合はどうしたらいい?
あと、GoF 本は Singleton の目的を「インスタンス数を1つだけに制限して、それにアクセスするグローバルな方法を提供する」
って書いてるだけだから、俺は
>>429 で合ってると思うんだが。出来たら、もうちょっと詳しく説明してくれないか?俺の頭では分からんので。
>>453 はい、この場合のクラスやインターフェースというのは
Java用語ではなく一般的な意味です。
それは、「その特定の プログラムだけがAbstract Factoryパターンなのではありません」と
書いてあることからも明らかです。
>>453 もしかしてデザインパターンを知らないの?
自分が、if文を教えて下さいと
言っているのと同じだって分かってるかな?
>>456 何を見た?ぐぐって先頭のページにでてくるモノステートは間違ってるからな。
class Mono
{
static int value1;
static int value2;
public:
int Method()
{
return value1;
}
}:
Mono mono;
モノステートはこういうヤツ。当然親も子も継承できる。
やっぱり、デザインパターンとかオブジェクト指向に関しては Javaプログラマがかなり先を言ってるね。
461 :
456 :2011/12/03(土) 00:00:08.87
>>459 いや、既に親クラスがあって、その派生クラスのインスタンス数を制限したい場合。
class Base { public virtual int Hoge { return 0; } }
class Sub : Base { public override int Hoge { return 1; } }
この場合で、Sub のインスタンスを1個にしたい場合はどうしたら良い?
462 :
デフォルトの名無しさん :2011/12/03(土) 00:00:40.83
>>460 デザインパターンの市販本のほとんどが、Javaを使って説明しているからね。
463 :
デフォルトの名無しさん :2011/12/03(土) 00:01:49.43
>460 実はそのデザパタとかOOが遅れているということもあり得る
マーティンファウラーとケントベックがオブジェクト指向の先端という感じがする この2人はJavaというよりsmalltalk というかオブジェクト指向の発祥ってどこなの?
>>462 Java以外にもたくさんあるぞ。
Amazonで「○言語 デザインパターンで」調べてみ。
>>461 モノステートは状態を1つに保つだけ。
インスタンスの数は制限しない。
インスタンスの数を制限したいならシングルトン。
>状態が1つでいいなら、モノステートでいいだろ。
前にこう書いたろ。
467 :
456 :2011/12/03(土) 00:06:52.86
プログラムが綺麗にバグなくかければ、オブジェクト指向だろうが、関数型だろうがデザパタだろうが何でもいいです(´・ω・`) 実際はその辺のハイブリッドだしな。
軽くぐぐったらSimulaからsmalltalkで普及みたいだな メッセージ送信を唄っているsmalltalkのオブジェクト指向に合致しないのものは、また別のオブジェクト指向と捕らえるのが正しいのかね クラス、型システムをオブジェクト指向として捉えて広めたのがまた別に誰かいた気がする
>>468 バグの問題じゃないだろ。
OOのメリットは、既存のコードを変更しないで済むことなんだから。
471 :
デフォルトの名無しさん :2011/12/03(土) 00:15:40.66
質問。 デザインパターンについて、30歳のSEに聞きました。 「あなたは、一パターンでもよいから、デザインパターンを適用したことがありますか?」 はい、と答える人は何人いると思う。
472 :
デフォルトの名無しさん :2011/12/03(土) 00:16:36.97
>>471 です。
100人に聞きました、が抜けていた。スマン。
>>467 そもそも何でインスタンスを一つにしたいんだ?
map[ SINGLETON_A ].Method();
map[ SINGLETON_B ].Method();
とかしたいわけじゃないんだろ?
476 :
456 :2011/12/03(土) 00:26:25.89
>>473 インスタンスを一個に絞りたいことはよくあると思うんだけど?
例えばクラスのメタ情報とか、コードで定数を定義するときとか。
基底クラスで既定値を定義しておいて、派生クラスで変更分だけ上書きして使えば、コードの見通しが良いでしょ?
>>476 それはインスタンスじゃなくて状態を一つに絞りたいだけじゃないか?
あと、シングルトンは、親クラスを持つことはできるけど、子クラスを持つことは不可能だからね。
ちなみに、英語圏だとファクトリー用途が多いらしい(ファクトリーのメモリー消費節約のため)。
シングルトンの問題は、モックでの差し替えが困難なために、テストしづらくなる事。 レガシー本の例では、DBコネクションをシングルトンにした場合の呼び出し側のテストの書き方について書かれてる。
ファクトリークラスって、何処までが範疇なのかね? RequiredRuleFactory factory(param); Rule *rule = factory.Create(arg); こういうのが一般的だろうけど、 見た目さえ変えりゃ、これもファクトリーみたいなもんじゃん。 Query query("select %1 from table"); Result *result = query.Post(&db);
>>478 だよね。
だから最近はDIコンテナ側の設定で
シングルトンにするかどうかを決めるようになってきてるよね。
動的型付け言語の世界にも
早く普及してくれるといいんだけど。
481 :
456 :2011/12/03(土) 00:54:40.73
>>477 確かに状態を一つにしたいんだけど、その状態がインスタンスでないと多態が使えなくて困るので……。例えばこんな感じ。
class MetaData { public virtual string GetCode() { return "Unknown"; }
class PersonMetaData : MetaData {
public static MetaData Instance = new PersonMetaData();
public override string GetCode { return "Person"; }
}
main() { PrintMetaData(PersonMetaData.Instance); }
PrintMetaData(MetaData data) { print(data.GetCode); }
>>479 Postの戻り値がなんなのかさっぱりわからんけど、
もしそれがResultがインターフェース(抽象クラス)であるのなら
それはファクタリーだよ。
デザインパターンの本質
それは、実装ではなくて考え方なんだから
見た目(実装)は関係ない。
それがファクトリーの考え方による設計で、
実際にファクトリーの動作をしているのなら
それはファクトリーパターン
484 :
456 :2011/12/03(土) 01:14:14.58
>>483 そかな?
モノステートだと。基底クラスもモノステートじゃなきゃ new するたびにメモリ確保が走っちゃうし、インスタンス毎に値が書き換えられちゃうし。
Singleton の方が安心して使えると思うんだけど。
>>484 ああ、子の状態を一つにしたいのか。
それならシングルトンの方が向いてるかもね。
題材がシングルトンに向いてるかは別だけど。
明らかにインスタンスを1つに絞りたいのが目的の割にはどっからでもアクセスできすぎる しかもインスタンスの生成場所まで変化するのはやりすぎ あきらかに不具合
なんでメソッドの引数から渡すのを嫌ってグローバルアクセスにまわしたの? ここの納得できる強力な理由がほしい
>>486 privateなコンストラクター書いてないし単にミスじゃね?
別に引数から渡していいんだよ。
>>487 多分意図がちがうと思う。列挙型の要素みたいな感じなんだろ。
変化するもんじゃなさそうだ。
まぁ、だったらコンストラクターprivateにして、オブジェクト側は、
public const static MetaData PERSON_META_DATA = new PersonMetaData()でいいと思うけど。
491 :
456 :2011/12/03(土) 01:45:55.35
>>485 ごめんね、頭の中が多態で使う〜でいっぱいになっててソースが不適切だった。
最初のソースでちゃんと説明していれば、頭の方で終わってた話だった。ごめん。
>>490 そうそう、Singleton の話だから private コンストラクタは書かなくても伝わるだろうと端折っちゃった。
const は書き忘れた。
492 :
490 :2011/12/03(土) 01:49:14.38
よくよく考えたら全然良くないわ。そもそも
>>476 の話からすると、
クラスごとのメタ情報を持ちたいだけ。
だったら、そのメタ情報を付与するクラスにpublic MetaData MetaData();ってメソッドもたせて、
そのクラスの中に、private static MetaDate metaData = new MetaData( "Person" );とか持たせておけばいい。
まぁ、この方法だと既存のクラスには使えないけどね。まぁ、そういう場合はトレイトだ。
493 :
456 :2011/12/03(土) 01:56:54.84
>>492 あくまで例だから、あんまり突っ込まんといて。
メタ情報を付加させる場合も実際はインナークラスとして定義したり、ジェネリックを使ったりと色々だから。
>>470 コードの再利用の目的の一つにバグの低減があるとは思わないのかね?
コードを再利用したら一つのバグが 何百個のバグになるだろ。
何百ヶ所のバグを修正するよりは、一ヵ所のバグを修正する方がマシだろ。
>>480 動的型付けならシングルトンでもモックに差し替えるの簡単だから
普及しないと思うよ。必要無いもの。
498 :
デフォルトの名無しさん :2011/12/03(土) 09:47:42.48
499 :
デフォルトの名無しさん :2011/12/03(土) 09:51:28.65
漏れは2年間ほど掛かったが、オブジェクト指向設計をマスタしました。 2,3のデザパタも習得しました。 これから残りのデザパタを習得するつもりです。 そこで教えてもらいたいのですが、どのデザパタが現場では使われますか。 全部なら全部でもよいのですが、よく使われるものは何か知りたいのです。 列挙していただけたら非常に助かります。
500 :
デフォルトの名無しさん :2011/12/03(土) 09:53:43.85
>>470 >OOのメリットは、既存のコードを変更しないで済むことなんだから。
この俗説ほんとか?スパゲッティもまたそうやってできたのだが
>>500 既存のコードを修正しないで新たな機能を追加することができる
その機能を実装する(使う)ときは当然コードの修正は必要
しかしその使うという意志を表明している部分を変更するだけで済む
機能の追加と実装を分けて行えるのがメリットだと思う
>>499 >>388 から同じ話題が出てる。ただ、現場で頻出するパターンを抽出して名前を付けたのがデザパタなので、
全部の名前と目的ぐらいは知っておいて損はないよ。一度 GoF 本を通して読んでおくといい。
>>501 OOでそれが出来る事に異論は無いが、OO以外では出来ないと思った理由は?
504 :
デフォルトの名無しさん :2011/12/03(土) 12:03:56.73
>>503 ポリモーフィズムが実現できればOK
C言語ではできない
Cでも関数ポインタとか使えばできるだろ
組込みだとOOA、OODで開発進めて 実装はANSI Cという世界だったりするよ
確かこんな感じにできるな
【第4回】多態性(2/3):CodeZine
http://codezine.jp/article/detail/3709?p=2 >>503 に解答すると
オブジェクト指向"言語"以外でもできない というわけではない
手続き型言語だとしても "オブジェクト指向" を採用することにはなる
しかしその場合オブジェクト指向"言語"ほどオブジェクト指向を容易に実現することができない
よってOOという思想を使わないと実現できない
ってことになるんじゃないのかな
カプセル化もC言語で実現できるし継承も無理矢理実現できる 極端な話他の言語の多くはC言語で作られているのだからできないわけがない じゃあC言語は、オブジェクト指向言語や関数型言語なのか?というとそんなことはない
>>508 ポリモーフィズムひとつとっても、OOPのそれは
subtype polymorphismというポリモーフィズムの一種にすぎない。
OOという思想を使わないと実現できないってことは無いよ。
>>432 > 「Rubyには○○パターンは不要!」
>
> 「え?じゃあRubyだとどうするの?」
>
> 「こうするだけで実装できる!」
>
> 「なにが実装できるの?」
>
> 「○○パターンだけど」
>
> 「そうだね、それがRubyにおける○○パターンの実装だよ」
>
>
> 将来>426が経験することになる実話w
>>426 じゃなくて
>>410 の間違い。
↑はすでに
>>410 に書いてある通りじゃん。
513 :
デフォルトの名無しさん :2011/12/03(土) 14:56:48.69
>>501 >既存のコードを修正しないで新たな機能を追加することができる
そのカラクリは要するになんだっけ?
>>513 ポリモーフィズム
それはOOの1つのメリット
これに何か問題ある?
515 :
デフォルトの名無しさん :2011/12/03(土) 17:53:30.03
>>514 俺には難しい説明だな。
それにポリモーフィズムってマイナーな特徴という認識なのだが
>>514 OO以外でも実現できるポリモーフィズムを
OOのメリットと呼ぶのに違和感がある
517 :
デフォルトの名無しさん :2011/12/03(土) 18:05:01.93
>>514 >>515 >516
OOが何であるかがはっきりしていないんだからあまり意味のない
コメントだな
>>516 まずOOのメリットはポリモーフィズムだけではなく、一般的にはカプセル化、継承もそれに加わる
あとOO以外で実現というのがそもそもおかしい
OO以外ではなく、オブジェクト指向”言語”以外でも実現できるというのは同意
手続き型言語でもオブジェクト指向の思想は反映できるということ
だと思ってる
520 :
デフォルトの名無しさん :2011/12/03(土) 18:32:31.54
>>518 だれに言ってるのかどこを読めと言ってるのか知らんがそういうのは
踏まえたうえでの議論だと思うが
>>518 ML polymorphism がアヒャってのはわかった
>>520 1.3章あたりに polymorphism のざっくりとしたレビューが書いてあるから、そこじゃね?
OOP の polymorphism にも触れてる
>>519 ポリモーフィズムもカプセル化もオブジェクト指向に固有のコンセプトじゃない
関数型言語にだってある
継承はユニーク
アグリゲーション・コンポジション辺りは?
>>523 それはマルチパラダイムということじゃなくて?
関数型言語の定義要素の1つとしてポリモーフィズムもカプセル化もあるの?
527 :
デフォルトの名無しさん :2011/12/03(土) 19:34:37.47
>519 オブジェクト指向の思想って? 与太話になりそうで好かん
>>526 SMLにはポリモーフィズムもカプセル化(モジュールの)もあるけど
オブジェクト指向言語という人はいないと思う
>>528 ということはオブジェクト指向とそうじゃないものわ分けるには、ポリモーフィズム、カプセル化とは別の基準があると思ってるということだと思うけどそれはなんなの?
それともオブジェクト指向というものをそもそも認めないということ?
>>529 528じゃないが、原理の面から言って、オブジェクト指向かどうかは、
オブジェクトに指向してるかどうかが基準であって、
OOPLかどうかは、OOPをすることを目的として
言語が設計されてるかどうかの問題。
ある言語を使ってOOP出来るかどうかによって
その言語がOOPLかどうか決まるわけじゃない。
SMLは、オブジェクトの連携によって駆動するプログラムを
作るために設計された言語なの?
ちなみに俺は多態やらカプセル化やらは、OOのメリットだとは思ってない。
OOである方法論の単なる構成要素のうちの1つだと思ってる。
>>530 >ある言語を使ってOOP出来るかどうかによって
>その言語がOOPLかどうか決まるわけじゃない。
ここは
>>519 の通り同意見。
ではそのOOP出来るというのはどういうことを指すのかを知りたい
ポリモーフィズム、カプセル化、継承できることを指すのかと思っていたけど、
確かにこの3つは、何かを目指した手段と言われれば納得
その目指す先は「オブジェクトの連携によって駆動するプログラム」?
オブジェクトの連携によって駆動するプログラム とは具体的にどういうこと?
破壊的操作(副作用)に対するスタンスがOOPと関数型言語では違う気がする 関数型では破壊的な操作を必要最小限にする方向を目指すけど、 オブジェクト指向ではそんなこと無くて、その代りに レースコンディションの解消はオブジェクトが各自の責任で行う
533 :
デフォルトの名無しさん :2011/12/04(日) 09:55:58.55
>>530 >オブジェクトに指向してるかどうかが基準であって
だからそのあなたが大事にしている「オブジェクトに指向してる」って
いうのはどういうことなの?
534 :
デフォルトの名無しさん :2011/12/04(日) 10:11:45.44
昨日、コンポジット、プロキシパターンを勉強した。 コンポジットには感激した。これは使える。
535 :
デフォルトの名無しさん :2011/12/04(日) 10:28:38.10
>>534 >コンポジットには感激した
その大部分は再帰に感激したのかな?それとも
>>526 型クラス(typeclass)とか?
これは、どっちかというと、オーバーロードのニュアンスが強いから、ちょっと違うか
日本語訳も多相が使われるし
>>532 それは関数型言語とそれ以外の言語の比較であって、オブジェクト指向の特徴とは言えないような…
538 :
デフォルトの名無しさん :2011/12/04(日) 11:07:06.06
>>535 再帰はもちろんだが、単独者と部下持ちの区別をパターンでやってしまうところがよい。
539 :
デフォルトの名無しさん :2011/12/04(日) 11:22:16.90
>>535 区別?むしろ同一視するんじゃなかったっけ
細かくてスマン
540 :
デフォルトの名無しさん :2011/12/04(日) 11:35:19.65
>>539 >>538 です。細かいことはSEとしてはよいことです。
区分という表現は曖昧でした。エレメントがあるかないかを見て分別しているでした。
>>519 継承も多態性もカプセル化もメリットなんかじゃないだろ。
「ウチの車のメリットはV10エンジンを積んでることです」なんていうのかよ。
「リッター80kmで、1秒で100Kmまで出ることです」ってのがメリットだろ。
リッター80kmで、1秒で100Kmまで出る エンジンを積んでるのはメリットだけど? もしかして継承や多態性やカプセル化で 何が出来るか知らないってこと? そこから説明しないといかんの?
>>542 「V10エンジン」を積んでることは別にメリットじゃない。
同じ性能出るエンジンなら別のエンジンでも構わない。
同じことが出来るのであれば、別に継承である必要でもないし、
カプセル化である必要もないし、多態性である必要もない。
継承だって、サブクラス化や、転送とか環境により別の実現方法があるし、 カプセル化だってOO的な手法じゃなくクロージャで実現する方法もある。 多体性というならドライバ関連でOO以前からありふれてた OOのメリットとは言わん。
ということで極論すれば アセンブラでOKと言いたいわけかw
クロージャーじゃなくても ジャンブで実装できるしな。
>>544 クロージャでカプセル化するとき、OO的な思考が入ってるはず。クラス的な手法じゃなく、ならともかく。
どちらもOOの実現方法にすぎんでしょ。
>>482 PostがResul返すかどうかはFactoryかどうかに本質的に関係ないだろ
そもそもResult以外返せばコンパイルエラーだ
俺の感覚では
>>479 はファクトリとは言わん。サブクラス切り替えて生成するインスタンスを変えてるんじゃないっしょ
>>548 クラスがあるから、C++は、C#の思想が入ってるといってるのと同じ。
視点がおかしい。
>>550 んーそうかー?
クロージャでカプセル化するんなら、何かを隠蔽して、それを何かで公開してるんだよな?
それをOO的な思考で実装しないことが出来るとでも?っ・・・ってできるかorz
まーでも、普通そーいう雑な設計はしないっしょ。何がしたくてカプセル化なのか謎すぎだから。
>>534 その二つなら寧ろProxyに感激してほしいなあ
>>531 >>533 OOPの基礎的な部分は属性と操作を持ったものをオブジェクトとして
それらが相互に操作しあって自分の属性を更新することで
プログラムが動作すること。
その基礎をもとに発展させた方法論のうちで代表的なものが
クラスベースの方法なんで、狭義なそれを暗黙にOOPと呼ぶ人も居る。
>>468 拡張に対して開きつつ修正に対して閉じてないと失格ですよ
>>500 例えば、下の実行引数解析コードだと、ArgumentとOptionAlphaとかの親となる、
Optionを書き換える必要は金輪際無い。あたらしい、オプションが必要になったら、
Optionクラスの子クラスを増やすだけ。引数解析の仕組みを増やしたければ、
Argumentの子クラスを増やすだけ。既存のOptionの子を書き換えたり、
Argumentの子を書き換えることはない。書き換えるとしたらバグがあったときくらい。
// クラス定義
OptionAlpha alpha;
OptionBeta beta;
public:
ExampleType( const Argument &arg )
{
OptionMap options;
options["a"] = α //GArgumentの場合は-aに対応
options["alpha"] = α //GArgumentの場合は-alphaに対応
options["b"] = β //GArgumentの場合は-betaに対応
arg.Anarize( MapAdapter( options ) );
}
// 呼び出し
GArgument argument( argc, argv );
ExampleType example( argument );
>>551 肝心なトコが抜けてる。日本語的な意味でおかしいと言ってんの。
OOがクロージャを、クロージャがOOを含んでるんじゃなく、
カプセル化を、OOとクロージャが含んでんの。だから視点がおかしいといってる。
557 :
555 :2011/12/04(日) 15:33:55.87
あ。alphaがαになっとる。
紛らわしいこと書いたな。 >ArgumentとOptionAlphaとかの親となる、Optionを書き換える必要は金輪際無い。 訂正: OptionAlphaとかの親となるOptionと、Argumentを書き換える必要は金輪際無い。
>>553 >自分の属性を更新
ここの出典をプリーズ
>>556 興味深いので拘ってみたいんだけど
>カプセル化を、OOとクロージャが含んでんの。
は同意だけど(個人的には含んでるってよりインプリしてるの方がしっくりくるけど)
単独の関係を検証してるならそれでいいけど、先の話はそれとは別でしょ。
先の話題は、クロージャでカプセル化を実現、した時の話だから、
それをOO視点無しでする設計って現実にあるの?ってこと。
Adapterパターンって元々のクラス設計者の設計間違いを利用者が尻拭いしてるだけみたいに見えるんだけど これがはじめから有効な場合ってどういう場面なんだろう もしくはDuckTypeで動く言語ならかなりの場合不要なような気がする
>>560 逆に、クロージャ的視点なしでオブジェクト設計する事があるの?と言える。
そもそも、クロージャは3番目にできた言語であるLispで実装されたもの。
どちらかと言えば、クロージャの設計思想をOOがうけてるって言ったほうが正しい。
smalltalkのブロックだって、無名関数がベースだしな。
>>561 イベントドリブン。
転送機構の代用品になる。
>>561 尻拭いの感覚でだあたいあってる。
新インタフェースをAdapteeに旧インタフェースAdapterに使うのがデフォだから。
設計間違いと言えるかはケースバイケース。仕様変更だつ
仕様変更だったり、要件定義漏れだったりもするし 最初から使うのは、既存ライブラリをこちらの自持ちAPI都合で都合よく再利用する場合とか
>>561 ダックタイプじゃ代用にはならんよ。
異なるオブジェクトから同じイベントで1つの名前のメソッドを呼ばれたら、
どのみち、イベント元を区別できないし。
>>562 あると思うけど、どうかな?
クロージャ言ったらレキシカルスコーブっしょ。プロトタイプベースのOOでない、クラスベースのOOにその視点は登場しないと思われる。
そもOOなJavaにはクロージャないし。
>>564 キーを2つ取るマップとキーを1つ取るマップの橋渡しとか、
独立性と柔軟性を上げてる訳で、別に尻拭いがメインじゃないだろ。
>>559 ごめん。勢い余った。
そこは取り下げるからスルーお願いします。
>>567 まず、smalltalkなんかは、メソッド自体が一つのクロージャ。
それから、OOで言えば、オブジェクト自体がある種のクロージャであり、
オブジェクトのメソッドが、コンストラクターと、実行メソッドだけであれば、
無名関数と同様の動作になる。
>>566 完全な代用にはならないけどかなり多くの場合ダックタイプで救えない?
あるいは言い換えると、ダックタイピングのような機能を持っていない言語は
仕様変更や要件定義漏れに弱いために、デザインパターンという
いわゆる逃げを使わなきゃいけない、といえるのかも
>>570 んー
クロージャの定義をどのあたりにしてるか教えて貰えるかい?
ちょっと広義にしすぎてて、実はそのクロージャと呼んでるのクロージャでない別の何かだったりしないかな?
個人的には、クロージャではコンテキストって概念が鍵になると思ってるから、OOなオブジェクトってだけでは、背後にクロージャという概念が隠れてるとは感じられないんだけど
無名関数は語弊があった、高階関数ね。
>>572 多数の言語でクロージャと言われてるものの最大公約数。
基本的には、Lispのラムダ、Smalltalkのブロック、BCBで使えた__closure。
>>570 smalltalk は知らないけれど、クロージャはそこでのコンテキストに束縛されるところがキモでは。
まあ、OO でもオブジェクトが使う全てを環境としてコンストラクタに渡す、
というような仕掛けで模倣することはもちろん可能だと思うが。
とはいえ、それを明示的にやったら最早クロージャとは言わないと思われ。
# lambda lifting を手でやってるだけ
Smalltalkのブロック式はSchemeのクロージャと同様 レキシカルな文脈で環境を補足するよ
>>566 異なるオブジェクトからあるオブジェクトの同じメソッドを呼び出して、
そのメソッド内で呼び出し元を区別したいっていうの?
それ、ObserverパターンかVisitorパターンと混乱してない?
>>576 BlockContextクラスのインスタンス
>>580 他のクラスはインスタンス化のタイミングで環境を補足しないの?
BlockContextクラスだけ特別扱いになっている?
しっくりこない。
環境捕捉はインスタンス化のタイミングってより関数定義のタイミングなんじゃないかな? まー、Smalltalkerでない俺は話題についてけてないんだけど
デザパタ・オブジェ厨はすぐに孤立するな。優秀なんだが。
よくわからんけど、スタックフレームへのポインタをフィールドに持っている、 みたいな感じ?うーむ・・・ これはオブジェクト指向とは関係なく、Smalltalk でクロージャを実現するための言語機能とみるべきじゃないの?
かなり話が広がってきたけど
>>501 のメリットというのは、オブジェクト指向のメリットではなくポリモーフィズムのメリットということであってる?
それでオブジェクト指向とは何?
という話は
>>553 でそのメリットはなんなんだろう?
>>571 Adapterパターンって元のメソッドのシグニチャを変えたいって話だと思うから、
ダックタイプがそもそも結びつかない気がするんだけど
>>585 >>501 は実装と使用という全く別概念を同義に使ってしまうあたり
言葉の使い分けが微妙なので
引用して議論すると混乱の種になるぞ
>>585 オブジェクト指向とは、
クラスや継承やポリモーフィズムを総称した呼び方。
ポリモーフィズムのメリット=オブジェクト指向のメリット
オブジェクト指向のメリット =カプセル化のメリット +インヘリタンスのメリット +ポリモーフィズムのメリット +ダイナミックバインディングのメリット 一つ一つは他のパラダイムでも実現できるけど これらをバランスよく実現して普及したパラダイムがオブジェクト指向だった。 では駄目なの?
レイトバインディングやポリモフィックな言語機構ってOOなら必ず持つんだっけ?
言語設計者がこれはOOPLだって言ったらOOPL
int a = 1; int b = 2; マルチプルインスタンス!
>>591 つまり規範的な概念ではなく記述的な概念ってことか
ファウラー風に言えば
>>586 ダックタイピングが利用できると、そのシグネチャを変えなくても
あとから利用側が同じシグネチャに合わせることができる場面が多いっていう
意味じゃない?
Adapteeのシグニチャが既に固定なんだから、ダックタイプじゃ切り抜けられないっしょ。 ガーと鳴かない状況でガーいわせるんだから。そこでガー言わせるIFミスマッチ埋めがAdapterなんだから。
>>588 総称はないな。そもそもクラスベースじゃないOOもあるし。
その程度の反論には、 クラスベース または プロトタイプベースって 言い換えるだけだよ。
「OOっぽいもの」と「よりOOっぽいもの」があるだけで定義付けは不毛
総称と呼ぶのが不適切だ、という点が肝要なんだが
AdapterはJavaでいうとclassファイルがjarで提供されているけど、srcファイルは提供されていない その機能を現在作成中のプログラムの中で、使いたいんだけどインターフェースがあっていない だからAdapaterを作成してインターフェースを合わせましょう っていう話だよね 以下委譲を利用したAdapter 提供されているクラス 変更不可 class Adaptee{ int test(int a, double b){ return a + b; } } 自分が作成しているクラス インターフェースは変更不可 Interface Test{ void test(double b, int a); } class Adapter implements Test{ private Adaptee adaptee = new Adaptee(); void test(double b, int a){ adaptee.test(a,b); } }
自分が作成しているクラスのインターフェースが変更不可って場合はダックタイプでも救えないってわけね。
継承がなくて委譲だけをひたすら使う場合でもオブジェクト指向って言うんじゃねえ? とすると オブジェクト指向 = (クラス | プロトタイプ) and (継承 | 委譲) ans 多態性 の総称 すっげぇ定義しづらい・・・
>>408 シッタカはやめとけw
例えばsingletonなんて、Smalltalkで使われていた頃はsingletonとは呼ばれていなかったぞw
なんてよばれてたの?
sole instance
sole insntanceはあるクラスのインスタンスが 一つしか存在しないということを指す言葉。 たとえばTrueクラスのインスタンスはtrueのみ。 Singletonはあるクラスのインスタンスを 一つに制限するときに使うパターン(コード・設計)。 あるクラスをsole insntanceにするときに使うのが Singletonパターン。こういう使い方をする。 Singletonとsole insntanceは別物
>>601 > っていう話だよね
違う
ソースが提供されているかどうかは全く関係ない
>>608 ソースが提供されていたら、自分のインターフェースに合わせて変更してしまえばいいんじゃないか
と思っちゃうんだけど違うのかな
提供されているクラスは充分にテストされているから、変更せずにそのまま利用したい
ということ?
動的型付け言語使いなんだろ? インターフェースが変わるとコードもテストも 大量に修正が必要になる。 だから変えようと思っても変えられない。 リファクタリング機能が充実している Javaでは信じられない発想。
例えばGUIアプリケーションのプレゼンテーションモデルとドメインモデルとの関係を 考えると分かりやすいと思う。 ドメインモデルを直接変更してしまうと、表示画面に特化した再利用性の低い ものになってしまうので、アダプターパターンを適用する。 プレゼンテーションモデルというのはJavaのJComboBoxにおけるComboBoxModel などのことで、アダプターパターンを用いることで、どんな形のクラスであってもソースの 修正なしにコンボボックスという形で表示することができる。
>>610 Java使ってるのにソースの互換性を考えたことないのね
>>577 javascriptで書くけど、Observer、Visitorってのは、ここまでの範囲じゃん。
button.addEventListener("click", function( event ){ alert( "I'm visitor." ); }, false);
Adapterでイベントを区別するってのは、こういうこと。
function StartAdapter( delegateTarget ) { function( event ){ delegateTarget.start() } }
function StopAdapter( delegateTarget ) { function( event ){ delegateTarget.stop() } }
var mainLogic = new MainLogic();
buttonA.addEventListener("click", StartAdapter( mainLogic ), false);
buttonB.addEventListener("click", StopAdapter( mainLogic ), false);
間違った、こうね。 function StartAdapter( delegateTarget ) { return function( event ){ delegateTarget.start() } } function StopAdapter( delegateTarget ) { return function( event ){ delegateTarget.stop() } }
>>589 仕組みで言っても仕方ないって。
OOPLってのは、OOの目的を達成を支援する事を標榜してるだけで、
目的のためなら、手段は色々なんだから。実装継承の無いOOPLもあるし、
javascriptみたいにカプセル化を持たない言語もある。多態性に関しては、
コアなんで、流石にサポートしない言語は無いけど。
OOは、そもそもSimulaのシミュレーションから着想を得て発展させたもの。
水分子や、酸素分子はそれぞれ別の振る舞いをする。
酸素の溶けた水中は、グラフ構造で表現するのが自然だが、
グラフのノードたる、水分子、酸素分子は別々の振る舞いをしてしまう。
これを上手く、自然に再現するには、既存の手法や言語ではどうしても不細工だった。
それをキレイに表現しようと発展したのがSimula。
更にこのノードをオブジェクトとして定義し、分子などをコンピュータ上のリソースに応用しようと
考えたのが、SmalltalkとC++であり、その考えがオブジェクト指向となっている。
なので、OO概念 = 異なるリソースのグラフ構造表現 だ。
ノード単位での並列化を加えたものがアクターモデルと呼ばれていることからも、
概念は、はっきりしている。
OOPLとは、あくまでこの「異なるリソースのグラフ構造表現」をどれだけ楽に実装できるかを
目指した言語であるだけで、別にどの機能を持っているからOOPLという話ではない。
>>616 読むのだるいんで、下らない喩え話を省いて。
>>614 ええと、かなりわからん・・・ごめん。
それはAdapteeは
mainLogic.start()、mainLogic.stop()でいいの?
で、
buttonA.addEventListener("click", mainLogic.start, false);
で済ますことができないシチュエーションがあるってことでいい?
そして
「異なるオブジェクトから同じイベントで1つの名前のメソッドを呼ばれたら、」
っていう文言を翻訳すると、
異なるオブジェクト : buttonA および buttonB
同じイベント : addEventListener("click")
1つの名前のメソッド : *Adapter(mainLogic) ???
ってことかな?最後のは別に1つの名前のメソッドじゃないから、違ってる気がする。
>>617 OOPLとは、あくまでこの「異なるリソースのグラフ構造表現」をどれだけ楽に実装できるかを
目指した言語であるだけで、別にどの機能を持っているからOOPLという話ではない。
>>618 >buttonA.addEventListener("click", mainLogic.start, false);
これができる言語なんて無いでしょ。デリゲートなり無名関数をアダプターとして挟まない限り無理。
>>618 function method( event ) { alert( "多分、buttonAかbuttonBのどっちかから呼ばれたと思う" ) }
buttonA.addEventListener("click", method, false);
buttonB.addEventListener("click", method, false);
クラスを省いてるんで、また誤解があるかもしれないが、
一つのメソッドが呼ばれると、何処からよばれたか解からんというのは、こういう状態。
勿論、methodが、buttanAと、buttonBを参照してれば、eventオブジェクトで区別は付けられる。
その代わり、buttonAとbuttonBからmethodを切り離せなくなるんで、現実的じゃない。
>>620 2ch の長文はオレオレ理論なのか根拠のある話なのか判別が付きにくいから
原典へのリンクも張って。
>>615 StartAdapterとその中身の無名関数とで冗長
あと大文字で始めるのやめれ、見づらい
>>625 別に冗長ではないだろ
これは、あくまで例だが実際には、
mainLogic以外のオブジェクトも渡す理由だから
無名関数だったら毎回function(event){・・・.start()}って
かかないといけないじゃん
buttonA.addEventListener("click", function(){ mainLogic.start() }); でいーじゃん
コミュ症かー
レキシカルスコープなのに、わざわざ関数作って冗長にする意味ないっしょ 分かりやすさがダンチ
>>626 startじゃなくinitの方が適切な名前だったなーとか、併せて初期サイズを引数で渡した方がいいねーとかなったら
function InitAdapter( delegateTarget, initialSize ) { return function( event ){ delegateTarget.init(initialSize) } }
に変えて
buttonA.addEventListener("click", InitAdapter( mainLogic, initialSize ), false);
にするの?
buttonA.addEventListener("click", function(){ mainLogic.init(initialSize) });
ってだけで済むところを。どんなメリット求めてパターン使ってるの?っていう
>>614 は中途半端に知識を持ったために、かえって悪くなる典型みたいなコード
>>72 の通りだな
イベントハンドラが実はアダプタ使ってるって指摘は面白かったと思う
>>614 はJavaScriptじゃなくJavaで書けば良かったのに
>>616 数学は天文学だとか言うのと同じ程度に眉唾なんだが
発展経緯を知ることは意味があるけど、それがイコール定義ではないでしょ
>>630 startが変化しなけりゃ引数増やす必要ないだろ。
そもそもstartがイベントを受け取る事を前提にしてるなら、
引数が増えたりすることがおかしい。あくまでイベントを別のメソッドで
受け取るためにアダプター噛ましてるだけなんだから。
それはともかくとして、関数に名前付けてんのは、
無名関数を作れない環境でも同じだという事を強調した。
無名関数単品でも他のオブジェクトのメソッド呼ぶだけならアダプターではある。
それはともかく、ダックタイピングが使える環境だろうと、無名関数を作れない
環境だろうと、アダプターをイベントで使うというのがわかればいい。
Javascriptでどれだけキレイに書けるか、Javascriptのセオリーに
従うならどうかなんては問題にしてない。
>>635 引数が増えたりするのは少しもおかしくない
Textで設定値を指定するとか、普通にある
そもそもTargetインターフェースが固定なんだから、Adapteeは可変が前提でしょ。そこ否定してどーすんのさ
おまけ。
問題にしてないと言うなら、主題に沿わないコード断片を書き散らすのやめれ
フォーカスがブレたのなら、それは焦点を絞らなかった書き手の問題だよ。
>>607 違うよ。
つーか、クラスをsole instanceにするとか、用法がメチャクチャだぞw
1つのクラスのインスタンスが1つしかない状況を仮定して、
そのインスタンスを指す言葉がsole instanceで、
そのクラスを指す言葉がsingletonだ。
Smalltalkではinstanceに注目してsole instanceと呼んでいたが、
GoFではよりクラス寄りになったJava等にあわせてsingletonと呼ぶことにした。
>>614 がよくわからないんだけど、誰かJavaで頼む
StartAdapterって何するメソッドなの?
>>616 構造が目的なのではなくて、相互作用が目的じゃないのか?
グラフ構造というよりも、異なる単位間の相互作用、のほうがしっくりくる。
で、流派的には
ケイが動的で柔軟な相互作用を追求し、
ストラウストラップは効率的な相互作用を指向して、
メイヤーは各単位の拡張性/整合性に注目した。
>>634 >>624 以上のソースを出せと言われたら
もう、ISO/IEC 2382-15しか無いんだがな。
知りたいなら高い金だして買ってくれ。
>>636 無いな
C#使ってて、イベントを受け取るために使った場合の
Delegateは、イベントが発行する以上の引数を持たせる事はできないし
テストのために、追加の引数を渡せるように
Delegateオブジェクトを拡張したなんて聞いたことがない
>>638 Swingが解るなら、StartAdapterってのは、他のインターフェースのメソッドを
一つ呼ぶだけのListenerオブジェクトだよ。
JButton button1 = new JButton()
JButton button2 = new JButton()
StopWatch mainLogic = new StopWatch();
button1.addMouseListener(new StartAdapter(mainLogic));
button2.addMouseListener(new StopAdapter(mainLogic));
Javaで書くとこんな感じか。
>>634 じゃあ訊くけどさ、数学の定義を示してくれたまえ。
その上で、その定義とやらが義務教育を受けた一般人にとって
どれだけ眉唾なものか議論しようじゃないか。
関数がファーストクラスのオブジェクトじゃない、 ラムダすら無いうんこな言語で使うパターンですね
Javaでデザパタ学んだ奴って他言語でも 冗長なコード書くよな まさにデザパタの弊害って感じ
ボタンを押された時に実行する処理が、特定のロジックを起動するだけという場合でも、
イベントリスナとして登録するためには、イベントを受け取る関数の形に合わせる必要がある。
これは、ロジック側のインタフェースをイベントリスナとして要求されるインタフェースに
変換しているという見方もできて、その見方をするならば、
そこで作成されるイベントリスナオブジェクトはアダプタパターンを使っているとも言える。
という理解でいいのかな?
確かにそういう考え方をしたことはなかった。
>>632 同意。
>>642 ありがとうよくわかった
ListenerはAdapterパターンが使われているよという主張なのか
そんな当たり前なことで大絶賛とはw
ついでに質問なんだけど、Listenerってどの単位でクラス分割すればいいの? ボタンごとに完全にクラス分けるのか、ある程度は画面ごとにListenerをまとめて押されたボタンを取得してif文で処理分けるのか 理想を言えば前者がいいんだろうけど、クラスすごく増えるんだよね
>>641 Adaterが話題になってるのに、またズレたレスをしたもんだな
>>648 誰も大絶賛してないと思うけど
そもそもそれがAdapterと納得している人はいない気がする
>>645 おまえやおまえの周りがそうだからといって
勝手に一般化するなよ
世界はお前が認識してるより広いんだ
>>643 脱線は一人でやってくれたまへ
コンピュータサイエンスの目的は軍事だという話題もあるぞ
逃げたw
>>635 こういうのもAdapterパターンと呼ぶってこと?
まあ別に良いけど
map(lambda x: x + 1, range(1,10))
おまえ、「おまえ頭おかしいな」とよく言われないか?
>>655 lambdaにより、処理を差し替えれる事から、Strategyになるんじゃない?
もしくは、double-dispatchなしの簡易版Visitor (イディオムとして名前がついていたような記憶があるが思い出せない)
ドカタSEじゃその程度かw
芝生やした単文野郎はなんなんだ
>>647 解ってるかもしれないけど、
Listener = Adapterじゃないからね。
Listenerの中で、複数のオブジェクトや
制御構文を並べて複雑な処理をしてたら、
もはやAdapter(適応)パターンじゃない。
あくまでも、イベントを他のオブジェクトに渡すだけの
最低限の実装で有るべき。Adapterの中で、文字列から
数値型に変えて引き渡したり、ファイル型に変えて
引き渡すぐらいはいいけどね。
やっぱり無名関数を使わず、Targetインターフェースに名前が付いてる場合だけを Adapterと呼ぶんじゃないか?
コード書けないドカタSEが言葉を弄んでいるだけ
>>657 lambdaの中で+(__add__メソッド)を呼ぶだけだから、
>>635 の定義
> 無名関数単品でも他のオブジェクトのメソッド呼ぶだけならアダプターではある。
ならアダプタパターンってことになるな
まあ、
>>662 の言う通りだと思うわ。言葉遊びっつーか馬鹿みたい
今はAdapterパターンばかり槍玉に上がってるけど、 StrategyやらCommandやらVisitorやら、他にもインターフェースを駆使して動的な性質を取り入れようとしているパターンには 動的型付けとかクロージャとかミックスインで代替できるものがいっぱいあると思うよ モダンな言語はデザパタに頼らずに、よりスマートでソースコードの見通しがいい方法で解決すべき。
さて
>>561 に戻るか。
Adapterパターンは、結局ダックタイピングできる言語だろうと、
高階関数つかえる言語だろうと、無意識かもしれんが、使う人は使ってる。
尻拭い以外に使ってることも多いんだよ。
>>664 転送と高階関数で、見かけは存在しないように見せかけられる。
本質的にゃ変わりゃしない。
高級言語はその見かけが大事なんじゃねーか
Adapter=Listenerは間違い 委譲を利用するAdapterだと違和感が少ないけど、継承を利用するAdapterだと気持ち悪さがよくわかる 提供されているクラス 変更不可 class AdapteeModel{ int test(int a, double b){ return a + b; } } インターフェース変更不可 Interface Test{ void test(double b, int a); } 自分が作成しているクラス 変更可能 class AdapterListener extends AdapteeModel implements Test{ void ActionListener(double b, int a){ this.test(a,b); } } ListenerがModelを継承するっていうのは明らかにおかしい いわゆるis a 関係にかすってもいない AdapteeとAdapterは同じ目的のクラスであるべきだけど、ListenerとModelはまったく目的が違う 言葉遊びとかそういうレベルじゃない 今回の勘違いは、委譲とAdapterを同一視してる発言
>>668 なんでAdapterなのに継承してんの?
Adapterが別のクラスにくっついてちゃいかんだろ。
>>660 にも書いたが、あくまでAdapterは、
別のオブジェクトのメソッドに受け渡すだけ。
Listener = Adapterでは無いが、Listenerに
Adapterを使うこと自体は問題ない。
>>668 Listenerは、別にAdapterじゃなくてもいい
ただListenerとしてAdapterが使えるってだけの話だろ
>>668 なんでモデルでもないのにAdapteeModel?
>>672 モデルつってんのに、メンバーもなけりゃ
ブロードキャスト機構が付いてないから、
アレなのかなとおもってさ
>>672 日本語版じゃさも、委譲型が特別形態の様に書かれてるけど、
GoF本や、海外の資料だと、委譲してるのがデフォ。
継承型の方が特殊なんだけど。
日本語版Wikipediaなんて技術関連はいい加減だからなぁ 殆どアニオタの巣窟なんだっけ
いい加減と思った人が書きなおさないから悪いのでは? 自分の責任だと思いなよ。
>>677 なんで情弱御用達Wikipediaの面倒なんか見なきゃならんのよ。
>>674 そこはスルーして貰えると思って省略した
Modelらしくするなら以下を追加 けどやっぱり今回の話とは関係ないので省略
List<Observers> observers = new ArrayList<Observers>();
private int a = 0;
public void addObserver(Observer ob){
observers.add(ob);
}
public void changeA(int aa){
a = aa;
this.notifyObservers();
}
public int getState(){
return state;
}
private void notifyObservers(){
for(Observer ob:observers){
ob.update(this);
}
}
ム板で日本語版Wikipediaからしかソース持ってこれないってのもなあ
>>675 自分もAdapterでどちらを使うかと言われれば委譲の方を使うよ
ただし同じAdapterパターンなんだから委譲も継承も目的は同じはず
en wiki
>translates one interface for a class into a compatible interface
>>678 のサイト
>Convert the interface of a class into another interface clients expect.
>Adapter lets classes work together, that could not otherwise because of incompatible interfaces.
と書いてあるとおりインターフェースを合わせるためのもの
プログラムとか考えずアダプターと言ったらまさしくインターフェースを合わせるためのもの
Listenerでmodelを呼び出すのは、インターフェースを合わせるためではないよね
>>681 ソースなんてGoF読んでくれとしか言えないw
>>680 Javaで、しかもgetXxxxx使ってんだから
せめてjava.beans.PropertyChangeSupportと
java.beans.PropertyChangeListenerぐらいは使おうよ。
>>682 ListenerをAdapterで実装したとき、
Model自体をAdapterが使用する必要ないでしょ。
class Model implements Runnable{}
new RunAdapter( (Runnable)new Model() );
例としては変だけど、Adapterとしての用途なら別にこれでいいわけじゃん。
Example instance = new Example(); Adapter DelegateAdapter = new Adapter(instance.Method); DelegateAdapter( 10 ); .net環境は楽だなぁ
>>683 そうですね
>>684 もちろんそれみたいなListener=Clientの状況なら問題ない
Listener=Adapterはおかしいと主張してる
Listener=Adapterじゃないのは同意してるって。 Listener = { Adapter pattern, Other pattern, ... } にできるっていう意味で書いてんじゃん。 なんで引きずってんの?
別にリスナーをコントローラーで実装しようが、アダプターで実装しようがどうでもいいじゃん
>>667 これにつきるな。ソースコードは設計書であるべきだから本質的でないものが混ざるとストレスたまる。
デザパタはその見通しを悪くするものが多いから、本当に必要なとき以外は極力排除したい。
TemplateMethodみたいに見通しよくするものもあるけど。
>Listener = { Adapter pattern, Other pattern, ... }
俺はこれを否定してるつもりなんだけど
ListenerのどこにどうAdapterパターンを使うんだ
Observerパターンは使ってるけど
>>688 どうしてコントローラーとアダプターパターンが同列なんだ
どうやってリスナーをアダプターで実装するんだ
もう俺だけ理解してない気がしてきた
誰か教えてくれ
>>689 TemplateMethodの見通しが良いかは分からないけど、上二行に関しては同意
ていうか頼むから
>>614 や
>>642 のようなアホコードは書かないで欲しいもんだね
デザパタは構造。見た目は別。 C#でもできるし、GObjectを使ったCでもできるし、Lispでもできる。 アルゴリズムが言語に依存しないのとおんなじ。
デザパタは見通しを悪くするというのは、 単にお前が、設計の基礎知識を知らんだけではないのか? 設計図を読めない人は、設計図をみたらよくわからんと言うだろう。 それと同じだ。
>>690 リスナーはオブザーバーパターンから見た立場
アダプターは、委譲される側から見た立場
直交できる関係であって排他的なもんじゃないでしょ
>>693 本当に必要なときに使うのは誰も否定してないんじゃないの?
>>691 例としてわざとそう書いてるのに空気読めないねぇ。
printfは書式が複雑で見通しが悪いと言っているようなもんだよな。 なぜそうなっているのかその理由と目的を聞いて、 じゃあお前はこの目的をどうやって達成する?と聞いたら 一番いい方法がデザパタと同じコードにになるだろう。
>>695 あんたは、見た目とデザパタを同一視してるだろ。
そこが解ってないと言われてんの。
>>695 だから、本当に必要なときを前提にして
話をしてるんでしょw
>>696 例として不適切なのが相変わらず理解できないのね
>>700 なぜ例として不適切なのか?
いちいちストーリを作らないといかんのか?
>>699 必要もないのに使っている悪例がでてるじゃん
コード見たら、あぁこういう時に必要になるねって 分かるようなコードでも、実勢経験が少ない人には なんでそんなものが必要になるのかわからないんだよ。
>>702 だから、これは必要なときという前提の話。
>>703 むしろ実務経験の少ない人ほど無駄なパターンを多用する傾向があるかと
>>703 それはよくある話だね。
サーバーの話だけど俺は昔リバースプロキシがよくわからなかった。
そのまま繋げばいいのに、なんでそんなものを入れて複雑にするのか?と思った。
今では理由はわかるけど、経験少ないとわからんものだよ。
なんかの本に書いてあったけど、密結合な設計は悪い。
結合を疎にするには間にクッションを入れるみたいなこと。
デザパタもそうなってるんだよね。結合度を下げるために
間にクラスを入れてる。
その理由がわからない人は経験が足りないだけ。
日本語版WikipediaのAdapterパターンのサンプルプログラムを 動的型付け言語で実装すると委譲も継承も必要無いけど、 これも見た目が違うだけでAdapterパターンのはず class Product: def __init__(self, cost=0): self.cost = cost def get_cost(self): return self.cost Product.get_price = Product.get_cost
>>707 そうだね
"本当に必要なときは"使った方がいいね
>>705 よく分かってるけど?
ここに書いている短い例ではいろいろ省略している
めんどうだからね。
本当は○○〜というストーリーがあるんだけど、それを省略している。
このストーリーをちゃんと書けばデザインパターンはそういう目的の
ためにあるんだってわかるはず。
ただ、めんどくさいから書かないよ。経験あればこの程度のストーリーなんて
心当たりがあるはず。ない人がわからんと文句を言ってるだけ。
>>708 デザインパターンの本質は、実装ではなくて考え方なので、
その考え方さえ満たしていれば、いろんな実装がありえます。
button addEventListener("click", function(){ instance.Method(); } ); button.addMouseListener( new ActionListener(){ void actionPerformed(ActionEvent e){ instance.Method(); } } ): button.Click += new EventHandler( instance.Method ); 言語が違おうが、パターンとしては同じって事が解らない人は辛いね
>>710 もういいよ
聞く耳を持たない人には無いを言っても無駄だからね
>>714 もういいよって言ってるのにその返しは無くない?
言語とアルゴリズムとかの概念を切り離せない人って どういう仕事してんだろ?接客とかはしたことなさそうだけど
>>716 そもそも「もういいよ」って返しがありえないだろw
ありえないものには、
ありえないもので返すしかありません。
>>718 お前ってものすごい自分ルールを持ってるね
普通はありえない返しだと思ったらありえないって言うだろw
今なんとなく解った気がする。 ヤツがいってるのはアレか、JavascriptじゃわざわざAdapterなんか使わずに、 面倒だから無名関数の中に直接処理を埋め込めといってたのか。多分・・・
無名関数かどうかは関係ないよ
function(){ instance.Method() } じゃなく、 function(){ 処理ベタ書き } こんな感じか
関係あるのは、直接処理を埋め込むってところだろw
>>725 確かに、それならAdapterパターンつかってないわな。
デザパタ減らしてる。
> function(){ instance.Method() } 引数無しなら instance.Method だけで良いんと違うん?
>>728 javascriptだとMethodの中のfunctionオブジェクトだけ代入する事になるのよ。
instanceとのヒモ付がなくなっちゃう。
>>728 instanceB.Method = instanceA.Method;
instanceB.Method();
これ動かしたら、instanceBとinstanceAどっちが参照されると思う?
731 :
728 :2011/12/05(月) 23:27:09.79
javascriptでメソッド名大文字で始めるなよ気になるから 上のほうでも誰か指摘してただろ
デザパタの目的は結構だが、その実装のためだけに 新たにクラスやインターフェースを作るのは気に入らない ソースコードの見通しが悪くなるから (つーても、使う言語でそれ以外に実装方法が無いなら仕方ないが) 見た目は大事
クラス作るのも関数作るのも大差ないだろ。
みなさんスルーでおねがいします
>>734 往年の派遣土方は、テスト工数じゃなくて、
ステップ数で見積もらなきゃいけないから、
そういうとこが厳しいんだってさ。
オブジェクトで振る舞いの表現ってのも元請けが
理解できないから、なかなかさせてもらえないみたい。
一行のlambdaで済むところを インターフェース + クラスで10行に膨らませて 大規模(笑)開発にしてるとこあるな 行数で評価されるからこれで良いんだってww まさにドカタの発想w
デザインパターンに関してはひがやすをさんが次のように書いているが、これを読んでとても納得した
まさにこれ
http://d.hatena.ne.jp/higayasuo/20101126/1290766099 > きれいなソースコードをかけるようになるためにデザインパターンも知ってたほうがいいんじゃないのという人もいると思いますが、
> デザインパターンはきちんと学んだ上で、いったん軽く忘れたほうがいい。
>
> 軽く忘れるというのは、コードを書いているときに、そういえば、このパターンはデザインパターンのあれに似てるなぁと思い出せる
> くらいに忘れるということです。思い出せたらそれは使うようにしましょう。
>
> デザインパターンが常に頭に常駐している状態でコード書くと、無駄に複雑になっちゃうんだよね。
>
> デザインパターンは、ある程度複雑な問題をきれいに解くために考えれたものですが、もともと簡単なものに適用すると無駄に
> 複雑になってしまうためです。
>>736 派遣はそれに加えライブラリを作れないからな
常にスクラップビルドだから今度最利用するっていう発想はない
>>737 1つ名前付きの高階関数用意しときゃいいのに、
10回も20回もおんなじlambda書くんだもんな
>>743 何を言っているのか分からない
738は自分が読んで納得した意見を紹介しただけなんだけど
あと733は別人ですよ
>>743 切り離してるから、実装方法が選べるなら
簡潔な方を選択しろと言っているんだろ
>>614 のようなアホコードを書かないためにもな
>>737 一行で済む内容を手書きで一行書くのも IDE に十行生成させるのも
手間はそれほど変わらない。別にどっちでもいいと思うようにならないか?
フィールドを 3, 4 個定義して getter/setter の生成をポチっとやった瞬間に
JavaDoc コメントも入れれば 100 行超える。Java での開発ってそういうもんだろ。
614が優れたコードだと思ってる人って614本人以外に一人でもいるの?
>デザインパターンは、ある程度複雑な問題をきれいに解くために考えれたものですが、もともと簡単なものに適用すると無駄に >複雑になってしまうためです。 これは「デザインパターン」を「オブジェクト指向」に置き換えても成立すると思う。
>>745 無名関数が存在するか、無名クラスが存在するか、
Delegateの様なデザインパターンを予めサポートした機能が存在するか、
そんなもん全部言語による。このスレで言語依存の話をギャーギャー続けるな。
>>747 優れてるか知らないけど俺はまだ解りやすいとは思った
無名関数とメソッド呼び出しだけ書かれたら 何してんのかよく解からんがな
>>614 と
>>627 のどちらが良いコードかなんて議論を始める人と仕事はしたくないな。
相手の言いたいことの本筋を掴めず、どうでもいい枝葉末節に拘って時間を無駄にするタイプだろ。
しょうもないアダプターだけで200レスぐらい食ってるもんな。 余計な事言わなきゃ15レスぐらいで終わりそうなのに。
>>614 がその本筋を非常に掴みづらい、分かりづらいコードなのが問題なんだよな…
そういう時間を無駄にしないためにこそ、こんなコードは書いちゃいけない
馬鹿にはわからんというだけの話さ
>>758 え?掴みづらかったか?俺は分かり易いと思ったが。
delegateTarget.start() を EventListener の要求するインタフェースに適合させるという意味で
function( event ){ delegateTarget.start() } が Adapter だと言えるという話だろう。
どこが分かりにくいのか疑問。
>>758 お前だけおかしいんだから、そろそろ空気読んでうせろよ
StartAdapter 関数を定義するのが冗長かどうかなんて論点が出てきておかしくなったんだよ。
「どうでもいい枝葉末節に拘って時間を無駄にする」という実例。
>>614 は日曜だろ。現に 2 日も無駄にしてる。2 日無駄にしてまだ終わらない。
>>760 そうやって意図を説明をしないと分からない
実際、自分以外の何人かも分からないとコメントしてる
>>627 は見たままで誰でもすぐに理解できる
念のため、無名関数かどうかは問題にしてないよ
>>761 残念だけど俺だけじゃないんだな
そっちはどうか分からないけど
そりゃシンプルにかけばObserver、Visitorパターンしか残らんような例を出せば ツッコミも入るわい まあ、いいかげん引っぱりすぎだが
2日たって一周してるしな(
>>758 )
ホント無駄
>>764 2日同じ議論やって、要点だけ抜けて末節だけになっとる。スゲェ・・・。
>>767 お前いたら、他の人に解りやすい説明もできなくなる。
失せろ。
どうでもいいなおまえが帰れよw
>>769 お前が関わると誤った知識が広まるから、お前こそ失せろよ
こういう奴が一番有害だな
みなさんスルーの方向で
>>763 >
>>627 は見たままで誰でもすぐに理解できる
> 念のため、無名関数かどうかは問題にしてないよ
そうかな?俺と感覚が違うなあ。
「Listener のこういう使い方は Adapter パターンの適用と見ることができる」
という説明のための例だろ?
これは駄目だと思うんだ。
> function(){ mainLogic.start() }
function(event) { mainLogic.start() }
と書いてほしい。引数の event を抜いたら、
むしろ本来説明したいことは伝わりにくくなると思う。
>>773 そこは見てなかった
けど、それこそ枝葉の問題だ
AdapterをObserverかVisitorと混同してないか?
と
>>566 が
>>577 にツッコまれて、苦し紛れに出した例が
>>614 だからな
無理矢理Adapterをねじ込んだから不要/冗長なコードになってる
Listener の話題で event 引数を省略することが枝葉だと判断するところが、 感覚の違いだということで。 ああ、こういう話(枝葉か本筋か)に正解はないよ。君と俺との感覚の違い。 どっちが普通でどっちがオカシイかという議論は 2ch でやっても無駄だからやめよう。
やけになって粘着してるからもうほっといた方がいい この手の輩は勝利宣言で終わらなかったら延々と貼りつく
まぁ614の(説明のための)例が良いか悪いかは別として 実際の開発ではこういった書き方はしない方が良いという意味ではみんな同意するんじゃないかな?
では 778 の勝利宣言で終わろう
むしろ無難に収めようかと思ったのに なんでこれが勝利宣言になるの?
どうでもいいけど、無名関数の中でメソッド呼んだだけで アダプターパターン使ったとか現実世界で言うなよ 話通じないしアホだと思われるぞ
さすがに614もそこまではしないだろう
>>775 button と listener の関係が Observer で
listener と delegateTarget の関係が Adapter だね
着目する場所の違い。Visitor はどこを混同するとそうなるのかわからん。
delegation すりゃなんでも adapter なのか?
委譲とか考えてない設計に処理を差し込みたいからAdapterパターンを使うのであって 最初から委譲するように作ってあるものに対してAdapterパターンという言葉を使うのはちょっと違うような
>>649 UIごとじゃなく機能単位で分けられるんじゃない?
例えば、画像編集ソフトで画像を保存する事を考える。
この時、保存は、ツールバーでする人もいれば、ショートカットキーでするひとも居る。
(ActionListener)new SaveControl( (FileModel)fileModel, (ByteModel)imageModel );
みたいな使い方が出来る保存用リスナー作ってツールバーとショートカット(メニュー)に
割り当ててあげれば、ツールバーとショートカットキー用に別々のクラスを書かなくて済むでしょ。
あと、(ByteModel)imageModel みたいな感じで、インターフェースで受け
取れるようにしてれば(ByteModel)soundModel みたいに
他のデータにも使えて、もう少しコードを書く量は減らせると思う。
>>784 デリゲートパターンてのはデザパタに無いからね。
>>782 デザパタは置いとても、無名関数をアダプターとして使ってるぐらい言うんじゃないか?
>>694 違う
ViewとListenerあわせてObserverパターン
立場とか一切関係ない
ModelにAdapterを適用したいことはあるかもしれないから排他ではないがListenerとは関係ない
>>785 この発言でおかしいことがはっきりした
あなたの理論で言うと、委譲とか考えないで、後から処理を差し込むためにAdapterパターン使うはずなのに、結局委譲使ってるんだなw
そもそも後から処理を差し込むためにAdapterパターン使う訳じゃない
Adapterの意味は適合
非互換のインターフェースを適合するために用いるのがAdapterパターン
他の方法でも実装できるんだから、Adapterパターンの本質には委譲は関係ない
委譲はAdapterパターンの実装方法の1つに過ぎない
>>790 MVCで、ObserverにCommandを組み合わせる事はよくあるが、
デザインパターンというものは排他的か?
こんだけ引っ張れる話題提供できた614は満足だろうな ところで静的型付けを持つ言語でクロージャを持つ言語って、そのクロージャの型はどう定義するものなんだろうな 引数の型や数によってそれぞれ別のシグネチャを持つようにデザインされてたら 変に縛りが強すぎて、再びデザパタの生まれ変わりみたようなものを導入することになりそう
?????メソッドのシグネチャと同じだろ。何を気にしてるのか全然わからん
>>792 排他じゃないと書いてるだろ
何を読んでそのレスをしたんだ
下記の例において、Timerクラスは既存のクラスであり修正できないものとする。 ここで、Timerクラスを利用したい開発者がいて、その開発者はactionPerformedというメソッドでTimerをstartしたいとする。 この場合、TimerAdapterというAdapterを作成することで、既存クラス(Timer)クラスを修正することなく、 異なるインタフェースを持たせることができる。 このように、既存クラスを修正することなく、異なるインタフェースを持たせるということが、Adapterパターンの役割である。 class Timer { public void start(); } class TimerAdapter extends Timer implements ActionListener { public void actionPerformed(ActionEvent e) { super.start(); } } イベントリスナにTimerAdapterという名前を付けることに違和感を感じるだろ? その違和感こそイベントリスナがAdapterではない証拠。 イベントリスナを使うときに「意図」しているものはAdapterではない。 Timer#start()をActionListener#actionPerformed(ActionEvent e)という名前で使いたいから リスナを作っているのか?明らかに違うだろ。 デザインパターンは、目的をもって使うもの。 クラス図が偶然に同じ形をしていたからといって、そのパターンを使っているとはいわない。
>>787 GOFパターンにはないけど、他のパターン本でみた気がする。ただの委譲にパターンとか大げさすぎる気もするけど。
>>796 同じ主張の人が現れて嬉しい
他にこれと同意見の人いないの?
いやw 俺は何度読んでも目が滑る。
>>796 の意見は不思議と入ってこない。
反論か同意かしたかったが、どちらもできなかった。
同じ機能だけどシグニチャが違うメソッド間の ギャップを埋めるのがAdapter Timer#start と ActionListener#actionPerformed は同じ機能かって話ですよ
>>799 この主張に対しては妙にレスないんだよな
変な煽り合いにはいっぱいレスつくのに
>>796 ,800
これは結城本の例でいうと、直流12ボルトの電源をアダプタに繋いで交流100ボルトに
変換したとしても飽くまでも電源であるべきで、大まかな機能や目的は変わらないはず。
それに対して
>>796 の例では、タイマーをアダプタに繋いでもタイマーであるべきだが、
出来上がったクラスのインターフェースを見てみると、タイマーであるとはとても考えられない。
ということかな?
確かにこの例だと出来上がったクラスはイベントリスナであることが主であって、タイマー
としての機能はオプションで交換可能なものとして設計されているように見える。
これをアダプタと考えるのは難しいな。
なんでわざわざ継承に書き換えたんだよ。 そもそも視点がおかしい。 C#に書き換えてみれば解りやすい話。 startButton.Click += clock.Start; stopButton.Click += clock.Stop; 本来のリスナーは、clock.Startとclock.Stop。 アダプター自体じゃない。アダプターは、リスナーオブジェクトから、 リスナーメソッドにインターフェースを変換してやる手伝いをしてるだけ。
>>796 > デザインパターン
先人が作ってくれた設計パターンにそれらしい名前をつけただけのもの
問題領域を抽象化する上で、もっとい良い物があればそれを使うべきだ
# 問題領域をうまく抽象化出来ないやつが多いからOOは遅いとか
# 蔑みの目でみられる
>>796 の例を見れば見るほど設計ミスやら仕様変更の尻拭いに思える
actionPerformed()で受けるのをやめるか、
もっと言えばActionListener#actionPerformed(ActionEvent e)なんてパターンをやめて
クロージャやらデリゲートやらブロックやらを直接受け取るようにすればいいのに
>>803 C#の機能でごまかしてるようにしか見えないんだけど
そのコードをJavaで書くとどうなるの?
あと796は委譲の方が良いだろうけど、そこは問題じゃないだろ
>>806 startButton.Click += clock.Start;
startButton.addMouseListener( new StartAdapter( clock ) );
stopButton.Click += clock.Stop;
startButton.addMouseListener( new StopAdapter( clock ) );
重要なのは、本来のリスナーがclockのメソッド側にあること。
>>796 は、リスナーを前提としてないオブジェクトとの結合に視点が固まりすぎてる。
>>807 結局「new StartAdapter( clock )」これだろ?
803では何を言いたかったのか?何のためにC#に書き換えたのか分からない
> 重要なのは、本来のリスナーがclockのメソッド側にあること。
>
>>796 は、リスナーを前提としてないオブジェクトとの結合に視点が固まりすぎてる。
これも何をいいたいのか全く分からない
もうちょっと伝わる書き方をして欲しい
>>808 startButton.Click += clock.Start;
リスナー本体は、clock.Start()。
>>796 は、clock.Start()がリスナーだと思ってない。
だから、アダプター自体がリスナーだと思って違和感を感じるといってる。
>>808 C#に書き換えたのは、アダプターがキャスト(変換)機構に過ぎない事を強調してんの。
startButton.addMouseListener( clock.Start ); そもそもJavaでこう書けてりゃ今回のパターンでアダプターは書く必要ないんだよな
>>809 なんか噛み合ってないな
>
>>796 は、clock.Start()がリスナーだと思ってない。
思っていないというか、むしろclock.Start()がリスナーで無いことが前提の話なんだが
自分は
>>796 の言わんとしていることが分かっているつもりなので、おそらくは809の
方が勘違い・読み違いをしていると思う
というか796にもフォローして欲しいところだな
startButton.Click += clock.Start; こういう書き方って結局できたか? delegateの型を一致させないと+=なんてできなくね? つまり、そこが違ってるからこそアダプタ云々の話になってるわけで、 C#だからといってそこを誤魔化してはだめじゃね?
そりゃ省いただけだが、結局シグニチャを一致させても同じ話だろ。
結局
>>811 ができないから、やってるだけ。
もう寝る
もうAdapterは懲りたろ。 話は変わるが、MVCで入れ子になったビューの コントローラーは、どう扱うのが理想なんだろか。 例えば、YesとNoのボタンを持ったViewがあるとする。 YesNoObserverでも作って、親のViewに管理させ、 どちらが押されたか通知ってのは基本として、 それ以外の動作(Yesボタンが右クリックされた)とかは、 どういう風に通知するのが理想だろ? 親のViewにYesとNoの全てのイベントを委譲 管理させるのは扱いづらい・・・。
>>812 ListenerにAdapter噛ませてListener機能の無いもん喰わせたら
おかしいと思うのは当たり前。
>>802 の話にそえば、
Adapter噛ませてもListenerに渡すものはListener機能を
持ってるもんじゃないとおかしい
リスナってのはイベントに対する単なるオブザーバ。イベント通知の構造。 アダプタってのはメソッド呼び出し。呼び出すための実装。
OOP初めて3日目ぐらいの幼稚な議論ですねw
>>817 うーん・・・
画面を右クリックした段階では、まだ画面との対話中で、モデルやらビジネスロジックには影響を与えないよね。
俺だったらビューのロジックにそのまま書いちゃうなあ。
バリデーションみたいにモデルかどこかと共通化したいなら別途ヘルパー群を作るとか。
(・∀・)ジサクジエーン
もうAdapterパターンはいいよ 一人だけ理解してないということがわかった
オブザーバはデザパタだけどリスナは AwtやSwingでのイベントハンドラの呼び名だもんな
=ではないけど、リスナーはオブザーバーパターンで実装されている
たまたま、Observer Patternを使ってる部分があるだけで、
Observer Patternにしようとして作ってるわけじゃないけどな。
ListenerからListenerを呼び出す場合もある。
基本はdelegation event model。
この辺りが面白い。
http://javafaq.jp/S065.html あとAWT, SwingじゃXxxxxAdapterってクラスがあるけど、
デザパタのAdapterとは違う。そもそもデザパタ本より先にモデルが
作られてるから仕方ない話だが。
828 :
デフォルトの名無しさん :2011/12/07(水) 22:48:35.04
GoF本は1995年 JDK 1.0は1996年 JDK 1.1(AWTにjava.awt.EventListenerが導入された)は1997年
delegation event model を導入したMFCが作られたのは1992年
JDKって0.98時代が長かったような あと、MFCの元になったThinkCのライブラリは…いつ頃だっけ?
MVCのSmalltalk-80が開発されたのは…とか言い出す奴が来るからヤメレ
デザパタが提唱されたのは90年代。 これは間違いないから大丈夫。
ファクトリパターンはサブシステムなどにプロダクトを登録するところまでやっていいんですか? それとも生成以外のことには関与しないほうが良い設計でしょうか? class IGameUnitFactory { public: virtual ~IGameUnitFactory(void) {} virtual SharedPtr<GameUnit> Create(void) const = 0; }; class GameUnitXXXFactory : public IGameUnitFactory { private: WeakPtr<GameState> game; InitParam param; public: GameUnitFactory(SharedPtr<GameState> game, InitParam param) : game(game) , param(param) {} SharedPtr<GameUnit> Create(void) const { SharedPtr<GameState> g(game.Lock()); if(g) { SharedPtr<GameUnitXXX> unit(new GameUnitXXX(param)); g->Register(unit); return unit; } else { reutnr SharedPtr<GameUnit>() ; } } };
書籍デザインパターンには、Factoryパターンってのは無い。 それを踏まえた上で、一般的な意味でFactoryというなら 登録までしていいんじゃないか。 ちなみにデザパタ本の話を持ち出すと、 加工したオブジェクトを返すパターンはBuilderパターンと言われ、 切り替え可能な仮想コンストラクターのセットをAbstractFactoryという。 また、単一のコンストラクターを仮想化したものをFactoryMethodという。 まぁ、呼び方なんかどうでもいいし、どれか1つに合わせて ガッチリ作らなきゃならんわけでもない。
836 :
835 :2012/01/19(木) 00:44:41.91
FactoryMethodについていい加減な事書いてたんで、一応補足。 FactoryMethodは、クラスAがあったとき、クラスAの内部や、Aの関係各所でつかう 他のクラスのコンストラクターをAに直接使わせないようにする方法。 やり方は、他のクラスのコンストラクターの代わりに、Aに他のクラスを 戻り値とする仮想関数を定義する。で、Aの子クラスBで仮想関数に具体的な コンストラクターを実装してやるってパターンね。
FactoryはGoFのと、EffectiveJavaに書いてあるのがあってややこしい
http://digital.asahi.com/articles/TKY201201160436.html 【簡単なまとめ】
★日本人の知らないうちに、欧州を中心に、世界中で日本文化ブームが起きて凄いことになっていた
(実質第2次ジャポニズムブーム)
↓
★現地にいる人間からの情報で、日本人がやっと気づいた
↓
★日本文化の紹介を何もしてこなかった政府が批判され国会議員が動いた
↓
★政府やNHKが「クールジャパン」という言葉を作り、やっと広報活動を始めた
↓
★しかしすでに欧米では、ブームを通り越して生活の一部として定着してたw すでに日常風景ww 広報の意味なし
↓
★韓国が日本のようにチヤホヤされたくて捏造韓流ブームを煽ったが、全く人気が出ず、世界的にバレたアイゴー<;#`Д´>
↓
★韓国が頭に来て、全世界での日本文化ブームもウソということにするニダ゚
↓
★在日朝鮮人の村上隆くん頼むニダ
↓
★村上隆 「日本文化ブームはウソ」というと、さすがにバレるので、「クールジャパンはウソ」でごまかして発信
↓
★確かに 、「クール・ジャパン」という人は外国ではほとんどいないのは事実だが
「ジャパン イズ クール」とか「ジャパニーズ○○ イズ クール」という人は普通にいる
あとはwonderful amazing ,,,とかね。まぁどの言葉も似たような意味だから
「クール・ジャパン」と思っている人が多いのは間違いではない
↓
★村上隆が巧妙なのは、「クール・ジャパン」という言い方はしていないということを
「日本文化が実は人気がない」という風に思わせるように発言していること
↓
★村上隆の印象操作工作発言にダマされたバカが続出中 ←今ココ ( ´ω`)
日本がクールとか白痴だろ 東電や政府、オリンパスを始めとした糞企業のせいで日本のイメージは今や韓国と並んでワースト2だよ
ネトウヨが言う日本=とっくに消滅した大日本帝國
大日本帝国も日露戦争くらいまでは良かったけど、その後はなあ。
東電や政府が糞なのは同意していいが ここはオブジェクト設計スレだからなあ。 リスコフの置換原則の観点で意見を述べるなら 韓国と同一視できるか否かが鍵だな。答えはもちろんNOだ
オブジェクト指向の正しさに確信がもてないんで教えてほしい。 実際にコードを書いて、便利さを説明してるサイトや本ってないかな。 オブジェクト指向だとこういう実装になるけど、従来の手続き型で書くとこうなる、みたいな。
845 :
99 :2012/01/30(月) 01:43:26.89
>>844 もうそれは結城本とかで自力でいろいろ試してみるとか。
オブジェクト指向の原則とかデザインパターンでインターフェースを利用した拡張性や保守性を上げるテクニックはいくつもあるけど、オブジェクト指向プログラミング最初の一歩はカプセル化のデータ隠蔽ができているドメインモデル貧血症になっていないコードだと思う
詳細の隠蔽と拡張のしやすさだな でも拡張のしやすさについては間違った方法でやるとスパゲティ量産になるから単純に利点と言い切れないかな
いまや実装の継承は暗黒面と考えてもよいとおもってる(笑 まあ節度ある使い方してればそれほどでもないけどさ。
インターフェースを階層化して、実装はほぼ集約だけだな
全部委譲って現実的にどうなんだろう 極端な例だけどJFrameとかは委譲しないよね(これは型の問題もあるけど ただ単に委譲するメソッドの割合が多いと実装継承使いたくなる 差分が1つのメソッドとか
おれは継承を包含に変換するプリプロセスプログラム作ったわ。 ネームスペースで問題(同じ名前で同じ型の同じ数の引数のあるメソッドとか)は、 コンパイル時にエラーとしてわざと検出してもらえるようにしてある。 問題のある箇所は自力で解決している。
852 :
デフォルトの名無しさん :2012/01/30(月) 21:29:31.68
>>850 JFrameを継承しなきゃならん時なんてまずないだろ。
コンポーネントがコンポーネントを直に持つクラスってよく見るが、
アレは無駄だ。
コンポーネントの外でデコレートしてやりゃ十分。
>>852 ここらへんは粒度とかコード量に依存してる気がする
外からデコレートで煩雑になると考えたら、
そのコンポーネントで囲っちゃうな
>>852 継承委譲の話からはそれちゃうけど、JFrameを継承した独自のクラスを作るのは無駄ってことか
確かにそうかも
JFrameを継承しているクラスに専用のメソッド用意したら、それこそ変な実装継承になっちゃうか
Swingの優れたオープンソースのコードって何かある? MVCでModelとViewの関係をObserverパターンで関連付けるというメリットも書き方もわかるけど、現実的にどう適用してるのかを見てみたい EclipseはSWTだし、大きくてどこ読めばいいかさっぱりだった
856 :
デフォルトの名無しさん :2012/01/31(火) 08:17:09.90
>>855 swingでまともなMVCは難しいよ。
VCなスタイルになる。何故かコントローラーの
Actionがモデルが持つべき機能を持ってるしね。
本でそういうことしてるパターンを見たことないんだけど、Observerパターンで通知関数を目的別に増やすことって普通? 連想型のコンテナをラップしたサブジェクトクラスを監視してるオブザーバークラスがあってそのオブザーバーはサブジェクトの更新時にコンテナの増分を知りたいという状況なんだけど コンテナのコピーをとって毎回差分を計算してたら遅すぎるから増分を直接通知する通知関数をつくろうかと思ったんだけど オブザーバーパターンの本来の利点の一つであるサブジェクトの設計がオブザーバーの設計に影響されないっていうのに反してる気がして悩んでる 言い直すと、オブザーバーがどんな情報を要求しているかサブジェクトが知らなければならない、というのが良くないんじゃないかなと感じるんだけど、どう思う?
>>856 ActionListenerを実装した専用のクラスを作ってそれをviewにaddActionListenerさせればVとC別れるってことにはならないのかな
Viewが持っているControllerのactionが持つべき機能って何?
>>857 現実的にはこういうときMVCに限界を感じる
だからMVCがダメという訳ではなく状況に応じてMVCから脱線することも必要だと思う
通知関数を増やさない方法としては、Modelがupdateするときにどの情報が更新されたかを知らせるプラグを渡すという方法もあるけど、フラグ管理は格好悪い
この2つ以外に方法あるのかな
860 :
デフォルトの名無しさん :2012/01/31(火) 13:04:04.64
>>857 1つ増加する度に通知すればいいだけだと思うけどそれじゃだめなんけ。
あと、監視側は別に監視対象に依存してもいいでしょ。
イベント情報から監視対象を参照しなければいいだけ。
監視対象が監視側に依存するのは論外だけど。
861 :
デフォルトの名無しさん :2012/01/31(火) 13:05:45.06
>>858 ごめん。VCって書いたのはMが消えるって意味。
VとCが癒着するって事じゃないよ。
>>860 「ひとつ増加するたびにその差分を通知してほしい」という欲求はオブザーバー側から来るものでしょ
これに応えるてしまうとサブジェクトのオブザーバーへの依存が切り捨てられないことになる
しかし依存は切れなくなるがパフォーマンスは改善する
というジレンマの話をしているの
>>861 Mが消えるということはないような
どういう状況を言ってる?
Mの処理をCに書いちゃうということかな
864 :
デフォルトの名無しさん :2012/01/31(火) 21:58:35.69
>>863 CがMを兼ねるってとこかな。
クラス的に同一というだけだから、
Actionクラスの子をモデルの生贄にして、
他のリスナーからActionを弄るという方法で
オブジェクト的に分離できるっちゃ出来るけど。
>>863 >>861 は、MのロジックがCに集められて、Mがドメインモデル貧血症をおこし、ただのCのValue objectになっていると言いたいのかなと思った。
>>857 Subjectからは、変更があった事だけを通知してもらい、observerから、値をpullするってのは?
subjectにそんなプロパティをもたせると、依存関係ができてしまうのて、別途専用のインターフェースを用意し、それを介するようにする。
このインターフェースの実体 = subjectとするか、subjectを参照する何かにするかは自由。
ここまで書いて、差分の通知の事忘れてた。 コピーを取るという事は、subject自体どれが変更されたか認識していなくて、変更前後を確認する必要があるということ?
Observer側で今までの持ってて変更内容Subjectから貰えればどうとでもなるんじゃないの? よーわからん。
>>864 その分離がMVCかと思ってたんだけどSwing(Java?)以外ではどうやってOとCの分離を実現するの?
>>865 それかと思ったけど、ドメインモデル貧血症はSwingに依存する話ではないから、また別の何かあるのかと思った
それとも他のに比べてSwingはドメインモデル貧血症を起こしやすい仕組みなのかな
>>869 >OとCの分離を実現するの?
MとCのタイポ?
と仮定して、
分離せずModel-Viewになる。古くは、MicrosoftのMFCとか
ロジックをちゃんとMに置けば、この形式でも問題ないと思う。
ただ、表示のためにMのデータを整形する際、処理がVに入り込んでしまう。
Vの処理はイベントデリゲートを受けて、Mに丸投げしたいので、あまり嬉しくない。
妥当な妥協案は、変換(整形)用のみのクラスを間にはさむのがいいんじゃないかと考えてる。
例えば、Presentation ModelとかView Modelとかいわれるやつを組み込む。
ドメインモデル貧血症のなにがわるい? オブジェクト指向じゃないってことか? オブジェクト指向ってのはあくまで手段 手段が目的になってないか?
>>871 たいぽです
最初の話に戻るけどMFCとかは分離せずにMとVがくっつくというのはわかるけど、それならむしろSwingの方がMVCを実現しやすいような
分離するのがMVCなのかと思ってる
>>872 setter,getter作ってそれで操作されたらフィールドの値好きに書き換えられちゃうのが嫌だ
自分の作ったクラスは一定のルールの元使って欲しい
そうじゃないとバグがあったとき、どのような操作でバグが引き起こされたのか把握しづらい
データ隠蔽は必要
クラスに使われ方を想定し、ましてやそれを使う側に強いるなど…。 インタフェースだけで完結している単位が使いやすい。
>>869 QtやActionScriptなら、適当に作ったモデルをViewに
紐付けできる仕組みがある。
Swingには同じ一貫した仕組みは無い。
document modelとかあるけど一部のviewにしか使えない。
>>875 データ隠蔽とインターフェースは反する関係じゃないでしょ
データ隠蔽しない、更にクラスの使い方を強制しないってことは、Listインターフェースを継承したクラスでは配列へのアクセッサー用意してもらって、addメソッドやremoveメソッド無くせば満足なの?
>>876 バインディングというやつかな
VからMの依存関係は別のファイルに書くんだっけ
あとわからないことがあるんだけどMVCで新しいViewを表示したい場合はCがnewしていいの?
CはM以外に依存してはいけないという理解なんだけど他に適当なところが見当たらない
まあクラスにステートが存在する以上、イレギュラーな事態は起こりうるよね。 A→B→Cの順でメソッド呼んでね?的なのを防ぐには、状態別にオブジェクトを作るとかしないと無理ぽ。
>>878 バインドは一つのコード内にかけるよ。
QtならQObject::connectつてな関数で紐付するだけ。
>>878 viewとmodelでやるのは、本来の目的を
考えりゃあり得ないからね。
ちなみに本来の目的ってのは、ビジネスロジックの
隔離とかじゃないよ。
>>881 関連付けをVやMでやるのはおかしいということですか?
現在はVやMを作るメインメソッド的なところで関連付けてます
ただこれだと新しく途中でViewをnewするときに困る
あらかじめ表示されるViewをすべてnewしておいて表示したいときに表示命令を出すようにすれば解決するけど、メモリが激しく無駄…
883 :
882 :2012/02/01(水) 20:13:02.03
>>881 のレスは後半のnewの話だったかな
CからPMとかVMとか呼ばれる物に指示するのが正しい気がしてきた
PMはCからViewを表示しろという指示を受ける PMはそれをViewに通知
>>882 MVCを集約管理するクラスへの弱参照をVやCが持ってそれに新しいV作ったから適切にBindしてちょって頼めばいいんじゃね?
MVCを厳密に守る必要なんて必ずしもないんだし 頭固すぎだろ
>>878 CがVに依存して困る理由もないじゃん。
Vの実装に対する依存がいやなら、
CはVを抽象化して操作すりゃいい。
>>884 それだけでそう分けるべきかわかってたら
MVCとかMVVMとかMPVとか乱立しねーよ(´・ω・`)
MとVVMとかVCは分離されてしかるべきだけどV-VM、V-Cは依存しててもそんな問題ないよね
>>872 悪くないよ。もはやMVCと呼べるものではないだけ。
>>882 ロジックが読みづらくなるかもだけど、遅延生成にしてみるとか?
Viewを直接インスタンス化するのではなくて、ViewのFactoryをインスタンス化して、初めて必要になった時にViewを作らせる。
>>882 メモリもそうだけど動的にVIewの個数が変わるときも困るから
最初に全部用意ってのは選択肢としてないでしょ
Viewをキャッシュするという方法もある。 Androidの画面遷移みたいに、最新のn個を残しておいて、残りは適宜削除。 また必要になったら再生成。
>>892 個数が変わる時は、なんらかの対策が必要だけど、依存性を最初に解決できるメリットはあると思うよ。
>>890 は、少し言葉足らずだったかな?
Mがドメインモデル貧血症になると、それはただのValue objectとなり、CがMの役割となり、結果Model-View になるだけかなと、思ってる。
View生成用のクラスを別途作るという意見が多そうですね そのViewに関連して必要になるControllerも一緒に作る この生成クラスにViewが監視すべきModelを渡す方法は少し考える必要がある というのは1つの方法かな このView生成クラスに、依存性の情報を管理させると考えると責務としてもしっくりくる このViewとModelの依存関係というのは、アプリの1度の実行に依存するものだから、わざわざViewごとに生成クラスを分ける必要もない ControllerがこのView生成クラスに直接依存するのが嫌だったら、何かインターフェースを用意してそれに依存すればいいのかな インターフェースにはViewの生成機会単位のメソッドを用意
>>896 そもそもviewをどの単位で言っているのか謎。
サムネイルリストのサムネイル一個一個をモデルに基づき
生成するのはViewの役目だし、サムネイルリスト画面を
生成するのはControlerの役割じゃん。
どっちよ。
>>898 後者
気にしてなかったけど、前者は何も考えずViewでやってた
厳密にやるなら、サムネイル1個1個もControllerで作って、サムネイルリストの画面に引数で渡して上げたりした方がいいのかな
そうなるとボタンは・・・とか切りないな
>>899 Model更新に基づく部分にControlerが介入しちゃいかんよ。
せいぜいサムネイルを生成するFactoryの交換ぐらい。
MVVMってControllerに当たる処理の再利用出来ないけど、何がいいの? IDEの支援は置いといてロジックとして何がMVCよりいいの?
>>897 以前使った方法は、画面の状態遷移を管理するためのクラスを用意し、全てのControllerに持たせる(1ウインドウで中のページを切り替えてたので、Singletonだったかも)。
次の画面に関する識別子をこいつに渡して、次画面を取り出すようにしてた。
併せてナビゲーション管理も行わせて、前画面に戻るための仕掛けを用意してた(むしろこの機能がメイン)
MVPパターンにならってViewがインターフェースを通して抽象化されてたら 大抵の画面はコントローラーが頑張り過ぎる実装で十分だと思うぞ。 きちんとしたMVCは実装コストが高くつくし再利用できて画面にガシガシ 更新が反映されるモデルが見つかったなって思ったタイミングではじめて 実装をはじめればOK。
>>902 こんな感じか?
//viewのシーケンス管理
Context context = new Context();
okeyButtonA.addActionListener(new NextControl(context, 1));
okeyButtonB.addActionListener(new NextControl(context, 2));
okeyButtonC.addActionListener(new NextControl(context, 3));
>>903 基本的なモデルは1度作ったら延々と再利用出来るじゃん。
複雑なモデルはともかく、ただのテキストとか、
整数はMVCガンガン使った方が楽でしょ。
>>901 MVVMはWPF(Windows Presentation Framework)を適用する際に、対象を分離することによるテスタビリティを良くするためものと思ってます。
再利用はあまり意識してなさそう。
MはUIと完全に切り離されてるので、xUnitで自動化しやすくなる。
Vは表示のみに特化されてるので、値が正しくバインドされるかどうかをテストするだけでよくなる(VMをMockにすれば自動化も容易?)
テストしづらい厄介なところをVMに集めてる。
ただVMはMVCのCの側面+PMの側面をもっているので、
C側面についてはハンドルしてるイベント処理から適切にMのメソッドが呼ばれるかどうかの確認。
PM側面は仕様どおりデータを整形してるかどうか確認。
共にMをモックにすれば、自動化できるかな?
>>905 むしろ、モデルは一度作ったら変更しにくいから
しっかりと作らないといけないだけだろ
それでも、後で変更したくなる
>>906 回答ありがと。
MVVMはQtやSmalltalkのようにIDE上でドラッグアンドドロップだけで、
M/V/Cに当たるものを繋ぎ合わせられたりする?
>>904 もう少し泥臭く、Controllerにcontextだけ渡しておき、Controllerでイベントをハンドリングする処理の中で必要に応じてcontextに問い合わせ。
状態管理をもつService Locatorみたいなところかな
>>907 stringモデルとか、intモデルとか、
代入と、読み出し、
リスナー登録ぐらいしか必要無いしそんな拘る所も無くね?
911 :
910 :2012/02/02(木) 00:11:04.43
そういやmodelがviewに見せるのは、 読み出しインターフェイスだけ。 だからなおさらモデル設計が緩くてもそんなにこまんないよ。
オブジェクト指向とは的なことはマニアに任せて 現実ではオブジェクトは二種類にわかれると思う。 一つは処理がメインの構造オブジェクト もう一つは値として使う値オブジェクト フレームワーク部分は構造だろう。こいつは 他から値をもらうけど、中で長期間保持したりしない。 いわばシングルトンオブジェクトでいいもの。 それに対して日付オブジェクトとかは、数値型と同じく値が主。 処理も持っているけど、基本は値。値の拡張版 データとして保存しシリアライズするかもしれないようなもの。
>>910 部品単位と画面単位の話を分けて考えたほうがいいんじゃないのか。
単一の整数や文字列のモデルって単純な部品単位のモデルであって
画面単位の話じゃないよね。
>>901 Controlerってそんなに再利用できる?
というか再利用してもそんなに幸せにならない気がする。
>>908 IDE(Visual Studio)単体にはなかった気が
VにVMのプロパティを指定するところは、Expression Blendという、V構築ツールを使えば可能
IDEと統合されてたかどうかは不明。
VMの自動生成もなし。各々のフレームワーク作者が、用意しているっぽい
Mとのリンクもあったかな?
Visual Studioの世界では、まだまだ発展途上な感じ。
>>913 画面単位は、部品のモデル差し直すぐらいしか
やる事ないから、あんまり重要視してないけど何かある?
個人的にはMVCは部品単位が一番効果を発揮すると思ってるけど。
3Dモデルを角度毎複数のviewに表示したり、
プログレスバーとラベルに同じ進捗表示したりさ。
Controllerの再利用のユースケースとしては、最初はこのボタンのControllerだったけど、他のボタンに変えよう、という状況? このときこのControllerがMとVに依存しているのは問題なさそう ボタンが変わったとしても依存しているViewとModelの操作をするという責務は変わってない
MVVMのVMは、MVCではどこが処理すればいいか定義されていないViewの見た目を変更するロジックとMVCのControllerの役割を担うのか n番目のView ModelからのViewへの変更通知に毎回VM(n)が挟まれる ViewからのクリックはVM (n+1) が受け取りModelを操作するということかな これって基本的にはMVPと同じ?
>>918 戻ると進むとか、保存とか、ウィンドウを
全て閉じたら終了とか一般的なものは
大概再利用可能じゃないか
>>920 その辺はそういった処理するのを関数とか小さいクラスのレベルで再利用するけれど、コントローラーはそれらを集約して使うだけでコントローラー自体の再利用とはちとちがくね?
Controllerで集約とかあんまりしなくないか? 戻る、進むControllerなんて、コンストラクタで捕縛した、 Modelの戻るメソッド呼ぶだけだし。 戻るメソッドに合わせて多少のイベント変換はするけど 大した事はしないよ。
MVCのパッケージ分けがわからん どの単位で分ければいいの? Modelは完全に独立して普通にパッケージを分ける ControllerAクラスがViewAクラスを新たに表示するために依存しているとする その1 a.controllerにControllerAクラス a.ViewにViewAクラス Bクラスも同様 その2 controller.aにControllerAクラス view.aにViewAクラス Bクラスも同様 その3 AクラスもBクラスもまとめて controllerパッケージとviewパッケージに突っ込む その4 ControllerクラスもViewクラスもまとめてaパッケージとbパッケージに突っ込む
何のためにパッケージ分けすんの? そこが問題じゃね?
>>924 そもそも俺がそれを理解できてない
パッケージ設計の原則 - Strategic Choice
http://d.hatena.ne.jp/asakichy/20090130/1233317812 この原則見るとリリース単位と言われるけど、個人開発の場合リリースすることないしな
単純なグループ分けもしくは、パッケージプライベートを利用して公開するインターフェースを切るためとか?
パッケージプライベートを意識するなら
>>923 のその1が正しい気がする
Viewとかは全部パッケージプライベートにしておく
Viewに対するaddActionListenerメソッドだけはpublic
そしてこのaddActionListenerを利用して他のパッケージのControllerを登録する
パッケージつうか名前空間ってのは 衝突回避のためだけに 長い名前を書かなくて済むようにするためのもんだからね。 名前が重複せず関連性の強いもんに分けるだけでいいでしょ。 Socketならudpパッケージとtcpパッケージにそれぞれ作るとか。
>>923 モジュール単位で分けるのが好きなので、その4、をよく採用するかな?
Text::Model; Text::View; Number::Model; Number::View; 一般的な名称を下位に置き、固有に近い名称を 上位に置く分け方が重複しづらく短縮もしやすくて合理的。 ただ名前空間の別名付けられないJavaだと使いづらい。
・一つのオブジェクトをいくつかのコンテナ(管理クラス)に異なるインターフェースで登録する ・コンテナを一箇所にまとめて共有し、能力照会でインターフェースを取得する どっちがいいとおもう? どっちでやってもごちゃごちゃするんだけど
よくわからない
既に分かりにくい。
外国の方がエキサイト翻訳を通して質問しているのだ 英語で答えて差し上げなさい
エキサイト翻訳って海外にもあるんだね はじめて知った
RPGのキャラを管理するのに、 1. スキルごとにコンテナを用意。魔法戦士なんかは魔法使いコンテナと戦士コンテナの両方に登録。 2. コンテナはひとつだけ用意。スキルを指定してキャラ集合を取得するインタフェースを用意。 のどっちがいいか? ってことじゃないか。
>>929 Service Locator作りたいってことかえ?
後者が良くわからんが、一つのコンテナに全部詰め込むって意味なら、型安全な前者を選ぶ。
そうではなく、前者のコンテナにを束ねたファサードなら、依存性を一箇所で管理できるので、後者の方がいいんじゃないの?
>>929 もう少し具体的な状況を説明してくれないとわからない
前者が良い場合も後者が良い場合もあると思う