オブジェクト指向システムの設計 174 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/09/26(火) 07:20:38.98ID:qu+DPehL
前スレ
オブジェクト指向システムの設計 172
http://mevius.2ch.net/test/read.cgi/tech/1467992113
オブジェクト指向システムの設計 173
http://mevius.2ch.net/test/read.cgi/tech/1502182334/

類似スレ
手続き型システムの設計 1
http://mevius.2ch.net/test/read.cgi/tech/1500282714
2017/10/07(土) 07:43:58.72ID:PgxJwh6E
>>387
そういうもんか
そういう用途で使うべきではないわな
389デフォルトの名無しさん
垢版 |
2017/10/07(土) 08:28:19.15ID:nPfSE+SF
>>384
手続き型みたいなのでバグ探すと、大体1ファイルの中見て
処理の流れもその中だけ追えば良くて
シンプルな流れだからチョイチョイってできるけど
完全なオブジェクト指向だと、
「この値を設定してるのは、ここ、
…、
じゃなくて、コイツ他のとこで設定してるのか〜、
ここ?
あ、もっと上か〜」
みたいにあちこち辿っていくから
あんまり良いことに感じないけど。
影響範囲も広いし。
考えなくていいのは、製造するときに何が何をすると
ハッキリと決められてる時で
どこにバグあるかとか見るときは
「ここだろう」と最初に思ったとこではなかったりしなくね?
設計が難しいなら、
バカでもできる簡単な設計で済む手続き型最強な気がする。
390デフォルトの名無しさん
垢版 |
2017/10/07(土) 08:32:25.87ID:nPfSE+SF
>>389は詳細設計書位しかなくて、クラス図とかもろもろないケースの話で。
2017/10/07(土) 08:45:17.84ID:XbHkmFTG
>>389
ガチガチのオブジェクト指向ならその値がどこで設定されたなんか関係ないよ
今受け取った値に対しての動きをするだけ
2017/10/07(土) 08:56:39.98ID:YsvN5rHZ
ワンインスタンス内ではメンバはグローバル変数みたいに振る舞うから
継承多くなるとっていうかある時点でクソ言語になるんだよね
2017/10/07(土) 08:59:42.95ID:gjULmNh3
>>389
>>384
>手続き型みたいなのでバグ探すと、大体1ファイルの中見て
>処理の流れもその中だけ追えば良くて
>シンプルな流れだからチョイチョイってできるけど

これはむしろオブジェクト指向の特徴だね

>完全なオブジェクト指向だと、
>「この値を設定してるのは、ここ、
>…、
>じゃなくて、コイツ他のとこで設定してるのか〜、
>ここ?
>あ、もっと上か〜」

これは典型的な手続き型のデバッグだよね

もしかしてスレ加速を狙ってわざと間違えてる?
2017/10/07(土) 09:01:52.28ID:YsvN5rHZ
>>393
それ明らかに俺から見て逆だわ
処理に対して一旦オブジェクトで纏めるオブジェクト指向がそこの辺シンプルになるわけねーだろチンカス
2017/10/07(土) 09:07:01.43ID:gjULmNh3
>>394
あ〜
うん
まあそういう人も居るよね
存在を否定はしないよ
民主主義国家の人民は自由であるべきだ
2017/10/07(土) 09:13:58.30ID:XbHkmFTG
>>395
393で言いたいことはまぁわかる
けど自分が多数派であると思い込んでるのはおかしい
おまえの中の「〜べき」って論は他人に通じないので押しつけないで
2017/10/07(土) 09:33:31.18ID:gjULmNh3
>>396
いろんなコミュニティに顔だしてみなよ
リアルが無理ならネットコミュニティだけでもいい
>>393が常識的な認識だよ
2017/10/07(土) 09:45:04.94ID:cHXvfEBn
>>397
どこにそんなの書いてあるんだよ
2017/10/07(土) 09:45:43.21ID:fUAr46yo
呼び出し階層が深いだけで可読性が低いなら抽象化が下手なだけで、オブジェクト指向に限った話じゃない

呼び出し元や定義にジャンプする機能のないエディタ使ってると辛いとか
DIでコンフィグから実装を注入してると追うのが面倒くさいとかなら分かる
2017/10/07(土) 09:55:17.34ID:XbHkmFTG
>>397
おまえの中ではそうなんだろうな
繰り返すが393で言いたいことはまぁわかる
401デフォルトの名無しさん
垢版 |
2017/10/07(土) 10:08:41.11ID:HG4cr/37
>>398
> どこにそんなの書いてあるんだよ


いろんなコミュニティ
2017/10/07(土) 10:17:47.53ID:b4KK/o19
いろんな考えかたの人がいる
それは認めるべきだ
オブジェクト指向が好きなやつも手続き型が好きなやつもみんな自由と権利を持っている

でもここはオブジェクト指向のスレなので
手続き型に興味があるなら手続き型スレで議論を深めればいいんじゃないかな?

手続き型システムの設計 1 [無断転載禁止]©2ch.net・
http://mevius.2ch.net/test/read.cgi/tech/1500282714/

オブジェクト指向がわかりにくくて嫌いだからといってもオブジェクト指向のコミュニティを荒らしてもいい理由にはならないだろう
住み分けは大事だ
2017/10/07(土) 10:24:12.14ID:cHXvfEBn
>>401
なんだそのキチガイコミュニティ

2〜3個リンク貼ってみろ
潰してくる
2017/10/07(土) 10:24:39.29ID:b4KK/o19
>>403
スタックオーバーフロー潰してくれ
2017/10/07(土) 10:32:38.68ID:cHXvfEBn
>>404
どのレスだよ
2017/10/07(土) 10:33:11.71ID:AzEsxXfu
ガチガチに手続き型で組んだプログラムなんて見とうないわ
あちこちに飛ぶから云々ってマジでいってんのか
2017/10/07(土) 10:44:43.23ID:b4KK/o19
あちこち飛ぶからいいんじゃねえか
飛ばなかったら全ての処理が一箇所に集まってパンクするだろw
2017/10/07(土) 11:50:23.50ID:h9kzLMoI
飛び方がキレイな木の枝のようになっていればよい
枝から枝へモモンガのように飛ぶ処理が入っていたら地獄だ
2017/10/07(土) 14:53:33.77ID:8/GtqdSW
というか、オブジェクト指向はクラスに責任を持たせることで
責任が遡ったり他へ波及するのを防ぎデバッグも局所化して容易にする思想なので
どこかで一目でわかるように「この値を設定する一意の責任を持つのはおまえ」と
責任を持った誰かがいて、正しく作ってればそこから周りにゴミが飛び散るはずがないので

>「この値を設定してるのは、ここ、
>…、
>じゃなくて、コイツ他のとこで設定してるのか〜、
>ここ?
>あ、もっと上か〜」

とか、それのどこがオブジェクト指向だ。>>393と同じ感想
2017/10/07(土) 15:00:30.34ID:2+lwKRbT
>>409
だからインターフェースだって
2017/10/07(土) 16:02:05.40ID:kNgxClsQ
>>410
意味わからんけど
どんな使い方してんねん
2017/10/07(土) 16:08:52.04ID:b4KK/o19
素人がインターフェースを使うと実装に強く依存してしまうことがある
実装クラスの内部的な挙動を前提にするとかね
2017/10/07(土) 16:19:22.15ID:s04ZU/0N
おまえらおしゃべりしたいだけだろ
リアルで交流しろや
414デフォルトの名無しさん
垢版 |
2017/10/07(土) 17:51:59.67ID:HG4cr/37
>>408

なに? お前、モモンガ先輩の事ディスってるの?
2017/10/07(土) 19:44:56.82ID:XbHkmFTG
>>412
Javaのデフォルトメソッドとか
2017/10/07(土) 20:05:29.97ID:sBPFzIIo
しっかり役割を分担しないとオブジェクト指向の利点をいかせないと言うことか
2017/10/07(土) 21:05:16.73ID:XbHkmFTG
>>416
利点も何も役割分担できてないならそもそもオブジェクト指向じゃないよ
2017/10/07(土) 21:37:16.03ID:b4KK/o19
一言でクラスの役割を言えなければ設計ミス
2017/10/07(土) 21:55:08.92ID:E9rJLdk9
>>418
神クラス
2017/10/07(土) 22:17:55.42ID:kNgxClsQ
>>418
いやだから、インターフェイスってそういうもんじゃん
2017/10/08(日) 09:02:57.57ID:jBiYbWN1
オブジェクト指向の設計の話をしてると
このクラスはこのことを知ってるべきだ、イヤ知らないべきだ
なんて話がよくあるが
アスペの代表的な特徴として自分の視点でしか考えられない
ということかあるのでアスペにOOは無理
2017/10/08(日) 09:11:34.28ID:Iqz4qArZ
>>421
確かにアスペに取り扱いは難しいな
だが言うなればオブジェクト指向はアスペクラスの集合体だからアスペ視点は大切
2017/10/08(日) 09:24:12.05ID:p3iPkAzZ
アスペルガー指向
2017/10/08(日) 09:24:39.06ID:jBiYbWN1
>>422
1人1クラスずつ作るのか
他の人のクラスを利用することがないからゴッドクラスが乱立するな
最悪だ
2017/10/08(日) 09:27:10.43ID:4gVJmCxE
そういう現場は多いよ
見積もりしやすいとかいう頭が悪い理由で、画面を作業単位にして割り振るから
神画面クラスがいくつも出来上がる

挙げ句の果てにその見積もりも根拠なしの適当な数字ときたもんだ
2017/10/08(日) 09:31:28.00ID:Iqz4qArZ
>>424
お前がアスペだったか
2017/10/08(日) 09:39:58.73ID:jBiYbWN1
>>426
説明できないと何の論拠も無く相手をアスペで片付けるんだね
2017/10/08(日) 09:51:49.98ID:jBiYbWN1
>>425
あるな
メンテの費用たくさん取れるからいいんだよとか言い出す始末
勉強してるのがバカバカしくなる
2017/10/08(日) 10:04:06.91ID:St7l03cQ
でも見積り出せない作業じゃお金もらえないから
2017/10/08(日) 10:17:02.42ID:jBiYbWN1
単価を品質に見合ったものにしろ
2017/10/08(日) 10:58:52.79ID:tomnUErs
おまえらアスペとかADHDとか言ってるけど
せめてググってwikipediaや解説サイトぐらい見れば話が合うような言葉を選んでくれ
10人にADHDの説明させたら10通りの回答が出てくる現状では
技術的な議論に使う言葉じゃないと思うんだわ
2017/10/08(日) 11:01:13.46ID:4gVJmCxE
見積もりは出したふりでいい
客も見積もりに意味ないことは分かってるから上司への説明など適当にうまくやってくれる
その辺は阿吽の呼吸ですよ
2017/10/08(日) 11:04:17.48ID:p3iPkAzZ
関わるのも面倒だからそういうのはメンバーにいない方がマシ
2017/10/08(日) 11:16:34.14ID:ZEE0bNSu
>>427
自分が誰よりも上位にあることを見せかける上で便利だからねアスペ認定は
2017/10/08(日) 11:18:28.86ID:A99pIV6O
ここオブジェクト指向スレなんですが?
アスペがアスペを叩いていて笑う
2017/10/08(日) 11:25:19.20ID:4gVJmCxE
アスペクト指向ってどうなったの
2017/10/08(日) 11:36:48.97ID:FYLwhXQv
>>436
オブジェクト指向にフックを仕込めれば十分であることがわかった
アスペクト指向は「指向」ではなく、オブジェクト指向設計に
組み込む一種のパターン
2017/10/08(日) 15:55:36.81ID:0lUaooNs
>>436
DIで若干使われてなかったっけ?
2017/10/08(日) 20:27:37.02ID:CWK8ZE8n
そういや一時期流行ったな
実装のまずさを誤魔化す手段という認識しかなかった
2017/10/08(日) 22:01:40.54ID:4gVJmCxE
デコレーター
属性バリデーション
シリアライズ
apiプロキシ


aopは意識しないだけで結構使ってるな
2017/10/09(月) 08:04:01.64ID:tvCeOLo3
メッセージリソース管理クラスの素晴らしい設計を教えてください

void SomeAppMethod() {
// do something
view.AddMessage("MSG_0123")
// do something
}

こんな感じでリソースIDがシステム中にばら撒かれて制御不能状態になっています
メッセージリソースを管理するクラスを作って解消したいのですが良いAPIが決まりません
2017/10/09(月) 08:13:01.79ID:1ju7bjVC
>>441
何が困ってるの?
2017/10/09(月) 08:52:42.35ID:PA3EvPtr
>>441
OOPではリソースIDのような物理的な情報は隠蔽しなければならない

public interface ILowLevelMsgManager {
string GetMsg(string msgId, params object[] placeHolderArgs);
}

public interface IMsgManager {
string GetHogeMsg(); // ほげええええ
string GetFugaMsg(int num); // ふがふが{num}ふがふが
}

public class MsgManager : IMsgManager {
private ILowLevelMsgManager llmm;
public MsgManager(ILowLevelMsgManager pllmm) { llmm = pllmm; }
public string GetHogeMsg() { return llmm.GetMsg("MSG_0001"); }
public string GetFugaMsg(int num) { return llmm.GetMsg("MSG_0002", num); }
}
2017/10/09(月) 09:16:54.02ID:L5aecCRz
>>443
それになんの意味があるのかさっぱりわからんな
メッセージなんてでかいプロジェクトだと500個とか行っちゃって
詳細なんかわかんなくていいんじゃないの?
もうメッセージ一覧で確認することは諦めろよ的な
2017/10/09(月) 09:24:41.04ID:L5aecCRz
メッセージでこれまで見た中で一番多いのは3000だった
そこまで構えろとはいわんけどそういう性質のものではある

ソースの該当箇所に一つ一つ置いていく手間は省略できない
メッセージリソースIDとメッセージが照合できればそれでその作業は終わりじゃねーのか?
後、何を管理してもらいたい?
2017/10/09(月) 10:08:03.54ID:PA3EvPtr
>>444-445
ハードコードされた人間可読性ゼロの3000個のIDはそう簡単には管理しきれないと思うが
まあ君の人生だしどう時間を使おうと君の自由だね
私はしっかり管理して時間を節約するよ
2017/10/09(月) 10:21:29.30ID:Y2JfmrWo
客の都合でID体系変更になってリテラル全部調べて置き換えて再テストしたトラウマ
する価値ないと思ってもとりあえずでいいから抽象化しておいて損はない
2017/10/09(月) 10:22:07.29ID:FteGtpX4
別ファイルに切り出して読み込めばいいと思う
2017/10/09(月) 10:44:55.28ID:3IBabimx
>>446
いやぁ、だからさ
ソースのエラー箇所に自動配置なんかできないんだからそこは300だろうが3000だろうが30000だろうが手動じゃん
IDとエラーメッセージが組にさえなってたらどういう構造にしようがやることかわんねーよ的な
2017/10/09(月) 10:48:47.25ID:3IBabimx
visualstudioのjaファイルとかその辺の仕組み使えばいいんじゃないの?
ローカライズするならやっとかないと死ぬよ
2017/10/09(月) 10:50:11.84ID:Vj0lVF94
rm = new ResourceManager(locale)
un = rm.get("property.name.user-name")
msg = rm.get("validation.error.max-length", un, 10)
print msg # ユーザー名は10文字以下で入力してください

スッキリ
2017/10/09(月) 10:55:11.14ID:PA3EvPtr
>>449
それじゃ可読性が低すぎるって言ってるの
暗号みたいにIDばらまかれても保守できないよ
それに>>447のようにIDとメッセージの対応が変わることもある
手間が変わらないなら1つ抽象化層を設けてコードを保護すべき
2017/10/09(月) 11:29:45.24ID:3IBabimx
>>452
いやぁでもこの数やる気にはなんないなぁ
2017/10/09(月) 11:31:53.98ID:3IBabimx
>>452
体系が変わるのはまた別の話かな
もう完全に仕様変更なわけで落ち着いて対応できる
2017/10/09(月) 11:34:13.65ID:3IBabimx
このケースで余計に一層設けるのはメリット薄いんじゃない?
って言いたい
2017/10/09(月) 11:44:58.84ID:M//uOX8+
>>441
C#なら素直に.resx使う
少なくとも存在しないIDを使った場合に
コンパイルエラーになる仕組みを使う

種類ごとにグループ化(階層化)して管理しやすくする

メジャーなフレームワーク参照したら分かると思うがMSG_0123みたいな命名自体も悪手
もうどうしようもないのかもしれんが
2017/10/09(月) 11:50:08.07ID:3IBabimx
>>456
もう数からいってメッセージのうちのどれ?って判別できる量で終わらんと思うし
IDの命名規則なんて些細なことよw
俺の経験で言うと
2017/10/09(月) 11:59:06.73ID:RdvZrZJ8
コードジェネレータがいいよ

メッセージID, メッセージテキスト, パラメータ数
Hoge, ほげ, 0
Fuga, {0}はふがです, 1

これをエクセルで管理してメッセージ管理クラスを出力

class MessageManager {
public static string Hoge() => "ほげ";
public static string Fuga(object p0) => string.Format("{0}はふがです", p0);
}

んでデータ数が増えてきたらエクセルをやめてデータベースで管理
エクセルを使えばお客様もお喜びになられるので一石二鳥
2017/10/09(月) 12:17:44.19ID:M//uOX8+
>>457
メンテナンス性を犠牲にしても
命名負荷を下げたいという意思決定をしてるんならいいんじゃないの

神クラス・神テーブルと同じアプローチだけど
物によってはそれが適切な選択の場合もあるんだろうから
2017/10/09(月) 12:35:04.44ID:1orfMMQz
>>441
> メッセージリソース管理クラスの素晴らしい設計を教えてください

メッセージリソースなんてものを作らない。

view.AddMessage("あーがこーでどうなりました")

って日本語で書けばいい。

多言語化したいなら、gettextなどの言語やフレームワーク標準の
多言語化ライブラリを使えばいい話。

その場合は、英語でメッセージを書いて、日本語化するってことが
よく行われるが逆でもいいだろう。
2017/10/10(火) 07:21:02.20ID:JGhyCx0Y
>>373
責務指向良いね

ゲームはオブジェクト指向でしっくり来るかも知れんけど業務システムだとピンと来ない
2017/10/10(火) 08:31:03.78ID:v9JcaVeZ
ゲームをオブジェクト指向で作ると作りにくいよ
相互作用の処理が多過ぎてオブジェクトに閉じない
2017/10/10(火) 12:08:00.54ID:RxOfGqdN
それは設計どころかゲームそのものとしての落とし込みが不十分
ゲームとか一定のルールに則った動作をするだよ
2017/10/10(火) 12:15:07.34ID:duckiwE1
>>462
メッセージ&イベントだらけになって死ぬな
ゲームは関数型が至高
2017/10/10(火) 23:46:15.72ID:WxQVAUFU
「オブジェクト指向だからステージの俳優が全員なんか言ってきて
カントクは一人一人対応なんかしてたら死ぬな!!www」

…いや、間違った理解をした奴はまあそういうドマヌケやらかしがちだが
普通はステージステータスに集約されて、ディレクターは
そのステータスを見て上から必要な個々に指示が送られるように作るからね…
2017/10/11(水) 00:09:15.15ID:i63/Wje0
ゲームは油断するとすぐにキャストや型判定だらけになってしまう
特定のクラス同士の時だけ発生する相互作用とか
2017/10/12(木) 12:26:13.92ID:UV6Mfibu
ゲームとか業務とかピンキリだろ
2017/10/12(木) 21:48:31.48ID:Drh75QCI
お客さんが属性バリデーションも他のバリデーションフレームワークも使っちゃダメって言うんだけど
どうすれば楽にバリデーションできる?
言語はC#
テキストリソースは全てDBで管理されている
ロケールによってエラーテキストを変えなければならいとする
2017/10/12(木) 22:09:08.92ID:o8TlX9Z0
>>468
普通に作る以外にない
ちなみにダメって言う理由は何なの?

あとバリデーション自体と
バリデーション結果に応じたエラーテキストの選択は
分けて考えたほうがいいよ
2017/10/12(木) 22:34:53.95ID:Drh75QCI
>>469
属性やフレームワークは設定方法がよくわからないのでメンテナンスの時に困るから

ひたすら単調にif文をズラズラと書いてるんだけどシンドイ
項目数が100近いPageもあってそれぞれが何種類かのバリデーションを行うからバリデーションだけで数百行のメソッドになることもある
2017/10/12(木) 23:00:42.84ID:o8TlX9Z0
>>470
xmlでルール書くやつは敬遠されるのは理解できなくもないが
単純な属性ベースは分かりやすいしメンテしやすいのにね

楽しようとすれば結局自前で簡易的なフレームワーク風のものを作ることになる
あまりにも数が多いならコード生成という選択肢も
2017/10/12(木) 23:06:26.57ID:njn1yLjW
>>470
ライセンス的に問題がないものをコピーすればいい
473
垢版 |
2017/10/13(金) 00:23:50.41ID:9nU9SyY4
>>468
フレームワーク書いたらだめなの?
2017/10/13(金) 01:47:19.56ID:l1jERKvk
>>470
Frameworkを使わないc#ってどんだけマゾなの?ランタイム自分で書いてんの?
2017/10/13(金) 01:48:05.83ID:nTgCE4U5
>>470
そんな理由にならない理由に従おうとする方がバカ
2017/10/13(金) 02:48:12.40ID:s0+Jkp8l
今回みたいな例だとライブラリを使わないで自作するとしたら
使った場合に比べて何倍ぐらいの金額を請求する?
2017/10/13(金) 02:56:05.56ID:GlXmqXn2
バリデーションが全体の工数に占める割合がわからないとなんともいえないけど、数倍なんてなるわけないだろアホ
どんだけバリデーションばっかやってるプロダクトを想定してんだよ

客に費用の話をするとき、「通常この規模だと20人月ですが、バリデーションライブラリが使えないので+50人月かかります」とでも言うのか
2017/10/13(金) 03:43:57.20ID:s0+Jkp8l
はぁ? 増えた分の請求は当然するだろ。当たり前のことを当たり前にするだけだぞ
2017/10/13(金) 04:33:13.10ID:l1jERKvk
>>476
なんでいきなりフレームワークじゃなくてライブラリの話になってんの?
2017/10/13(金) 04:36:24.84ID:zVcBlnUR
>>476
既存のフレームワーク使わずに自作する方が工数膨らむに決まってんだろ
カプコンレベルじゃないとスキル的にも厳しい
2017/10/13(金) 04:37:49.67ID:zVcBlnUR
ごめん勘違い
工数の膨らみ方が半端なさ過ぎて非現実的ってのが言いたかった
2017/10/13(金) 04:40:34.82ID:qOElJcq/
ひとまず使って組んで元の処理コピーして置き換えちゃえばいいんちゃう?
バリデーションのソースってあんでしょ?
2017/10/13(金) 05:21:13.13ID:s0+Jkp8l
>>479
バリデーションのフレームワークなんてないでしょw
2017/10/13(金) 07:46:49.24ID:DI18WdpZ
>>483
フレームワークの一部としてバリデーションがあるやろ
2017/10/13(金) 14:51:54.32ID:+zTlsJiZ
バリデーションのフレームワーク普通にあるだろw
486デフォルトの名無しさん
垢版 |
2017/10/13(金) 16:33:32.34ID:kRlRrFWL
ごめん、何言ってんだかよくわかんないんだけど、
まず、>>468のバリデーションって、一体何に対するバリデーションの話してるの?
2017/10/13(金) 23:02:45.05ID:6pOkahl4
if (!validateRequired("#foo")) {
var msgFormat = getResource("error.required");
var label = getLabel("#foo");
addMessage(msgFormat, label);
addCss("#foo", "input-error");
}
以下100項目繰り返し

これ以上簡潔で保守性の高いバリデーションが存在しない件
OOPは物事を無駄に複雑化するばかりで役に立たん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況