[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 06/12 10:51 / Filesize : 83 KB / Number-of Response : 309
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

-OOP限定-プログラム設計相談室



1 名前:デフォルトの名無しさん [2005/09/24(土) 16:35:59 ]
全部publicでいいじゃん!ってならないようにするスレです。

232 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 07:05:40 ]
C++で書いてます。クライアントクラスの管理をしたいのですが、
管理されるクライアントクラスは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な部分が嫌な感じがします。
よりベストな設計を伺いたいです。よろしくお願いします。


233 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:11 ]
>>232
とりあえず設計に関して。
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だとわかったらエスパー。
→メソッド名、クラス名、一時オブジェクト名の区別がつかない。


234 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:58:39 ]
>>233
ありがとうございます。


235 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:47:14 ]
どういたばしく

236 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 21:18:52 ]
ここで質問するのが適切かどうかはわからないのですが、
よくいうビジネスロジックってどういうものを言うのでしょうか。
staticで提供されているユーティリティメソッドなどはビジネスロジックではないのなら、
どういう観点で見てどういうくくりでこの処理を行うビジネスロジッククラスと設計すればいいのでしょうか。
なんとなくはわかっているんですが、なんかしっくりこないんです。
また、ビジネスロジッククラスに作成するメソッドをどのビジネスロジッククラスにコーディングするかは
どのように決めればいいでしょうか。ユーザーに関連する処理だからこのクラスとか、分け方が理解できません。

237 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 04:02:07 ]
>>236
まずここ嫁
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

全くの初心者の場合、自分で設計しようとしないで
既存のフレームワークやアーキテクチャの流儀に従うと良い


238 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:25:45 ]
>>237
レスありがとうございます。
読んでみると意味はわかるのです。ですが、それを実際にかたちにすることができません。
こんなレベルでも実際に仕事をしています。私の会社ではこれらを全て同じクラス内にコーディングするのです。
実際に要件から設計、コーディング、クラス設計を学ぶことができる書籍などはないでしょうか。
書籍を読んでも疎結合だとかビジネスロジックは分離だとか、いろいろ書いてあるのですが
自分の仕事でうまくやることができないのです。

239 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:48:49 ]
> 実際に要件から設計、コーディング、クラス設計を学ぶことができる書籍などはないでしょうか。

どうしても自分で設計したければ、
大き目の本屋に行ってオブジェクト指向
に関係ありそうな本を片端から買って読む。
多分100冊も無いと思う。

その上で、実戦を10回くらい経験すれば
なんとか人並に設計できるようになると思う。

240 名前:デフォルトの名無しさん [2007/11/01(木) 21:38:01 ]
AOPなどを使えない環境で、DBコネクション管理、コミット/ロールバックを制御したいのですが、
どういった方法が最善なのでしょうか。メソッドを細分化するのはいいのですが、引数にDBコネクションを必要とする場合が多くなってしまいます。



241 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:33:17 ]
springのトランザクションマネージャ使えば?
それも使えないならスレッドローカル変数をつかって
トランザクションマネージャを自作

242 名前:デフォルトの名無しさん [2007/11/08(木) 22:48:52 ]
ビジネスロジッククラスのインターフェースを考える場合に
業務フローからメソッドの定義を考えるのはおかしいでしょうか。
インターフェースを人に書いてもらえば実装はいくらでもできるのですが、
いまいちこのレベルまで落とし込む方法がわからずこまっております。

243 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:37:07 ]
>>242
PofEAAとかttp://d.hatena.ne.jp/higayasuo/20050818
読んで自分でいろいろ工夫したらいいよ




244 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 20:04:09 ]
>>243
ありがとうございます。書籍を購入して勉強はします、が、、、
ほかにもいろいろ調べたりしなければならないので時間がとれなそうです。

ひがさんのblogは書いてあることの意味はなんとなくわかるのですが、
実践にもっていくには私には少し?難しいようです。

245 名前:デフォルトの名無しさん [2007/11/12(月) 22:36:59 ]
Http通信で、レスポンスがcsvだったりxmlでURIごとにいろいろなパターンを返すのですが、
この場合、View用の抽象クラスを用意してそれをパターンごとにsetterを用意しようと考えています。
もっとよいアイデアがあれば教えてください。

246 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 00:38:46 ]
Http通信ワロス

247 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 00:47:02 ]
おかしくもなんともないな。

>>245
同じデータを複数のフォーマットで返せるサービスなのか、
システムで使われるレスポンスデータが複数あるのかどっち?
後者なら設計のコンセプトを知りたい。

248 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 01:40:34 ]
それ、HotJava (α)時代から提供されてる機能だから。

249 名前:デフォルトの名無しさん [2007/11/15(木) 23:16:14 ]
JavaなんだけどService Provider Interfaceスタイルをとる為に
特定の引数を持つコンストラクタをリフレクションで探すのってダメかな?
ようはBuilderだけで完結させて、BuilderFactoryは作らない方法。

250 名前:デフォルトの名無しさん [2007/11/16(金) 00:08:41 ]
>>243
>ドメインロジックを()で囲っているのは、ドメインロジックを
>ドメインモデルに持たせた場合、ドメインロジックは、ビジネスロジック

この文のカタカナ率を計算せよ。

チラット見ただけでどんな人なのか全然知らないけど、
日本語をマトモに話せない(話そうとしない)ヤツは、
ろくでもないことが多い。



251 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:53:20 ]
グラフライブラリィーを作りたいんだけど
C++で書かれていて、デザインパターンを用いたお手本になるライブラリィソースって
ないっすか?

252 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:01:29 ]
boost

253 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 18:04:51 ]
>>250
そいつの人間性はさておき、全然知らないってのは業界人としてどうなのよ・・・

254 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 13:03:50 ]
Rubyを使用しています。

OOPの設計でとっても悩んでいます。

例えば、
壁にボールを当てる事を考えます。
壁クラス
ボールクラス
投げる人クラスが
あるとします。

壁にボールが当たって跳ね返ってくるのは
どのクラスで実装しますか?
Mediatorクラスを作るべきですか?

あと、
メソッドのaugumentには
他の独自のクラスをとってよいのでしょうか?
メソッドのaugumentには、
operandはおkで、optionはNO
だというのがHeuristicだそうですが、
という事は、他のクラス
例えばこういう書き方をするか知りませんが

method(MyClass object)
のようなメソッドを実装してもいいのですか?
あまりにも汎用性が失われるような気がします。

255 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 15:16:33 ]
>>254
投げるという動詞が存在する以上、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を渡すのはあり。

256 名前:デフォルトの名無しさん [2008/03/08(土) 19:27:46 ]
質問です。
設計者は開発者に対してpublicなAPIだけを
仕様として渡して、
開発者はそれをprivateなメソッドに
分解して最終的にpublicなメソッドのテストに通ればいいという事ですか?


257 名前:デフォルトの名無しさん [2008/03/16(日) 23:55:02 ]
データ形式が以下のようなブロック集合の組み合わせの場合
DATA( A or B or C or D)

このようなデータを汎用的に書き出したいのですが
どのように設計すればいいでしょうか。

[A,B,D]の場合もあるし[C,D]の場合もあるし
かといってちまちまケース文で書き出すのは愚の骨頂だし
解らない。



258 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 02:08:14 ]
というよりどういう用途・用法で扱われるのかわからないので想像しづらいんだが.
単純にビットフィールドってことでおk?

259 名前:デフォルトの名無しさん [2008/03/17(月) 10:01:59 ]
>>257
A 〜 D を自由に組み合わせて出力したいという程度ならまず、A 〜 D に
共通な「書き出し可能データ」というインタフェースを定義する。そして
A 〜 D がこれを継承する。

次に「データを書き出す人」という抽象を作り、「書き出し可能データ」の
集合(配列、リストなど)を受け取って、ひたすら書き出すようにする。

「書き出し可能データ」の集合を生成するために、制御役の抽象が必要に
なるかもしれない。

260 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:32:42 ]
>>256
いいんじゃね?
設計者の設計粒度がどの程度かわからんけど

仕様としては外部からみた振る舞いが正しければいいわけだし



261 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 16:07:35 ]
SRPについて質問です。
「クラスの変更理由を一つにしなさい」
という事は逆にいうと、
「もしクラスが変更される時はそのクラスの仕様をすべて変更しなさい。
もし変更されない仕様が混在するならばそれは変更理由が一つではない」
という意味ですか?

262 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:18:55 ]
>>261
違います。変更理由が一つであることとクラス仕様全てを変更することに
相関はありません。

SRP は「クラスは単一の概念を表現すべし」というルールです。単一の
概念を表現するために複数のデータとメソッドが定義されるのだから、
部分的な変更をかけていく行為自体は、何ら SRP に反しません。

例えば、ある抽象概念を表現してみたものの、あとから足りないものに
気付いてメソッドを追加する、というごくありふれたケースを考えてみても、
クラスの既存仕様を壊さずに部分的な変更をかけていることが実感できる
でしょう。

あるクラスが SRP に反しているかどうか判断するには、異なる概念が
混在していないかどうかを常識的にチェックすれば良いのです。もし
混在しているのなら、それは二つのクラスに分離するべきなのです。

ただ、SRP に違反しているクラスが一概に悪とは言えないことも意識して
おくことは大切です。何事も行きすぎた原理主義はよくない。

263 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 23:21:24 ]
>>262
あとから足りないものに
気付いてメソッドを追加する、というごくありふれたケース

といいますが、これはOCPが違反しませんか?

今、Head Firstのオブジェクト指向設計とかいう本を読んでいます。
そこにはSRPの例として、車のクラスを定義する場合に
そこにwashなどのメソッドを組み込んではいけないという事になっていますが、
例えば外部で
CarWasher#wash(AutoMobile)を定義した場合、
このCarWasherクラスはAutoMobileの例えばdirtというフィールドが存在している事を知っていないければなりません。
(例えばwashというメソッドがdirtを0にするものだとすると)
これは情報の隠蔽に失敗していませんか?
それに無闇にAutoMobile#setDirtを設定してこれを受け入れれば、
他でどんな悪用をされるか分かりません。
失敗した設計だと思います。

カプセル化についてどう考えていますか?
setterはなるべく実装しない方が良いように思うので、
データについてクラスを分離するのがいいと思うのですが、
この本には振る舞いについて分離せよと書いてあります。

264 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 01:09:50 ]
>>263
拡張と一口に言っても、類似概念の追加と、メソッドの追加では意味合いが
違います。OCP を守るためにメソッドの追加ではなく継承で対応するの
では本末転倒でしょう。原則は絶対ではないのだから、柔軟に対応すれば
いいと思いますよ。

その本は読んでいないので状況が良くわかりませんが、車クラスが wash
を提供するべきではない理由が書いてあるのではありませんか? 車の主要な
責務は「人を乗せて移動する」であるとかなんとか。

まあ、いずれにしてもいい例ではない気がしますが、クラスでは概念を
完全に表現することができない以上、どこかに軸足を置く必要がある
わけです。それが「洗う」なのか「走る」なのかは目的によって変わって
くるでしょう。

カプセル化は言うまでもなくとても重要ですね。

大切なのは、自分が表現したいものをはっきりさせることです。そうすれば
自然と必要なデータや振る舞いが備わっていきますよ。

265 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 12:54:34 ]
>>263
CarWasherクラスがAutoMobileクラスのdirtフィールドを知ってなければならない
のは当たり前。
そもそも、洗車機は車の存在を前提に作られるし、皿洗浄器は皿の存在を前提
に作れる。何を?どうする?の2つを知ってないと「する側」は作れない。
てか、洗車は例えとして分かり難いぞw

266 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 15:08:00 ]
そもそも「汚れ具合」が定義されていなければ「洗う」ことも「汚れる」ことも定義できない.

267 名前:デフォルトの名無しさん [2008/05/22(木) 06:02:42 ]
OOPに最近参入した新参者です。

設計(特にクラスの設計)に関するオススメの書籍何かないでしょうか?
例えばショッピングサイト、レンタルビデオショップなどわかりやすそうなものから考えていこうとしたものの
OOPへの理解が浅いせいかどうにも戸惑ってしまっています

よろしくお願いします

268 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:13:26 ]
>>267
デザインパターンとともに学ぶオブジェクト指向のこころ


269 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 20:58:00 ]
MVC分割したときにUndoのロジックってModelの実装領域になると思うんですが、
大抵このUndoってコマンドパターンとかで実装されますよね?

このとき、Modelに対する変更命令が全てコマンドで実行されることをコードレベルで保障するには、
Modelに対する変更命令を受け取ってコマンドを発行するクラスを作って、
更にModel内部のデータ構造に対するアクセスを制限するための
読み取り専用ラッパークラスを作って外に公開する、という感じになるのでしょうか?

実際このようなことって業務レベルの開発では行っていたりしますか?

270 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:23:07 ]
>>267
個人的に、リファクタリングの実践が一番身に付きやすいと思う。
フリーソフトとかのソース落としてきてやりまくるといい。
ということで
・リファクタリング



271 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:55:43 ]
実験で使用するシリアルポートから遠隔操作できる
温度調節機能付きの水質モニターを管理するプログラムを作りたいと思っています

1分毎に水質データと水温を取得する
PCから温度の管理値を変更できる

という機能を実現したいのですがこの場合

ポートの開閉やデータの送受信を管理するCommクラス
水質データの受信要求や管理値の変更命令をCommオブジェクトに送る、水質モニターの機能を実現するMonitorクラス
Monitorオブジェクトから値を受け取り実際に表示するGUIクラス

GUIがMonitorの参照を保持して
MonitorがCommの参照を保持する
このような構造でよいのでしょうか?

272 名前:271 mailto:sage [2008/06/20(金) 00:31:37 ]
それとも
Monitorクラスの定期測定と管理値の変更は別のクラスの振る舞いにしたほうが良いのでしょうか

273 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:41:49 ]
>>271
いいと思います。あとは、水質モニターのマルチベンダー化や多重化等が
確実なら、事前に拡張性を考慮するのもあり。

274 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:07:46 ]
>>273
ありがとうございます

あと、新型のモニターを使用する場合も考えると
拡張機能を実装しやすいようにデコレータにしておいた方がいいですかね

275 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 00:04:07 ]
>>274
数ヶ月以内に新型が導入されるならね。さもなくば、シンプルに徹する。

276 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 00:47:55 ]
肝心なこと聞き忘れてました

二つの値を一つの文字列に合成してシリアル通信するのですが
この命令の合成と返答の翻訳はMonitorとCommクラスどちらに実装するべきでしょうか

質問続きで申し訳ありません

277 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 06:02:48 ]
>>276
"二つの値Constructor"に任せればいいんじゃない?
もしくはMul/Demultiplexerとか?

278 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 10:29:05 ]
>>276
Comm クラスは汎用的なシリアル通信だけを行うユーティリティクラスで
いいんじゃないかな。制御プロトコルの知識は Monitor に持たせる。


279 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:11:06 ]
>>276
おれだったら、合成と返答の翻訳を行うクラスを別途作るかな。

280 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:06:37 ]
>>279
>おれだったら、合成と返答の翻訳を行うクラスを別途作るかな。

メッセージI/FとパーサーI/F又はどれか一つ用意して
メッセージの詳細はベンダー毎に実装するのが一般的かと思う。




281 名前:デフォルトの名無しさん [2008/08/08(金) 03:31:53 ]
>>271
ちょっとOO分析っぽいことやってみたかった.

# [実験]で[使用する][シリアルポート]から[遠隔操作できる]
# [温度][調節][機能]付きの[水質モニター]を[管理する]
# [1分毎]に[水質データ]と[水温]を[取得する]
# [PC]から[温度]の[管理値]を[変更できる]

必要な名詞(オブジェクト)
 シリアルポート,温度,水質モニター,1分毎,水質データ,水温,温度,管理値
足りない名詞
 タイマー
必要な動詞(メソッド)
 操作,調節,管理,取得,変更

ここまでやったけど別に何を作ろうというわけではない

282 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 12:13:24 ]
温度がオブジェクトかよー
1分毎もかよー
水温・温度もかよー。

283 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:31:40 ]
当たり前すぎますよねー^^

284 名前:デフォルトの名無しさん [2008/08/20(水) 20:05:43 ]
クラスの設計に関して悩み中です。
例えば以下のような必要とされる要素が有ったとします。
(要素内容はでたらめです。)

・コード/名称/メッセージ/結果/色/高さ/幅
 /追加日/更新日/削除日/…(全部で20要素ぐらい)

処理1 … コード/名称/メッセージ/結果
処理2 … コード/結果/色/高さ/幅
処理3 … 結果/色/更新日
処理4 … 削除日

各処理は、クラスに個別分類できる処理になり、各処理に少しずつ上記要素が
絡んでくる状態になります。

このような場合、どのようなクラス設計が適していますか?

現在は、コード/名称〜などの20要素ぐらいをBaseクラスにして、
処理1〜4までを継承させています。
ただ、こうすると必要の無い要素まで入ってしまい、もっとすっきり
させたいなと思っています。

285 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 02:24:17 ]
>>284
> ただ、こうすると必要の無い要素まで入ってしまい

この時点で継承を選ぶのがおかしい。意味のある単位に切り分けよう。
問題の切り分けじゃなくて、登場人物の切り分けを意識した方がいい。

例えば色/高さ/幅ってGUI上の属性情報なんじゃないの?
処理1と処理4でそれらの情報を使用しないってのなら、
ぱっと聞いただけでも処理1〜4は継承関係上の兄弟とは思えない。


> このような場合、どのようなクラス設計が適していますか?

適切な切り分けの単位は要件仕様やその他の背景によって異なるよ。
とっかかりがないなら、それらのデータモデルを構造体化して、
処理の引数に渡してしまえばいい。

286 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 15:48:42 ]
>>285
どうもです。
いえ、GUIの属性とかではありません。

サーバーへコマンドを投げると上記の値が返ってくるイメージです。

処理1なら
 1.「コマンド処理1」をサーバへ送信

 2.「コード/名称/メッセージ/結果」がサーバより返ってくる。

 3.処理1の処理を行う。


処理2なら … と同じ様な処理が複数あります。

287 名前:デフォルトの名無しさん mailto:sage [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#ならこれにするな)


あなたのプロジェクトの答えを書いたつもりはないので、参考になるなら参考にして、後は悩め。

288 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 23:34:15 ]
訂正
×受信データを戻り値とする
○受信データを関数ポインタの引数にしてその関数を実行する

289 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 16:08:07 ]
ちょっとここの主題とずれるかもしれませんが、
ブラウザ - Webサーバー - APサーバー - DB
という一般的な構成でのエラーチェックで質問です。

入力データのチェックをするときに、未入力や不正文字はMVCのCで
チェックして、DBに問い合わせないとわからないチェックはMでいいですよね。
注文入力をするときに、数量の未入力は前者、在庫チェックは後者です。

でですね、「数量の上限」や「不可能な注文の組み合わせ」みたいに
「ビジネスロジックだけどDBに問い合わせる必要はない」というチェックは
APになげると余計な通信が発生するのでWebサーバーでやろうと思ってます。

Webサーバー側のpackageには原則Actionクラスしかないのですが、
このpackage配下にチェッカークラスを置くのに違和感を感じます。
注文形態が複雑でActionがいっぱいあるので、注文BaseActionを
作ってTemplateMethodパターンでフローを決めてるのですが、
だらだらとバリデートを書くのもフローがわかりにくくなって嫌です。
注文クラスそのものに書くべき?

290 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 16:34:20 ]
TemplateMethod 使ってるなら、BaseAction に空の Validate メソッド
用意してフローに組み込み、具体的なチェック内容は派生クラスで実装
すればいいんでないの?

なぜ「だらだら」になるかが知りたいところ。



291 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 16:49:46 ]
そこまではやってるんだけど、さらにその中で「注文条件がこれだったら
これは不可で」「数量をparseして文字列だったらこのエラーメッセージで」
みたいな処理が10以上あって、ロジックは共通なので、その個別のValidateを
BaseActionに書いてたんです。個別Validateのどれを呼ぶかは
Actionによって異なります。で、このチェッカーって切り出すべきだと
思うんだけど、actionパッケージの下にチェッカークラス置くのって
変だよなーと思って相談したわけです。

292 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 16:50:33 ]
だらだらなのはBaseActionに個別のValidate処理がいっぱい並んでたから。
わかりにくかったですね。すいません。

293 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 21:00:05 ]
なんとなく状況は把握できた。俺なら BaseAction には単一の Validate
メソッドだけ用意し、チェックメソッドは別クラスにまとめる。たぶん、
このチェッカークラスは stateless になるんじゃないかな。

派生クラスではこのチェッカーを使って個々の Validate メソッドを実装
すれば良い。チェッカークラスの置き場所はまあ、プロジェクト的な決め事
でしょう。

294 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:26:21 ]
そうなんだよね。
今は各Actionクラスの処理の切り出しのイメージだったから
個別ValidatorでsetFieldError()してるんだけど、チェック処理の
多さからいって全public staticなクラスに切り出すべきだと思ってる。
すでにリリースされてるプロジェクトの機能追加なのであまり
リファクタリングしたくないんだけど。

で、最初の質問に戻るんだってば。actionパッケージの下には
actionクラスしかなく、serviceパッケージの下にはリモート呼び出しを
前提としたクラスとそのドメインオブジェクトしかない。

今後のプロジェクトではserviceクラスのメソッドにアノテーションつけて
ローカル実行とリモート呼び出しを分けられるようにしようかと思っていた。
そうするとやっぱ今回もあるべき論的にはserviceパッケージの下に
ローカル実行用のサービスクラスをつくるのかな。でも単純な未入力チェック
みたいのはコントローラーでやるべきだと思うし、うーん。

295 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:42:31 ]
やっぱり、どの個別Validatorを呼び出すかみたいなロジックが
Actionに入ってることがそもそもおかしい気がしてきた。
あ、いやでも注文形態によって入力パラメータの数が違うから
未入力チェックを行うならActionか。

もしかしてstrutsみたいに各フィールドのセッターでvalidationしよう
っていうのが間違っているのか?

Action -> 個別注文クラス生成 -> 個別注文クラス#Validate()呼び出し
→ OKならリモート注文ServiceのValidate()呼び出し

こうするとすごくスッキリする。略してスッキる。ActionはModelの
生成だけでロジックにはノータッチになるし。チェッカークラスが
複雑で外だしにするとしても、個別注文クラスと同じpackageに
いれればしっくりくる。略してしっくる。ドメインオブジェクトがアクセッサしか
持っていないようなドメインモデル貧血症なつくりにはしてないからね。

296 名前:デフォルトの名無しさん mailto:age [2008/11/13(木) 18:02:24 ]
あげ

297 名前:デフォルトの名無しさん [2008/11/27(木) 14:40:57 ]
パブリックヘッダファイルとプライベートヘッダファイルの違いが分かりません、
パブリックヘッダファイルで提供する関数と内部で使う関数の分け方すらわかりません。

298 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 00:16:46 ]
OOP以前の問題だな

299 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 00:39:31 ]
パブリック複合

300 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 00:00:34 ]
テンプレート・メソッド パターンの多階層継承はマジ勘弁。
追いづらい。

IService ← テンプレート・メソッド パターン

AbstractLogic ← テンプレート・メソッド パターン

BaseCollectLogic ← テンプレート・メソッド パターン

FileBaseCollectLogic ← テンプレート・メソッド パターン

DomainLogic

カスが



301 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 01:58:35 ]
それはやりすぎというより、なんか設計がおかしい気がする。

302 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 06:03:41 ]
エントリーポイントを増やすのが目的なんだろうけど、
うざったいってのはよく分かる。

IService ← テンプレート・メソッド パターン

AbstractLogic ← テンプレート・メソッド パターン

DomainLogic

としてBaseCollectとやらはコンポジションでもっとけと。

303 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 09:36:21 ]
問題ない。次

304 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:23:37 ]
IService はインターフェースで Run メソッドが定義されてる。

クライアントは、
DomainLogic dl = new DomainLogic();
dl.Run();

あれ?スーパークラス使わないの?
IService はどうした?
IService は?

カスが

305 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:26:08 ]
>>304>>300 の続きね

306 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:33:02 ]
で、お前ならどうしたいのよ

307 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:36:49 ]
黙れカスが

308 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 19:48:28 ]
で、お前ならどうしたいのよ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<83KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef