-OOP限定-プログラム設計相談室
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/24(土) 16:35:590210デフォルトの名無しさん
2007/01/31(水) 00:25:57スレ違いな気もするが
DBと流すQUERYにもよると思うが、そんなに変わらないと思うけどね
0211203
2007/01/31(水) 08:51:59>>206
>>208
レスありがとうございます。
ちょっとすれ違いな話になってきちゃいましたが
例えば商品Xを扱っている店とその店が扱っている全ての商品、
店1(商品X・商品Y)
店3(商品X)
店6(商品X・商品S・商品Y・商品Z)
↑こういうの取り出したい時って一回のSQLでいけるんでしょうか?
だとしたらSQLの勉強不足と言うことで、悩みは一気に解消なのですが。
DB版行った方がよさげですか?
0212デフォルトの名無しさん
2007/01/31(水) 10:25:47副問い合わせやGROUP_CONCAT()を使えばできますが
ここよりはSQL関連の質問スレへほうがいいかも
0213211
2007/01/31(水) 12:36:44ありがとうございます
GROUP_CONCAT()というのは知りませんでした。
というか、使ってるのがpostgreSQLなんですけど、
ちょっと調べてみたらpostgreにはないっぽいですね。
自作関数を実装しなきゃならないようです。
どっちにしてもすれ違いなので、SQLの方に行ってみます。
皆さんお世話になりました。
0214デフォルトの名無しさん
2007/01/31(水) 23:56:42>自作関数を実装しなきゃならないようです。
せっかく >>212 が指摘してくれた
「副問い合わせ」の件は無視かよ・・・
ま、ご自由に(w
0215デフォルトの名無しさん
2007/02/01(木) 00:14:33おもしろいよね
おれもそんなじきがあったのかなぁ
0216デフォルトの名無しさん
2007/02/02(金) 15:36:07世の中の要素技術全てについて初心者を脱却した人なぞおらん。
ということはもう新たな要素技術を知る必要のない立場/ポジションにいるわけだ。
0217デフォルトの名無しさん
2007/03/07(水) 09:06:47うぬぼれすぎじゃねw
0218デフォルトの名無しさん
2007/03/09(金) 00:06:580219デフォルトの名無しさん
2007/03/10(土) 02:32:490220デフォルトの名無しさん
2007/03/10(土) 07:43:59observerがイベントを監視し、subjectに対しイベントに変更があったこと通知、
そして、subjectが他のobserverに通知。
なんて教えられたんだけど
このぐらいの変更なら許容範囲?
0221デフォルトの名無しさん
2007/03/10(土) 10:48:54observerがsubjectへ変更を加える事があっても、subjectに
何かを通知する事はない
もっともobserverが別のobserverのsubjectなら話は別だが
0222デフォルトの名無しさん
2007/03/28(水) 01:38:170223デフォルトの名無しさん
2007/05/13(日) 22:19:14Observerパターン使ってViewがイベントを受け取ったらControllerに渡して、ControllerからServiceを用いてデータ操作→Modelに加工して保存→通知してViewのリペイントって感じですか?
単純なSwingアプリでModelとかServiceってどういう役割になるのか分かりません。Modelの役割ってどういうものなのか、実例を見てみたいのですが。。。経験が全く無いので困ってます。どなたか設計の勉強になる本とか教えて下さい。。。
0224デフォルトの名無しさん
2007/05/13(日) 23:58:46最近は明らかに自作の方が安いよね。とC2Dマシンを組終えてMemtest中の俺が流れを無視して言ってみる。
E6600、メモリ1GBx4、HDD320GBx4、GF7900GS、電源550W、ケースだけ古いSongcheerを使い回し。
最近アキバはキモいのでツクモで一括通販。
この組み合わせで16万ちょいなんてDELLじゃ絶対ムリ。
ま、確かに超ローエンドだとキーボードとか他のパーツが占める割合が増えるから結果として安いけどね。
特にハイスペックでなくとも容量なんかが欲しければ自作の方が安い。
嫁もIntelMacになってMacに見切り付けたみたいだから次は安く上がるなw
元がMac G5だからお下がりのP4 3Ghzでも速く感じるだろうwww
0225デフォルトの名無しさん
2007/05/14(月) 00:01:110226デフォルトの名無しさん
2007/05/14(月) 00:08:330227デフォルトの名無しさん
2007/05/15(火) 16:01:490228デフォルトの名無しさん
2007/05/18(金) 12:24:330229デフォルトの名無しさん
2007/05/21(月) 02:41:100230デフォルトの名無しさん
2007/06/15(金) 08:33:51なかなかいいアイデアがまとまりません。どこか良いサイトや何かよいアイデアありましたらお願いします。
ちなみに今考えているのは、
CState 状態S。次の遷移先を教える。CEpsilonとCDeltaの派生CDeltaMultiple、CDeltaRangeを複数保持。
CEpsilon イプシロン遷移。複数の遷移先(CState*)を保持する。
CDeltaMultiple 複数の遷移条件で一つの遷移先(CState*)を保持する。
CDeltaRange ある範囲の遷移条件で一つの遷移先(CState*)を保持する。
CStateChart 複数のCState*を保持管理する。最初の状態S0を教える。
CAutomaton 一つのCState*を保持する。
CAutomata 複数のCAutomatonを管理する。CStateChart*を持ち、入力(シグマ)に応じて適切な状態を持つCAutomatonを生成する。
このような感じになっています。
しかし、これだと入力(シグマ)の型によってテンプレートにしてソースを晒したりしなければいけません。
よろしくお願いします。
0231デフォルトの名無しさん
2007/06/16(土) 00:05:110232デフォルトの名無しさん
2007/07/04(水) 07:05:40管理されるクライアントクラスはnewで動的に生成されるという物です。
また、マルチスレッド環境での使用も考えています。
class client{
client_management *cmgmt_;
public:
client( client_management *cmgmt ):cmgmt_( cmgmt ){
cmgmt_->add( this ); // 排他処理はcmgmt内で
}
void haandle(){
//クライアントとの通信とか、いくつかの処理
//処理終了で、クライアントと切断後、
cmgmt_->remove( this );
delete this;
}
};
これをserver側で
class server{
client_management cmgmt_;
void listen(){
socket sock = accept();//clientクラスのオブジェクトを返す
new client( &cmgmt_ );
}
};
こんな設計しか思い浮かばなかったのですが、特に
new client( &cmgmt_ )の部分とかdelete thisな部分が嫌な感じがします。
よりベストな設計を伺いたいです。よろしくお願いします。
0233デフォルトの名無しさん
2007/07/04(水) 23:17:11とりあえず設計に関して。
clientがclient_managementを参照するのは良くない。
(少なくとも非constのポインタを持つのは良くない)
clientがclient_managementを知っている必要を感じない。
clientのインスタンスをclient_managementに追加するのは、
今回の例ではserverクラスで行うのが妥当か。
例えば、
client* ptr = new client;
cmgmt_.add(ptr);
clientの削除を行うのも、client_managementに行わせる。
そうじゃなければ何のためにaddしたのかわからん。
複数のclientの管理を統括するためでしょ?
delete this;は色んな意味でありえない。というか最悪。
大体、ptr->haandle();の後、ptrが使えなくなるとは絶対誰も考えないから。
その他
socket sock = accept();//clientクラスのオブジェクトを返す → socketが返っているようにみえる
new client(&cmgmt_); →思いっきりメモリリーク
haandle()メソッドが長い。複数のメソッドに分割すること。
haandle()というメソッド名を見ても何をするメソッドかわからない。
命名が気に入らない
→cmgmtを見て、client_managementだとわかったらエスパー。
→メソッド名、クラス名、一時オブジェクト名の区別がつかない。
0234デフォルトの名無しさん
2007/07/05(木) 15:58:39ありがとうございます。
0235デフォルトの名無しさん
2007/07/09(月) 23:47:140236デフォルトの名無しさん
2007/10/30(火) 21:18:52よくいうビジネスロジックってどういうものを言うのでしょうか。
staticで提供されているユーティリティメソッドなどはビジネスロジックではないのなら、
どういう観点で見てどういうくくりでこの処理を行うビジネスロジッククラスと設計すればいいのでしょうか。
なんとなくはわかっているんですが、なんかしっくりこないんです。
また、ビジネスロジッククラスに作成するメソッドをどのビジネスロジッククラスにコーディングするかは
どのように決めればいいでしょうか。ユーザーに関連する処理だからこのクラスとか、分け方が理解できません。
0237デフォルトの名無しさん
2007/10/31(水) 04:02:07まずここ嫁
http://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF
全くの初心者の場合、自分で設計しようとしないで
既存のフレームワークやアーキテクチャの流儀に従うと良い
0238デフォルトの名無しさん
2007/10/31(水) 21:25:45レスありがとうございます。
読んでみると意味はわかるのです。ですが、それを実際にかたちにすることができません。
こんなレベルでも実際に仕事をしています。私の会社ではこれらを全て同じクラス内にコーディングするのです。
実際に要件から設計、コーディング、クラス設計を学ぶことができる書籍などはないでしょうか。
書籍を読んでも疎結合だとかビジネスロジックは分離だとか、いろいろ書いてあるのですが
自分の仕事でうまくやることができないのです。
0239デフォルトの名無しさん
2007/10/31(水) 21:48:49どうしても自分で設計したければ、
大き目の本屋に行ってオブジェクト指向
に関係ありそうな本を片端から買って読む。
多分100冊も無いと思う。
その上で、実戦を10回くらい経験すれば
なんとか人並に設計できるようになると思う。
0240デフォルトの名無しさん
2007/11/01(木) 21:38:01どういった方法が最善なのでしょうか。メソッドを細分化するのはいいのですが、引数にDBコネクションを必要とする場合が多くなってしまいます。
0241デフォルトの名無しさん
2007/11/02(金) 01:33:17それも使えないならスレッドローカル変数をつかって
トランザクションマネージャを自作
0242デフォルトの名無しさん
2007/11/08(木) 22:48:52業務フローからメソッドの定義を考えるのはおかしいでしょうか。
インターフェースを人に書いてもらえば実装はいくらでもできるのですが、
いまいちこのレベルまで落とし込む方法がわからずこまっております。
0243デフォルトの名無しさん
2007/11/09(金) 00:37:07PofEAAとかttp://d.hatena.ne.jp/higayasuo/20050818
読んで自分でいろいろ工夫したらいいよ
0244デフォルトの名無しさん
2007/11/10(土) 20:04:09ありがとうございます。書籍を購入して勉強はします、が、、、
ほかにもいろいろ調べたりしなければならないので時間がとれなそうです。
ひがさんのblogは書いてあることの意味はなんとなくわかるのですが、
実践にもっていくには私には少し?難しいようです。
0245デフォルトの名無しさん
2007/11/12(月) 22:36:59この場合、View用の抽象クラスを用意してそれをパターンごとにsetterを用意しようと考えています。
もっとよいアイデアがあれば教えてください。
0246デフォルトの名無しさん
2007/11/13(火) 00:38:460247デフォルトの名無しさん
2007/11/13(火) 00:47:02>>245
同じデータを複数のフォーマットで返せるサービスなのか、
システムで使われるレスポンスデータが複数あるのかどっち?
後者なら設計のコンセプトを知りたい。
0248デフォルトの名無しさん
2007/11/13(火) 01:40:340249デフォルトの名無しさん
2007/11/15(木) 23:16:14特定の引数を持つコンストラクタをリフレクションで探すのってダメかな?
ようはBuilderだけで完結させて、BuilderFactoryは作らない方法。
0250デフォルトの名無しさん
2007/11/16(金) 00:08:41>ドメインロジックを()で囲っているのは、ドメインロジックを
>ドメインモデルに持たせた場合、ドメインロジックは、ビジネスロジック
この文のカタカナ率を計算せよ。
チラット見ただけでどんな人なのか全然知らないけど、
日本語をマトモに話せない(話そうとしない)ヤツは、
ろくでもないことが多い。
0251デフォルトの名無しさん
2007/11/16(金) 16:53:20C++で書かれていて、デザインパターンを用いたお手本になるライブラリィソースって
ないっすか?
0252デフォルトの名無しさん
2007/11/16(金) 19:01:290253デフォルトの名無しさん
2007/11/20(火) 18:04:51そいつの人間性はさておき、全然知らないってのは業界人としてどうなのよ・・・
0254デフォルトの名無しさん
2007/12/30(日) 13:03:50OOPの設計でとっても悩んでいます。
例えば、
壁にボールを当てる事を考えます。
壁クラス
ボールクラス
投げる人クラスが
あるとします。
壁にボールが当たって跳ね返ってくるのは
どのクラスで実装しますか?
Mediatorクラスを作るべきですか?
あと、
メソッドのaugumentには
他の独自のクラスをとってよいのでしょうか?
メソッドのaugumentには、
operandはおkで、optionはNO
だというのがHeuristicだそうですが、
という事は、他のクラス
例えばこういう書き方をするか知りませんが
method(MyClass object)
のようなメソッドを実装してもいいのですか?
あまりにも汎用性が失われるような気がします。
0255デフォルトの名無しさん
2007/12/30(日) 15:16:33投げるという動詞が存在する以上、ThrowerとThrowableの関係はあっていい。
また、壁、玉、人らは、それぞれに衝突可能なObject(俗に言うMob)とする。
よって、おいらなら以下を土台とする。
GameField field = GameField.getInstance(); // ゲームマスター
field.add(new ConcreteWall(0,0,0,768);
field.add(new ConcreteWall(0,0,1024,0);
field.add(new ConcreteWall(1024,0,1024,768));
Thrower thrower = new ConcreteThrower();
thrower.set(new ConcreteBall());
field.startGame(thrower); // ゲームループの開始
また、以下の依存性も必要と思われる
Throwable extends Mob
Mob.collision(Mob) // ベクトルの変更のみ
この例だとGameFiledが進行を務めるから、Mediatorとは逆。
collisionの網羅前にMobにMediatorを渡すのはあり。
0256デフォルトの名無しさん
2008/03/08(土) 19:27:46設計者は開発者に対してpublicなAPIだけを
仕様として渡して、
開発者はそれをprivateなメソッドに
分解して最終的にpublicなメソッドのテストに通ればいいという事ですか?
0257デフォルトの名無しさん
2008/03/16(日) 23:55:02DATA( A or B or C or D)
このようなデータを汎用的に書き出したいのですが
どのように設計すればいいでしょうか。
[A,B,D]の場合もあるし[C,D]の場合もあるし
かといってちまちまケース文で書き出すのは愚の骨頂だし
解らない。
0258デフォルトの名無しさん
2008/03/17(月) 02:08:14単純にビットフィールドってことでおk?
0259デフォルトの名無しさん
2008/03/17(月) 10:01:59A 〜 D を自由に組み合わせて出力したいという程度ならまず、A 〜 D に
共通な「書き出し可能データ」というインタフェースを定義する。そして
A 〜 D がこれを継承する。
次に「データを書き出す人」という抽象を作り、「書き出し可能データ」の
集合(配列、リストなど)を受け取って、ひたすら書き出すようにする。
「書き出し可能データ」の集合を生成するために、制御役の抽象が必要に
なるかもしれない。
0260デフォルトの名無しさん
2008/03/17(月) 17:32:42いいんじゃね?
設計者の設計粒度がどの程度かわからんけど
仕様としては外部からみた振る舞いが正しければいいわけだし
0261デフォルトの名無しさん
2008/03/25(火) 16:07:35「クラスの変更理由を一つにしなさい」
という事は逆にいうと、
「もしクラスが変更される時はそのクラスの仕様をすべて変更しなさい。
もし変更されない仕様が混在するならばそれは変更理由が一つではない」
という意味ですか?
0262デフォルトの名無しさん
2008/03/25(火) 22:18:55違います。変更理由が一つであることとクラス仕様全てを変更することに
相関はありません。
SRP は「クラスは単一の概念を表現すべし」というルールです。単一の
概念を表現するために複数のデータとメソッドが定義されるのだから、
部分的な変更をかけていく行為自体は、何ら SRP に反しません。
例えば、ある抽象概念を表現してみたものの、あとから足りないものに
気付いてメソッドを追加する、というごくありふれたケースを考えてみても、
クラスの既存仕様を壊さずに部分的な変更をかけていることが実感できる
でしょう。
あるクラスが SRP に反しているかどうか判断するには、異なる概念が
混在していないかどうかを常識的にチェックすれば良いのです。もし
混在しているのなら、それは二つのクラスに分離するべきなのです。
ただ、SRP に違反しているクラスが一概に悪とは言えないことも意識して
おくことは大切です。何事も行きすぎた原理主義はよくない。
0263デフォルトの名無しさん
2008/03/25(火) 23:21:24あとから足りないものに
気付いてメソッドを追加する、というごくありふれたケース
といいますが、これはOCPが違反しませんか?
今、Head Firstのオブジェクト指向設計とかいう本を読んでいます。
そこにはSRPの例として、車のクラスを定義する場合に
そこにwashなどのメソッドを組み込んではいけないという事になっていますが、
例えば外部で
CarWasher#wash(AutoMobile)を定義した場合、
このCarWasherクラスはAutoMobileの例えばdirtというフィールドが存在している事を知っていないければなりません。
(例えばwashというメソッドがdirtを0にするものだとすると)
これは情報の隠蔽に失敗していませんか?
それに無闇にAutoMobile#setDirtを設定してこれを受け入れれば、
他でどんな悪用をされるか分かりません。
失敗した設計だと思います。
カプセル化についてどう考えていますか?
setterはなるべく実装しない方が良いように思うので、
データについてクラスを分離するのがいいと思うのですが、
この本には振る舞いについて分離せよと書いてあります。
0264デフォルトの名無しさん
2008/03/26(水) 01:09:50拡張と一口に言っても、類似概念の追加と、メソッドの追加では意味合いが
違います。OCP を守るためにメソッドの追加ではなく継承で対応するの
では本末転倒でしょう。原則は絶対ではないのだから、柔軟に対応すれば
いいと思いますよ。
その本は読んでいないので状況が良くわかりませんが、車クラスが wash
を提供するべきではない理由が書いてあるのではありませんか? 車の主要な
責務は「人を乗せて移動する」であるとかなんとか。
まあ、いずれにしてもいい例ではない気がしますが、クラスでは概念を
完全に表現することができない以上、どこかに軸足を置く必要がある
わけです。それが「洗う」なのか「走る」なのかは目的によって変わって
くるでしょう。
カプセル化は言うまでもなくとても重要ですね。
大切なのは、自分が表現したいものをはっきりさせることです。そうすれば
自然と必要なデータや振る舞いが備わっていきますよ。
0265デフォルトの名無しさん
2008/05/14(水) 12:54:34CarWasherクラスがAutoMobileクラスのdirtフィールドを知ってなければならない
のは当たり前。
そもそも、洗車機は車の存在を前提に作られるし、皿洗浄器は皿の存在を前提
に作れる。何を?どうする?の2つを知ってないと「する側」は作れない。
てか、洗車は例えとして分かり難いぞw
0266デフォルトの名無しさん
2008/05/14(水) 15:08:000267デフォルトの名無しさん
2008/05/22(木) 06:02:42設計(特にクラスの設計)に関するオススメの書籍何かないでしょうか?
例えばショッピングサイト、レンタルビデオショップなどわかりやすそうなものから考えていこうとしたものの
OOPへの理解が浅いせいかどうにも戸惑ってしまっています
よろしくお願いします
0268デフォルトの名無しさん
2008/05/22(木) 12:13:26デザインパターンとともに学ぶオブジェクト指向のこころ
0269デフォルトの名無しさん
2008/05/25(日) 20:58:00大抵このUndoってコマンドパターンとかで実装されますよね?
このとき、Modelに対する変更命令が全てコマンドで実行されることをコードレベルで保障するには、
Modelに対する変更命令を受け取ってコマンドを発行するクラスを作って、
更にModel内部のデータ構造に対するアクセスを制限するための
読み取り専用ラッパークラスを作って外に公開する、という感じになるのでしょうか?
実際このようなことって業務レベルの開発では行っていたりしますか?
0270デフォルトの名無しさん
2008/05/26(月) 00:23:07個人的に、リファクタリングの実践が一番身に付きやすいと思う。
フリーソフトとかのソース落としてきてやりまくるといい。
ということで
・リファクタリング
0271デフォルトの名無しさん
2008/06/19(木) 22:55:43温度調節機能付きの水質モニターを管理するプログラムを作りたいと思っています
1分毎に水質データと水温を取得する
PCから温度の管理値を変更できる
という機能を実現したいのですがこの場合
ポートの開閉やデータの送受信を管理するCommクラス
水質データの受信要求や管理値の変更命令をCommオブジェクトに送る、水質モニターの機能を実現するMonitorクラス
Monitorオブジェクトから値を受け取り実際に表示するGUIクラス
GUIがMonitorの参照を保持して
MonitorがCommの参照を保持する
このような構造でよいのでしょうか?
0272271
2008/06/20(金) 00:31:37Monitorクラスの定期測定と管理値の変更は別のクラスの振る舞いにしたほうが良いのでしょうか
0273デフォルトの名無しさん
2008/06/20(金) 20:41:49いいと思います。あとは、水質モニターのマルチベンダー化や多重化等が
確実なら、事前に拡張性を考慮するのもあり。
0274デフォルトの名無しさん
2008/06/20(金) 22:07:46ありがとうございます
あと、新型のモニターを使用する場合も考えると
拡張機能を実装しやすいようにデコレータにしておいた方がいいですかね
0275デフォルトの名無しさん
2008/06/21(土) 00:04:07数ヶ月以内に新型が導入されるならね。さもなくば、シンプルに徹する。
0276デフォルトの名無しさん
2008/06/21(土) 00:47:55二つの値を一つの文字列に合成してシリアル通信するのですが
この命令の合成と返答の翻訳はMonitorとCommクラスどちらに実装するべきでしょうか
質問続きで申し訳ありません
0277デフォルトの名無しさん
2008/06/21(土) 06:02:48"二つの値Constructor"に任せればいいんじゃない?
もしくはMul/Demultiplexerとか?
0278デフォルトの名無しさん
2008/06/21(土) 10:29:05Comm クラスは汎用的なシリアル通信だけを行うユーティリティクラスで
いいんじゃないかな。制御プロトコルの知識は Monitor に持たせる。
0279デフォルトの名無しさん
2008/06/21(土) 12:11:06おれだったら、合成と返答の翻訳を行うクラスを別途作るかな。
0280デフォルトの名無しさん
2008/08/05(火) 22:06:37>おれだったら、合成と返答の翻訳を行うクラスを別途作るかな。
メッセージI/FとパーサーI/F又はどれか一つ用意して
メッセージの詳細はベンダー毎に実装するのが一般的かと思う。
0281デフォルトの名無しさん
2008/08/08(金) 03:31:53ちょっとOO分析っぽいことやってみたかった.
# [実験]で[使用する][シリアルポート]から[遠隔操作できる]
# [温度][調節][機能]付きの[水質モニター]を[管理する]
# [1分毎]に[水質データ]と[水温]を[取得する]
# [PC]から[温度]の[管理値]を[変更できる]
必要な名詞(オブジェクト)
シリアルポート,温度,水質モニター,1分毎,水質データ,水温,温度,管理値
足りない名詞
タイマー
必要な動詞(メソッド)
操作,調節,管理,取得,変更
ここまでやったけど別に何を作ろうというわけではない
0282デフォルトの名無しさん
2008/08/10(日) 12:13:241分毎もかよー
水温・温度もかよー。
0283デフォルトの名無しさん
2008/08/10(日) 13:31:400284デフォルトの名無しさん
2008/08/20(水) 20:05:43例えば以下のような必要とされる要素が有ったとします。
(要素内容はでたらめです。)
・コード/名称/メッセージ/結果/色/高さ/幅
/追加日/更新日/削除日/…(全部で20要素ぐらい)
処理1 … コード/名称/メッセージ/結果
処理2 … コード/結果/色/高さ/幅
処理3 … 結果/色/更新日
処理4 … 削除日
各処理は、クラスに個別分類できる処理になり、各処理に少しずつ上記要素が
絡んでくる状態になります。
このような場合、どのようなクラス設計が適していますか?
現在は、コード/名称〜などの20要素ぐらいをBaseクラスにして、
処理1〜4までを継承させています。
ただ、こうすると必要の無い要素まで入ってしまい、もっとすっきり
させたいなと思っています。
0285デフォルトの名無しさん
2008/08/21(木) 02:24:17> ただ、こうすると必要の無い要素まで入ってしまい
この時点で継承を選ぶのがおかしい。意味のある単位に切り分けよう。
問題の切り分けじゃなくて、登場人物の切り分けを意識した方がいい。
例えば色/高さ/幅ってGUI上の属性情報なんじゃないの?
処理1と処理4でそれらの情報を使用しないってのなら、
ぱっと聞いただけでも処理1〜4は継承関係上の兄弟とは思えない。
> このような場合、どのようなクラス設計が適していますか?
適切な切り分けの単位は要件仕様やその他の背景によって異なるよ。
とっかかりがないなら、それらのデータモデルを構造体化して、
処理の引数に渡してしまえばいい。
0286デフォルトの名無しさん
2008/08/21(木) 15:48:42どうもです。
いえ、GUIの属性とかではありません。
サーバーへコマンドを投げると上記の値が返ってくるイメージです。
処理1なら
1.「コマンド処理1」をサーバへ送信
2.「コード/名称/メッセージ/結果」がサーバより返ってくる。
3.処理1の処理を行う。
処理2なら … と同じ様な処理が複数あります。
0287デフォルトの名無しさん
2008/08/21(木) 23:32:47それで相手に適切なクラスの分け方を聞いたわけ?
一応必要なアドバイスは>>285に入ってるから、熟読して悩め。
>>286の情報だけで何を悩めばいいかを挙げるなら以下くらいかな
・全ての処理で共通する送受信データの基本情報(必須情報)って何なの
・送受信データ全体を木構造に表すとどうなるの(構造体のメンバに構造体を持つかなど)
・送受信データに対して、それを継承するって適切なの
(データモデルとビジネスロジックは普通分けるがね)
恐らくだが、以下みたいな感じに落ち着くんじゃないか
・処理1,2,3,4ってのは、データモデルを引数に受ける関数ポインタ(Javaでいうリスナ)になる
・コマンド処理1,2,3,4と関数ポインタ(Javaならコマンド名のgetterとリスナをセットにしたクラス)と
送信データを引数とし、受信データを戻り値とする通信クライアントクラスが必要(C++なら受信データも引数で受ける)
・送受信データ中、基本情報以外の情報(構造体メンバの構造体)で使用しないものはNULLを入れる
基本情報以外が後からいろいろ増えるなら拡張情報をMapで持つ手もある。シリアライズ(デシリアライズ)がいるが。
最近の流儀だとXMLを使うのも悪い手ではない。(個人的にはJavaやC#ならこれにするな)
あなたのプロジェクトの答えを書いたつもりはないので、参考になるなら参考にして、後は悩め。
0288デフォルトの名無しさん
2008/08/21(木) 23:34:15×受信データを戻り値とする
○受信データを関数ポインタの引数にしてその関数を実行する
0289デフォルトの名無しさん
2008/08/31(日) 16:08:07ブラウザ - Webサーバー - APサーバー - DB
という一般的な構成でのエラーチェックで質問です。
入力データのチェックをするときに、未入力や不正文字はMVCのCで
チェックして、DBに問い合わせないとわからないチェックはMでいいですよね。
注文入力をするときに、数量の未入力は前者、在庫チェックは後者です。
でですね、「数量の上限」や「不可能な注文の組み合わせ」みたいに
「ビジネスロジックだけどDBに問い合わせる必要はない」というチェックは
APになげると余計な通信が発生するのでWebサーバーでやろうと思ってます。
Webサーバー側のpackageには原則Actionクラスしかないのですが、
このpackage配下にチェッカークラスを置くのに違和感を感じます。
注文形態が複雑でActionがいっぱいあるので、注文BaseActionを
作ってTemplateMethodパターンでフローを決めてるのですが、
だらだらとバリデートを書くのもフローがわかりにくくなって嫌です。
注文クラスそのものに書くべき?
0290デフォルトの名無しさん
2008/08/31(日) 16:34:20用意してフローに組み込み、具体的なチェック内容は派生クラスで実装
すればいいんでないの?
なぜ「だらだら」になるかが知りたいところ。
0291デフォルトの名無しさん
2008/08/31(日) 16:49:46これは不可で」「数量をparseして文字列だったらこのエラーメッセージで」
みたいな処理が10以上あって、ロジックは共通なので、その個別のValidateを
BaseActionに書いてたんです。個別Validateのどれを呼ぶかは
Actionによって異なります。で、このチェッカーって切り出すべきだと
思うんだけど、actionパッケージの下にチェッカークラス置くのって
変だよなーと思って相談したわけです。
0292デフォルトの名無しさん
2008/08/31(日) 16:50:33わかりにくかったですね。すいません。
0293デフォルトの名無しさん
2008/08/31(日) 21:00:05メソッドだけ用意し、チェックメソッドは別クラスにまとめる。たぶん、
このチェッカークラスは stateless になるんじゃないかな。
派生クラスではこのチェッカーを使って個々の Validate メソッドを実装
すれば良い。チェッカークラスの置き場所はまあ、プロジェクト的な決め事
でしょう。
0294デフォルトの名無しさん
2008/09/01(月) 00:26:21今は各Actionクラスの処理の切り出しのイメージだったから
個別ValidatorでsetFieldError()してるんだけど、チェック処理の
多さからいって全public staticなクラスに切り出すべきだと思ってる。
すでにリリースされてるプロジェクトの機能追加なのであまり
リファクタリングしたくないんだけど。
で、最初の質問に戻るんだってば。actionパッケージの下には
actionクラスしかなく、serviceパッケージの下にはリモート呼び出しを
前提としたクラスとそのドメインオブジェクトしかない。
今後のプロジェクトではserviceクラスのメソッドにアノテーションつけて
ローカル実行とリモート呼び出しを分けられるようにしようかと思っていた。
そうするとやっぱ今回もあるべき論的にはserviceパッケージの下に
ローカル実行用のサービスクラスをつくるのかな。でも単純な未入力チェック
みたいのはコントローラーでやるべきだと思うし、うーん。
0295デフォルトの名無しさん
2008/09/01(月) 00:42:31Actionに入ってることがそもそもおかしい気がしてきた。
あ、いやでも注文形態によって入力パラメータの数が違うから
未入力チェックを行うならActionか。
もしかしてstrutsみたいに各フィールドのセッターでvalidationしよう
っていうのが間違っているのか?
Action -> 個別注文クラス生成 -> 個別注文クラス#Validate()呼び出し
→ OKならリモート注文ServiceのValidate()呼び出し
こうするとすごくスッキリする。略してスッキる。ActionはModelの
生成だけでロジックにはノータッチになるし。チェッカークラスが
複雑で外だしにするとしても、個別注文クラスと同じpackageに
いれればしっくりくる。略してしっくる。ドメインオブジェクトがアクセッサしか
持っていないようなドメインモデル貧血症なつくりにはしてないからね。
0296デフォルトの名無しさん
2008/11/13(木) 18:02:240297デフォルトの名無しさん
2008/11/27(木) 14:40:57パブリックヘッダファイルで提供する関数と内部で使う関数の分け方すらわかりません。
0298デフォルトの名無しさん
2008/11/28(金) 00:16:460299デフォルトの名無しさん
2008/11/28(金) 00:39:310300デフォルトの名無しさん
2008/12/06(土) 00:00:34追いづらい。
IService ← テンプレート・メソッド パターン
↑
AbstractLogic ← テンプレート・メソッド パターン
↑
BaseCollectLogic ← テンプレート・メソッド パターン
↑
FileBaseCollectLogic ← テンプレート・メソッド パターン
↑
DomainLogic
カスが
0301デフォルトの名無しさん
2008/12/06(土) 01:58:350302デフォルトの名無しさん
2008/12/06(土) 06:03:41うざったいってのはよく分かる。
IService ← テンプレート・メソッド パターン
↑
AbstractLogic ← テンプレート・メソッド パターン
↑
DomainLogic
としてBaseCollectとやらはコンポジションでもっとけと。
0303デフォルトの名無しさん
2008/12/06(土) 09:36:210304デフォルトの名無しさん
2008/12/06(土) 19:23:37クライアントは、
DomainLogic dl = new DomainLogic();
dl.Run();
あれ?スーパークラス使わないの?
IService はどうした?
IService は?
カスが
0305デフォルトの名無しさん
2008/12/06(土) 19:26:080306デフォルトの名無しさん
2008/12/06(土) 19:33:020307デフォルトの名無しさん
2008/12/06(土) 19:36:490308デフォルトの名無しさん
2008/12/06(土) 19:48:280309デフォルトの名無しさん
2009/01/25(日) 05:15:15> 全部publicでいいじゃん!ってならないようにするスレです。
あーあorz
プログラミングまだまだ初心者で、C#勉強している途中だけど、
このスレ開いて、>>1を読んでしまった・・・。忘れようとしても忘れられない。
意識しないようにすると意識してします。
将来プログラマになった際、仕事中「全部publicでいいじゃん」というレスが頭に思い浮かんで、
忘れよう忘れようとしても逆に頭にこびりついて、何かとんでもないミスをして入社早々首になりそう・・・。
逆に、記憶に逆らって、全部privateにしなきゃと意識するとコーディングが全然遅々として進まなかったり。
スレ開かなきゃ良かった・・・。
■ このスレッドは過去ログ倉庫に格納されています