C#, C♯, C#相談室 Part93©2ch.net

■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part92
http://echo.2ch.net/test/read.cgi/tech/1485589613/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

248デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 09:11:24.66ID:RvuVG0qm0
>>247
私の説明か理解が悪いのでしょうか?

Aは100行未満のコード245のコードの連続なので簡単に読めます。
Bが読みづらいのが問題なので、Aの機能を分離しても解決にはならないような。

BがAが取得したデータ保持とゲーム内でのデータ処理の二つを担っているのがまずいとのご指摘であれば、
それはそうかと思いますが、データ保持と処理が画面と密接に関係しているので分離し難いというか・・・。

コード全部見せないで質問すること自体に無理があるのかもしれませんね。
すいません。

249デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 09:18:34.84ID:RvuVG0qm0
たぶん端的にこう質問すればよかったのかと思います。

フォームを生成しているクラスのコードが400行、メンバ変数が10個、メソッドが8個、で、
メンバ変数はそれぞれのメソッドで3個ぐらい引用しています。

こういうコードってチームで作業してるプロから見て許容できる範囲でしょうか?
処理が多少冗長になってもメンバ変数を少なくして、メソッド内でグローバル変数として定義するべきでしょうか?

>>248
Aを入出力専門のAViewとデータ保持専門のDataHolderに分離
Bをゲーム画面描画専門のBViewと実際の内部処理を行うGameModel, 各種書き出しを行うWriterに分離

Windowのインスタンスの内部で色々な処理を行うのがそもそも間違ってる
描画と変更の通知以外何もさせるな

251デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 10:01:27.82ID:RvuVG0qm0
>>250
ありがとうございます。
理解できました。

フォーム生成するクラスはフォームの描画、変更に特化

A 初期値入力フォームを生成するクラス
B データを保持するクラス
C ゲーム画面表示クラス
D ゲームのルールに基づいてBを更新するクラス

分かりやすい。
これがオブジェクト指向ってやつか・・・。

252デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 10:07:34.76ID:RvuVG0qm0
自分は成り行きでBの機能の一部をCに放り込んでしまったから、
Bを処理するDも必要に迫られてCに入れざるを得なくなってたんですね。

入門書にあったサンプルプログラムはコード数が少なかったから、
BをCに入れてるものが結構あったので無意識にこんなもんだと思ってました。

こういうのって本では学びづらいですね。
勉強になりました。
ありがとうございます。

253デフォルトの名無しさん (ワッチョイ 059f-YHaA)2018/05/12(土) 11:04:14.67ID:PbE4ojLD0
>>251
それはOOPではなくMVCな。一応。

まぁGUIアプリケーションでのOOPの具体的なアーキテクチャだから

255デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 11:23:13.92ID:RvuVG0qm0
MVCは初耳で今ググって勉強しました。

やはり自分のコードは人と共有できるレベルではなかったですね。
MVCの設計で修正してみます。

手続き型言語しかやってないので、
手続きで処理していって
「なんども同じ手続き出てくるな。」
と思ったらクラスにして分離する思考になってたんですけど、
それじゃだめですね。

こういうのが学べるいい本があったらいいなぁ。

256デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 11:32:37.31ID:RvuVG0qm0
dataHolderクラスってABCDどれからもアクセスすることになるんですが、
パブリックにして、どこからでも読み書きできるようにしていいんでしょうか?

バグの温床になるからダメ?

257デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 11:36:18.82ID:RvuVG0qm0
マイクロソフトのホームページだとPublicにしてますね。

これだとどこからでもすべてのデータにアクセスできるから便利だし可読性もいいけど、
どこかでうかつにdataHolderの変数に変な値を入れると、
どこがバグになっているのか全コード読まなければいけないですね。

うーん・・・。
世の中そんなもんなのか?

>>256
お好きに
結局は書きやすさと安全性のトレードオフ

ガッチガチに書くならgetterだけのImmutableオブジェクトを表すインターフェイスとそれを実装する具体クラスに分離してViewにはインターフェイスだけ教えるとか(あまりやらない)
作る人数とか規模によってどの程度強制するか変わってくるから程よくやるのが重要, 一貫性は重要だが徹底しすぎるとしんどい

259デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 11:57:15.21ID:RvuVG0qm0
>>258
immutableなんてものがあるんですね。
ごく一部の変数以外はimmutableで事足りるから、immutable設定にします。
publicでdataHolderクラス作ってメンバ変数はすべてimmutableにすれば、

可読性、コーディングの利便性、安全性

全部満たせますね。
なんて便利なんだ…。( ゚д゚)

>>259
残念ながらC#では上手くImmutableに出来ない(出来るかもしれないが最近やってないので詳しい人教えて)
TypeScriptとかなら既存の型にReadonlyを再帰的に付けた型が簡単に作れるんだけどなぁ

MVCって、VとCの境界が曖昧になりがちだよな。
ってか、VとCを分ける様な事するからUIが使い辛い物になるんだよな。

>>261
せやな
MVVMとかあるしな

そそ、MVCやMVPってのは、オンラインサービスみたいにデータ管理と画面操作が隔離してる様なコンピュータサービスでなら適してるけど、スマホとかパソコンの中で完結した操作性重視のアプリの設計には適して無いんだよな。

264デフォルトの名無しさん (ワッチョイ 4d9f-VJWb)2018/05/12(土) 12:25:35.08ID:CthSiE230
厳密に言えば readonly と immutable は別
interface で表現出来るのは readonly

265デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 12:57:15.57ID:RvuVG0qm0
残念・・・

bool resultOfGetTimeLimit = int.TryParse(this.timeLimit.Text, out constant.timeLimit);

みたいに定数をフォームから取得できればありがたいんだけどなぁ。
そういう需要ってあんまりないんだろうか。

>>265
何いってるのかわかりません

267デフォルトの名無しさん (ブーイモ MM19-GlfE)2018/05/12(土) 14:55:22.20ID:5EDA9IkjM
それに変数名長すぎ

268デフォルトの名無しさん (ブーイモ MM19-GlfE)2018/05/12(土) 14:55:53.42ID:5EDA9IkjM
しかもbool型に見えない

269デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 17:01:44.57ID:RvuVG0qm0
なんかもうMVCに従って書き直すの不可能な気がしてきた・・・
初めから作り直すほうが早いかも・・・。

270デフォルトの名無しさん (ワッチョイ 23d2-UqMB)2018/05/12(土) 17:16:54.39ID:15xgRckc0
>>269
MVCは基本的にWebだかんね…

271デフォルトの名無しさん (スップ Sd03-Rh4P)2018/05/12(土) 17:19:31.54ID:VhwAlNWxd
設計思想根本から変えるのに小手先の修正で済むわけないよw

272デフォルトの名無しさん (ブーイモ MM19-obfm)2018/05/12(土) 17:32:27.30ID:XEHHkDisM
初心者が勉強のためにゲームプログラムを作るのにMVCなんてナンセンスです。
先ず、何でもいいから動くものを作る。プログラムスタイルはそれからいろんなな本で学べばいい。

273デフォルトの名無しさん (ブーイモ MM19-RhzA)2018/05/12(土) 17:33:18.63ID:oxtjRRByM
まず設計からやり直さないと無理だと思うよ

274デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:06:22.88ID:RvuVG0qm0
頭の中がどぁーっとなってきました。
とりあえずゲーム本体は完成したんですが、一部改変しようとしたらかなりの機能がすべてゲーム画面フォームにくっついてるので読みづらいことこの上ないなと。
データ部分を別構造にしたかったんですが、ほぼ句見直しに近い改変であたまがわやになってます。

275デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:11:39.59ID:RvuVG0qm0
すんごい読みづらいコードなんだけどこのまま進めていいのかな・・・。
とりあえず力業で進めることは可能なんですけど気持ち悪い。

276デフォルトの名無しさん (ブーイモ MM19-GlfE)2018/05/12(土) 18:12:38.37ID:5EDA9IkjM
>>274
で、でたーオブジェクト指向不出来form.cs全部書込奴w

277デフォルトの名無しさん (ワッチョイ 25b5-4FyP)2018/05/12(土) 18:16:14.33ID:XIsYMxrj0
動くコード書ける奴の方が神だからな。
設計どうのこうのなんて、動くコード書ける様になってから理解すれば良い。
何なら作った後で反省的を挙げながらここはこう言う構造の方が良かったんじゃね?
なんてやるのが一番設計の知識ぐ身につく。

278デフォルトの名無しさん (ブーイモ MM19-obfm)2018/05/12(土) 18:23:40.04ID:XEHHkDisM
自分のプログラムが汚いわかりにくいと思ったのなら、あなたはセンスがあるんだよ。
汚いプログラム書いて平気なプロもいるからね。
後はいろんなサンプルプログラムを検索して読んだらいい。あっ、これがいいとか気付きがあると思う。

279デフォルトの名無しさん (ブーイモ MM19-obfm)2018/05/12(土) 18:26:39.51ID:XEHHkDisM
プログラマの能力を試すには書かせるより読ませるのがいいからね。
人のプログラム読めない奴は進歩ないから。

280デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:31:48.49ID:RvuVG0qm0
あれ、根本的なことが分かってないことが分かりました。

B DataHolder
C ゲーム
D スコア記録

CからBのインスタンスを生成
DataHolder dataHolder1=new DataHolder();
すればCのpublic変数aにアクセスするときはdataHolder.a=hoge;とかでいいけど、
DからBのdataHolder1の変数aにアクセスってできるんですか?

CからDにdataHolder1の参照を渡すってこと??

281デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:33:40.32ID:RvuVG0qm0
>>276
全部ではないけどほぼご指摘あってます・・・。
本に書いてある小さなプログラムはほとんどform.csに放り込んでたので、そんなものかと思ってた。

282デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:34:30.46ID:RvuVG0qm0
>>277
ありがとうございます。
今ようやっと設計の大事さを学習しました。
レベル0から0.01ぐらいには成長できた気がします。

283デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:35:15.53ID:RvuVG0qm0
>>280
そもそもこれが分かってなかったから一つのフォーム画面にいろいろ機能を盛り込みすぎたんだと。

284デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 18:37:29.64ID:RvuVG0qm0
>>280

間違いました。

あれ、根本的なことが分かってないことが分かりました。

B DataHolder
C ゲーム
D スコア記録

CからBのインスタンスを生成
DataHolder dataHolder1=new DataHolder();
すればCのpublic変数aにアクセスするときはthis.a=dataHolder.a;とかでいいけど、
DからBのdataHolder1の変数aにアクセスってできるんですか?

CからDにdataHolder1の参照を渡すってこと??

まあなんだよ
今の君に必要なのは鉛筆と紙だ
なんたらチャートのお作法なんぞ知らんでいいから、まずは機能を書き出して丸で囲め
それからどの機能が何処から必要になるかを線引っ張って繋げ
めちゃくちゃ線がごちゃごちゃするだろう?
それをなるべく少ない線で済むように書き直すんだ何回でも

286デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 23:33:51.06ID:RvuVG0qm0
>>285
自分で書いててこんがらがってきますね。
でもまずやってみます。

287デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/12(土) 23:36:15.36ID:RvuVG0qm0
Aフォームのメンバ変数、メソッドを
BCフォームからも使用できるようするにはどうすればいいのでしょう。

Bだけで使用するならB内でAのインスタンス生成→ShowでAフォームを表示させればいいと思うのですが、
Cフォームでも使用するとなると、Cフォームで新たにAのインスタンスを生成するわけにもいかないですよね。

288デフォルトの名無しさん (ワッチョイ cb9a-k37M)2018/05/12(土) 23:44:08.44ID:7v9y2RSd0
>>287
ググるなりして調べた?そろそろ初心者スレでやって
インスタンスを渡せばいいだけなのに

289デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/13(日) 11:04:57.10ID:ySggkKZM0
>>288
すいません。
ググってもよくわからなかったので質問したのですが安易に人に頼りすぎてましたね。

昨夜からわからないところを実際にコードで打ち込んでみて実験重ねて理解できました。
インスタンスの参照渡すって言っても

フィールド渡し
プロパティ渡し
メソッド渡し

と色々方法あるんですね。インスタンスの参照を渡す方法が分かってなかったから一つのクラスに一杯盛り込むことになってたんだと理解できました。

290デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/13(日) 11:06:37.40ID:ySggkKZM0
こういうのってCやってれば常識なんですね。
どこからC#でどこまでCの質問か分からずこちらで何でも聞いていました。

次から初心者板に移動してみます。

でも、みなさんのおかげでだいぶいろいろなことを学べました。
ありがとうございます。

291デフォルトの名無しさん (ワッチョイ 25b5-4FyP)2018/05/13(日) 13:59:35.41ID:23x2pXKw0
〇〇する機能みたいにして、重要だと思う機能ほど大きく書いて相関関係を、ドラマの登場人物の関係図みたいに描いたらなんとなくクラス図の基本が出来上がる。

292デフォルトの名無しさん (ワッチョイ cb96-k37M)2018/05/13(日) 14:41:31.02ID:ySggkKZM0
>>291
ありがとうございます。
クラス図についても勉強してみます。

293デフォルトの名無しさん (ワッチョイ 89fa-9WOx)2018/05/23(水) 19:32:08.48ID:Au5e7VGg0
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

094C5

294デフォルトの名無しさん (ワッチョイ c1f7-Ockd)2018/05/25(金) 17:55:34.06ID:kaJ5fQAg0
あくまでわかりやすくするために分けるのであって、クラスを分けることが目的になってしまってはいけない
余計わからん構造になる可能性があるからね

295デフォルトの名無しさん (ワッチョイ f103-cS+N)2018/05/25(金) 23:51:50.59ID:q1degsPf0
わかりやすくする為にわけるのではない
問題が適切に表現される様に自ずとにわかれるのだ
それが本質的にわかりにくい問題であるならば
わかれた結果わかりにくいのは当然の帰結である
己の能力をわかるまで高めるしかあるまい
わかめ

296デフォルトの名無しさん (ワッチョイ 0181-2S6i)2018/05/26(土) 08:31:56.50ID:Mb7u4pS+0
なんか偉そうなこと言ってる

297デフォルトの名無しさん (ラクッペ MM25-sRwd)2018/05/26(土) 10:29:20.38ID:Qkk0DhfZM
ナイーブすぎ

298デフォルトの名無しさん (ワッチョイ 918d-dk08)2018/05/26(土) 16:16:32.23ID:nVIiMXOl0
桃とアロエのカネボウ

新着レスの表示
レスを投稿する