ふらっと C#,C♯,C#(初心者用) Part146

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9f0b-Fgt1)
垢版 |
2019/12/11(水) 22:12:11.28ID:d09CciDz0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part145
https://mevius.5ch.net/test/read.cgi/tech/1570446977/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/01/29(水) 22:46:36.64ID:hzNdq+pG0
>>634
どうでもいいだろそんなん
2020/01/29(水) 22:56:00.32ID:PvehEt0vM
>>633
基本的な演算子定義だけで出来る
2020/01/29(水) 22:56:01.11ID:3Ec+y/7b0
どうしてもやりたいなら$"3<{x}<5".Predicate()みたいなライブラリ作ればいいんじゃね
639デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/29(水) 23:06:16.31ID:Bye/BSTsa
>>634
文脈依存キーワードと何も違わないと思うよ
2020/01/29(水) 23:16:52.10ID:tkk/tPU50
a < x の値を独自クラスのインスタンスにできるならあとの < b はどうにでもなるだろうけど
そもそも前者って可能なんだっけ?
641デフォルトの名無しさん (アウアウウー Sa21-0Ybi)
垢版 |
2020/01/29(水) 23:24:37.56ID:2z1gsFLxa
>>637の答えがほぼ>>638ってことで良いですか?
また便利な情報を得てしまったわ
2020/01/29(水) 23:27:24.25ID:7ZbwpcWy0
>>640
比較演算子をオーバーロードするだけじゃない?
false相当の値か右辺の値を戻すようにして、併せてimplicitでboolを当てておけばifでも使えるはず
2020/01/29(水) 23:36:35.98ID:tkk/tPU50
a b x の型が int だったりしたとき、それオーバーロードできるんだっけ?
2020/01/29(水) 23:57:35.84ID:fVMIrPAj0
C#のターゲットフレームワークってどういう仕様なんでしょうか?
わかりやすいサイト教えてもらえると助かります。

exe 4.5 dll 3.5 
→ ビルドできるからok?
exe 3.5 dll 4.5 
→ コンパイルエラー
  ただし動的に読み込んだ場合は動いてるっぽい?
2020/01/30(木) 01:31:07.75ID:N/97jNZ60
wrapする型を定義して a < x < b できるようにしてみた
https://dotnetfiddle.net/FdQsX1

が、まあ使わない
2020/01/30(木) 05:02:06.68ID:CgdKR7K00
んんんんんんh
2020/01/30(木) 14:25:04.44ID:XrVMMkZO0
visual studio2019 30日たったら使えなくなったんだけど
無料じゃないの?
PC替えるまで以前のバージョンはずっと使えてたんだけど
2019は違うの?
無料版使い方おしえてください
648デフォルトの名無しさん (ワッチョイ 3d2d-XhTL)
垢版 |
2020/01/30(木) 14:27:27.39ID:UIStC4VF0
ログインすれば無料のまま使えるよ
2020/01/30(木) 14:30:14.48ID:XrVMMkZO0
更新したら使えました
ありがとう
2020/01/31(金) 03:22:54.75ID:A50vozAla
ボタンを押すと計算開始して結果をテキストボックスに表示する処理(数十秒かかります)
まずボタンを押してその処理がまだ終わってないうちに、またボタンを押すと次の処理がどんどん溜まっていくのですが、
これを防止する方法はないでしょうか
(例えばついボタンをダブルクリックをしてしまった時に1回表示してからまた同じ処理に入ってしまう)

ボタン押したら結果が表示されるまで全部のボタンのenabledをfalseにする処理入れてみたのですがこれではうまく回避できませんでした
2020/01/31(金) 03:40:35.08ID:PzD8ZwF3M
lock使う
2020/01/31(金) 04:08:48.51ID:sTuegRNa0
メインスレッドには実際にボタンを無効化する作業をしてもらわないといけないので
計算はasync/await等を使って別スレッドで行う
2020/01/31(金) 06:01:04.44ID:A50vozAla
>>651-652
正直まだ難しそうですががんばってみます。ありがとうございました。
2020/01/31(金) 07:46:03.52ID:EEAl6aZb0
>>650
http://aquablue7.blogspot.com/2013/05/blog-post.html
655デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 13:16:14.42ID:59NEldNla
>>653
何も難しくないよw
>ボタンのenabledをfalseにする処理入れてみたのですがこれではうまく回避できません
これは「重い処理」の後にそれをやってるからそうなる

ボタンのイベントハンドラで真っ先にEnabled = falseにすればそんなことは起こらない。
2020/01/31(金) 14:04:57.33ID:EEAl6aZb0
>>655
やったことないアホは黙ってた方がいいぞ
あと反論するならググってから反論した方がいい
657デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 14:58:26.86ID:59NEldNla
>>656
はいはい頭悪そうワロタw
658デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 15:16:23.75ID:59NEldNla
なぜかコードが貼れないので割愛するけど、実際にやって>>655が正しいことを確認した
当たり前の話だがw
2020/01/31(金) 15:20:18.74ID:La68B+L1M
>>657
ググることもできずに頭悪いとしか書けないとか可哀想なやつだな
>>655みたいな誰でも思いつく方法でなんとかなってたら苦労はせんよ
2020/01/31(金) 15:22:19.46ID:La68B+L1M
>>658
当たり前の話だが負荷かけてテストしてるよな?
661デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 15:25:15.63ID:59NEldNla
つくづく馬鹿な奴w
偉そうに他人様に命令する前に自分は実際にコード書いて確認したのかとw

まあ普通こんなレベルの話は確認するまでもないけどね
662デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 15:41:48.86ID:59NEldNla
どうでもいいけど

(1) Thread.Sleep
(2) Task.Delay
(3) ビジーループ

いずれのダミーを使ってもイベントハンドラの頭でEnabled = falseとすることで
ボタン連打によるイベントハンドラへの意図しない「再入」を抑止できることを確認した
663デフォルトの名無しさん (ワッチョイ 3d2d-XhTL)
垢版 |
2020/01/31(金) 15:43:04.01ID:xcV7YFLC0
イベントを呼び出すのが毎回同じスレッドなんだから、>>655の方法で完璧に止まると思うけどな
2020/01/31(金) 16:25:21.45ID:6LQhDtiB0
>>662
>(例えばついボタンをダブルクリックをしてしまった時に1回表示してからまた同じ処理に入ってしまう)
再入が問題じゃないって気づけよ
タイミングによってクリックイベントが2回キューイングされることがあるのが問題なんだよ
665デフォルトの名無しさん (ワッチョイ 6663-3Mgd)
垢版 |
2020/01/31(金) 16:55:17.80ID:rVrHfFzc0
ガイジに何を気付けって?
お前も方面が違うだけで同じガイジだな
2020/01/31(金) 17:43:12.90ID:Wmzh3pBZ0
>>650
イベント処理に入る前にイベントハンドラを外しておくといい。button1.Click-=button_Clickみたいな感じで
ただValueChangedとかならともかくボタンで普通はやらないと思う。「enabledをfalse」になっているボタンでイベントが実行されるのはおかしい
計算処理を非同期に渡して計算が終わらないうちにEnabledを復帰させるとか変なことやっていないか?
EnabledでなくVisibleをfalse->trueに変えてみて確認したら?
動作に関しては他の人がいろいろ言っているようだけど一度ミニマムコード作って自分で動作確認するのが一番確実
2020/01/31(金) 18:37:18.25ID:y3M2GGQ20
private void button1_Click(object sender, EventArgs e) {
button1.Enabled = false;
//重い処理
button1.Enabled = true;
}

上のコードでもユーザーが最初のクリックをしてから
イベントハンドラが呼ばれてEnabled = falseが設定されて
さらにそれからクリックできなくなるまでの間に
複数回のクリックが発生する可能性がある
(Windowメッセージのキューに溜まる)

だからEnabled = trueに戻す前に
溜まったクリックイベントを流してやる必要がある
668デフォルトの名無しさん (ラクッペ MM6d-3Mgd)
垢版 |
2020/01/31(金) 19:04:25.31ID:AyZqOEveM
難しすぎて分かんねえよ兄貴
2020/01/31(金) 19:05:05.53ID:EEAl6aZb0
>>663
イベントは非同期でキューイングされるから>>655では不完全
アマチュアレベルとか自分しか使わないならそれで良いけど不特定多数が使うようなソフトだとダメダメ
ID:59NEldNlaはコード書いて確認する姿勢は良いけど確認がザル過ぎる
てか、アプリ作ってたらこの手の経験はしてるはずなんだが…
2020/01/31(金) 19:14:36.51ID:oeaCTmz/M
イベント流すってどうするんですか?
671デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 19:29:46.30ID:59NEldNla
>>667
そんな必要ないってば...
君がOSのコード書く立場になってよく考えてよ。
君はメッセージをエンキューする時にウィンドウが無効化されているかどうか
ノールックでやっちゃうような間抜けなコード書くの?w

そんなのありえへん
2020/01/31(金) 19:30:59.97ID:BjcNa1EE0
ここ初心者スレだろ
2020/01/31(金) 19:34:11.53ID:6LQhDtiB0
いやだから、無効化されるまでに2回以上キューにたまる可能性があるって話なんだが...
2020/01/31(金) 19:34:38.34ID:J9WtEN9Ir
よくわからんけど痛い人が大声で独演会をやっています
2020/01/31(金) 19:47:15.52ID:EQPJwN2a0
再現できるコードも示さずにこんな現象があるんだって書き続けるのは他でやれよ
それにかまう連中も荒らしと同じ
>>1を読んで理解してから書き込め
2020/01/31(金) 20:12:38.30ID:J9WtEN9Ir
今日も仕事で新型コロナウイルスなんて騒ぎすぎだという老人の独演会を30分聞かされた
対策も必要ない死ぬ人は死ぬでいいじゃないかと言う話

老害しなないかな
677デフォルトの名無しさん (ワッチョイ 3d2d-XhTL)
垢版 |
2020/01/31(金) 20:19:21.81ID:xcV7YFLC0
キューが溜まる派は、button1.Enabled = false;なし、かつ、非同期処理なしにすれば簡単に再現コードができるんだろう
でも現実には再現しないから困ってんだろうな
678デフォルトの名無しさん (ワッチョイ 3d2d-XhTL)
垢版 |
2020/01/31(金) 20:19:22.13ID:xcV7YFLC0
キューが溜まる派は、button1.Enabled = false;なし、かつ、非同期処理なしにすれば簡単に再現コードができるんだろう
でも現実には再現しないから困ってんだろうな
679デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 20:31:30.36ID:59NEldNla
ちなみに念のためこんなのもやってみたが

//button1をクリックした後button2を連打せよ
private void button1_Click(object sender, EventArgs e)
{
  Thread.Sleep(5000);
}

private void button2_Click(object sender, EventArgs e)
{
  MessageBox.Show("Button Clicked !");
}

Win32に詳しくないので理由を与えることが出来ないけど、
この場合もメッセージボックスは1度しか表示されない
680デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 20:46:38.12ID:59NEldNla
>>676
完全スレ違いだけどそれはその老害の言ってることの方がただしいw

専門家はたいしたリスクないから騒ぎすぎだと言ってるのに
どっかの怪しいネットde真実クンの被害妄想を真に受ける奴がどうかしてるよ

こういうの認知バイアスって言うんだけどさ
2020/01/31(金) 21:00:47.10ID:J9WtEN9Ir
一流の専門家wとWHOと各国の対応見る限り
誰かの方が認知バイアスかかってると思う

世の中でこういわれてるけど逆の方に○○と言うのを言って俺スゲーしたいのが老害
682デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 21:06:43.84ID:59NEldNla
>>679
いや待て、ひょっとしてMessageBoxがフォーカスを奪うのが関係しているのかと思って
Console.WriteLine("Button Clicked !");

に変えてみたらなんと複数回表示されるなww
何てこったw

この現象は以下のコードで回避できた
private void button2_Click(object sender, EventArgs e)
{
  if (button2.Enabled)
  {
    button2.Enabled = false;
    Console.WriteLine("Button Clicked !");
  }
  Application.DoEvents();      
  button2.Enabled = true;
}
2020/01/31(金) 21:08:40.75ID:EEAl6aZb0
>>675, >>677
だからテストするなら負荷かけろって話な
>>667の話を理解できてたらわかると思うんだが、>>671みたいな絶望的なアホもいるからなぁw
684デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/01/31(金) 21:09:59.26ID:59NEldNla
>>681
WHOは声明で過剰反応するなと言ってる。
多くの伝染疾患の専門家の意見も同じ

各国政府の対応はよく言えば安全牌、悪く言えば役人や政治家の保身だね
テールリスクとしてはヤバいことになる可能性は確かにゼロではない。
その場合に誰も批判されたくないしね。
費用負担するのは納税者であって役人でも政治家でもないし
2020/01/31(金) 21:15:06.28ID:0h4Mv/T00
でも新型ウイルスで色々と未知だから警戒するに越したことはないと思う
2020/01/31(金) 21:23:40.30ID:r/XM8LG10
メッセージボックスはボタンかキーボードが押されるまで待つ。
ダイアログの一種。
2020/01/31(金) 21:59:54.58ID:XKSM3aqP0
>>670
Postする
2020/01/31(金) 22:34:59.12ID:y3M2GGQ20
>>670
1. Application.DoEvents()
2. PeekMessage()
3. await Task.Delay()

Task.Delay()使ってthrottle/debounceする高階関数を作っておくと毎回書かずにすむ
2020/01/31(金) 23:16:44.01ID:1nDsQqma0
引数でリスト渡すけど要素を変更して欲しくない時って結局どうすりゃいいの?
Immutableは使えない環境の場合

ReadOnlyCollectionは引数の型としては想定してないみたいだけど、キャスト防ごうと思ったらこれしかないよね?
2020/01/31(金) 23:27:33.43ID:mtUYlnXN0
>>682
今時Application.DoEvents()を手動で呼ぶとか…
それはともかく、Application.DoEvents()を呼ぶタイミング遅くない?
2020/01/31(金) 23:43:34.80ID:BFU5CNzNM
>>689
Deep Copy
2020/02/01(土) 00:38:43.88ID:1j1iFXRs0
拡張メソッドにしろクラスをシリアライズするの面倒じゃん
2020/02/01(土) 01:36:17.36ID:XuRc8/EP0
質問お願いいたします。

カスタム日時書式指定文字列を使って、
例えば DateTime.Now.ToString("M月") と書けば、
今なら "2月" という文字列が受け取れます。

しかし、DateTime.Now.ToString("M") と書いても
"2" という文字列ではなく "2月1日" という文字列が返ってきてしまいます。

これは "M" という文字列が(カスタムでなく)標準の日時書式指定文字列と
解釈されてしまっているからのようなのですが、
DateTime.Now.ToString(...) のような書き方で
"2" という文字列を受け取ることは可能でしょうか。

もちろん DateTime.Now.Month.ToString() と書けば
"2" を得ることはできますが、IFormattable インターフェース経由で
文字列を取得したいという事情があり、
Month プロパティを使う方法は避けたいと考えております。

もし何かおわかりのことがあればご教授いただけると幸いです。
どうぞよろしくお願いいたします。
2020/02/01(土) 01:40:32.15ID:BvtANEfa0
あとから月消すのは無し?
2020/02/01(土) 01:54:56.01ID:EnxAFhi/0
>>693
%M

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings#UsingSingleSpecifiers
2020/02/01(土) 01:55:14.57ID:HxAAP4sW0
control.Enabled=true/falseって即時処理されるのか?
WM_ENABLEメッセージをキューにPostするだけなのでは。
2020/02/01(土) 02:05:13.79ID:XuRc8/EP0
>>695
おお!まさに探していたものです。
'escape' 等をキーワードにして検索を試していたのですが
少し的が外れていたようです。
本当に感謝です。どうもありがとうございます。

>>694
ご提案どうもありがとうございます。
ただ今回は IFormattable.ToString の引数だけを使って
文字列を取得したかったので、
% を使う方法を使わせていただこうと思います。
2020/02/01(土) 02:14:03.96ID:BvtANEfa0
>>697
正規の方法がすぐ解って良かったね
2020/02/01(土) 05:24:11.96ID:156Woc/f0
>>696
否定はできんけど、そんなことになってたらおそロシア
700デフォルトの名無しさん (ワッチョイ a5b0-x1ET)
垢版 |
2020/02/01(土) 08:01:32.31ID:22BQCiJ60
しょーもない質問なんですが
起動時、必要なファイル(iniとか)を探して、無ければ起動しないというプロセスは
Form1_Load()にifでApplication.Exit()書いて強制終了にしてしまえば良いのでしょうか?
Form1_Load()の途中で強制終了はwindows的に無問題でしょうか?
2020/02/01(土) 08:02:52.31ID:iBA7Xa3w0
>>696
そうだよ

>>699
即時処理される方がおそロシヤだよw
ボタンを薄くする処理とかも走るんだが誰がそれをやると思ってるんだよ
2020/02/01(土) 08:15:21.41ID:a0E2Gls+0
>>700
program.cs オススメ
2020/02/01(土) 08:17:35.37ID:dIJ1vCV90
>>696
Reference Source見りゃわかるけど普通にControl.Enableのセッターで::EnableWindow呼んでるわよ
てかWM_ENABLEはただの状態変化後の通知だし
704デフォルトの名無しさん (ワッチョイ a5b0-x1ET)
垢版 |
2020/02/01(土) 10:09:48.17ID:22BQCiJ60
>>702
すんません。よく分かってないのですが、
Main()の中の3行をifでスルーさせれば良いってことですか?
それともRunの手前でExit()ってことですか?
2020/02/01(土) 10:22:15.63ID:a0E2Gls+0
>>704
正常ならform作ってrun、異常ならformを作らない。

テンプレのApplication3行は、最初の2行がGUIの設定、最後がformの作成&実行。

判定条件がファイルの有無なら、GUIの設定待つ理由無いでしょ
2020/02/01(土) 11:05:21.70ID:iBA7Xa3w0
>>703
> Reference Source見りゃわかるけど普通にControl.Enableのセッターで::EnableWindow呼んでるわよ
そりゃそうだろ、だから何?

> てかWM_ENABLEはただの状態変化後の通知だし
違うぞ、ちゃんと読め
https://docs.microsoft.com/ja-jp/windows/win32/winmsg/wm-enable
そもそも変化後の通知ならWM_ENABLEDになってるよ
2020/02/01(土) 11:31:14.25ID:EnxAFhi/0
>control.Enabled=true/falseって即時処理されるのか?

何をもって「即時処理される」と言うのかに違いがあるから話が噛み合わない
2020/02/01(土) 11:42:50.99ID:ik9eUhGlM
>>704
Mainでファイルなかったらreturnしてオシマイでいいよ
Exitは普通は使わない
2020/02/01(土) 11:44:34.08ID:yH+BLTFV0
Exit! y=ー( ゚д゚)・∵. ターン
2020/02/01(土) 11:47:30.77ID:3zclQUgm0
sendmessageでもすりゃすぐわかる話じゃないのこれ
711デフォルトの名無しさん (ラクッペ MM6d-3Mgd)
垢版 |
2020/02/01(土) 12:04:42.89ID:2IjxM/PsM
C#しか書けない奴はこれだから使えない
712デフォルトの名無しさん (ワッチョイ 66b0-x1ET)
垢版 |
2020/02/01(土) 13:11:09.93ID:neZT0y0y0
まあここは初心者スレなんだし勘弁してくれや
使えない部下との仕事のウサばらしは他でやってくれ
こっちは趣味で自分の使うアプリしか作ったことないから
「もしファイルが無かったら」なんて仮想の対策なんてしたこと無かったしww
それにC#というより「コンピュータのプログラムが動く仕組みは」に近い分野だったね

>>705
>>708
色々実験して、なんとなくできた。
Runが実行されなかったらExitは必要無いんだな。
ありがと。
2020/02/01(土) 13:37:26.34ID:F+jbRz18M
>>712
RunしたあともExitは使わない
Closeを使って行儀よく終わらせる
2020/02/01(土) 13:40:52.92ID:1j1iFXRs0
フォームアプリケーションなどしんでしまえ
2020/02/01(土) 13:49:16.30ID:OqODUHFj0
>>706
「EnableWindowが戻る前だがWS_DISABLEDが立った後」だから状態変化後の通知でしょ
MSの動詞の使い方なんぞに一貫性は期待しちゃ駄目よ

もともとが定義の雑な質問なんだから現段階でこっちにイチャモン付けても実りはないと思うで
2020/02/01(土) 14:03:46.68ID:U7UUZgrK0
EnableWindowもメッセージ飛ばすだけだから何らかの方法でメッセージ処理させないとUI更新されない
2020/02/01(土) 15:00:01.57ID:OqODUHFj0
Winformsのコントロール実装だと大体Enabledの中で状態変数を変化させて
ついでにEnableWindowを呼んでネイティブ層での入力を無効化し
ついでにInvalidateを呼んでペイントハンドラをポストして
のちに出キューされたペイントハンドラがコントロールの状態を見ながら描画って流れやね
2020/02/01(土) 15:32:06.42ID:a0E2Gls+0
>>712
時間のかかる大規模な初期化をするなら、
フォーム作ってスプラッシュを立ち上げて
その中でってのはあるけど、
小規模ならフォーム作る前にしちゃうと簡単

good luck!
2020/02/01(土) 15:35:16.92ID:yH+BLTFV0
やっぱりDoEvents最強だな
2020/02/01(土) 17:53:45.50ID:156Woc/f0
>>717
ありがとう、エロい人 m(_ _)m
2020/02/01(土) 20:05:49.65ID:75XTVAQS0
先輩方、設計に関して質問があります
GameManagerというシングルトンにリソースやシステムの参照を固めて、
各々のクラスから静的経由でアクセスする神スタイルって何かデメリットありますか?

最初はResourceManagerみたいに細分化していたんですが、規模が大きくなるにつれてあれはどのクラスが持ってたっけ?と頭がとっ散らかって来たので、
ならいっそpartialでファイル分けた神クラスを用意した方が分かりやすさはあると思ったんです
俺、何か間違えてますかね?
2020/02/01(土) 20:12:40.38ID:hqbU2d/k0
神クラスでググればいっぱい出てくるだろ
つか神クラスって単語知ってるならもう何度も見てると思うけど
自分に都合の悪いところは見ないタイプかな?
2020/02/01(土) 20:21:47.40ID:BvtANEfa0
参照を直接持つ神クラスは巨大なクラスになって破綻しそう
partialはファイルで分けるだけの問題だし

画像リソースやサウンドクラスの参照を返す、サービスロケータパターンなら有り得る

XNAだとgameクラスがこれに相当
unityのGetComponentでは、コンポーネントパターンとの組み合わせで使われてたりはする

サービスロケータにも宗教的な賛否はあるが実用的ではある
2020/02/01(土) 20:33:59.73ID:75XTVAQS0
>>722
いや、単体で完結するクラスはしっかり最小構成で切り分けてるっすよ
ただ互いが互いを参照し合うクモの巣みたいなクラス群は、
参照先を一本にまとめる方が理に適っているのではないかと思って、
デザパタでいうFacadeやMadiatorを突き詰めて行ったら、
全てがGameManagerに集約されて神クラスっぽくなったのでこれはどうなんだと思った次第で
2020/02/01(土) 20:41:23.47ID:JWECbGc70
>>721
どのクラスが持ってるか分からなくなるのはクラス分けが下手だったからだろう。
すべて神クラスに押し込んだら、こんどは逆にあるメンバが元々何のために用意したものか分からなくなったり、別のメンバと取り違えたりして、破綻するだけだと思うぞ。
2020/02/01(土) 20:42:04.40ID:XYPXtNPRM
互いに参照し合うってのがそもそもあまり良くないけどそれは別の問題としておいておくとする
参照しあうとしても必要な相互参照だけ持ってればいい
相互参照してるから神クラスにするって発想は全く繋がらない
無関係な参照を持ってたらコード読んだ人が混乱するだろ
727デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/02/01(土) 21:01:38.43ID:agRHfxgWa
>>724
プログラムと同じ寿命で複数個所からアクセスする必要があるインスタンスを
グローバル変数として提供する静的クラスは是か非か、という意味なら
個人的には支持しますね。
728デフォルトの名無しさん (アウアウウー Sa21-G+gO)
垢版 |
2020/02/01(土) 21:03:13.43ID:agRHfxgWa
いや、グローバル変数という言い方は変かw
「グローバル変数」と書くべきだった
2020/02/01(土) 21:34:07.42ID:Ar+g0K07a
>>724
実際にコードを書く人間を無視して、設計ありきで開発を統制しようとすると必ず破綻するものだ
モジュール化は基本的に開発の作業単位と一致しているのが理想
その作業単位こそがメソッドになったりクラスになったり、
開発チームや部門などもっと大きな粒度ならドメインやマイクロサービスになるわけだ
君が一人で開発していて、一緒に全部触ることが多いんだったらそれらは一箇所にあるのが自然
2020/02/02(日) 00:24:57.00ID:iIujTevhr
処理を神クラスに全部入れるのは感心しない
クラスAとBで○○をするクラスをたくさん作ってそれを神クラスが使うならまだわかる
2020/02/02(日) 00:27:26.42ID:iIujTevhr
自分ではある処理にAとBしか使わないつもりだったのにいつの間にかCを参照してて
状態によって動いたり動かなかったりするのを避けられる
2020/02/02(日) 02:17:31.38ID:a0o6eu/N0
>>730
宙ぶらりんだとxmlに出せねぇから!
2020/02/02(日) 07:46:40.77ID:x40xU8c9M
>>729
めちゃくちゃなこと言って初心者を惑わすの良くないp
2020/02/02(日) 08:08:49.36ID:ukQ22csD0
staticなクラスにロジックを集中させるのが今風
2020/02/02(日) 17:13:46.82ID:IAcIXRCS0
https://ideone.com/L4OaZ0

ユーザーが自分でカスタム書式指定文字列を入力して、
出力名を決められるコードを書きました。
switch文のところが冗長な気がしますが、
もっとよい実装方法はありますでしょうか。
2020/02/02(日) 17:49:10.92ID:PECaEDf90
オブジェクト指向が全然わかりません。助けてください。

オブジェクト指向では、クラスしか使わないのでしょうか。
そもそも関数とクラスの使い分けがわかりません。
関数、クラスどちらでも良いように思えてしまいます。

クラス内で別のクラスや関数を使うことはあるのでしょうか。
その場合、呼ぶクラスの配置は、外にすればよいのか混乱しています。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。