ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part136
http://mevius.5ch.net/test/read.cgi/tech/1520057345/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured アプリケーションスコープにするとアプリから書き込みできないよ >>571
でもアクセスの速度違うときあるからね。 すいません。
初心者なのでこちらに移動してきました。
MVC的な設計で
初期設定値を入力するフォーム
↓
初期設定値を格納するクラス
というのを作りたいのですが、
A.
クラス側に各変数のプロパティを作成
フォームからプロパティを介してクラスの変数に値を代入
B.
クラス側にフォームの初期値を取りに行くメソッドを作成
クラスからメソッドを実行してフォームに値を取りに行く
のどちらが良いのでしょう?
自分ではAの方がよさそうな気がするのですが、一般的な設計としてこうするというのがあったら教えてください。 ケツの穴から手をつっこんで奥歯をがたがたみたいなBよりA >>574
どっちでも動きゃいいだろ
さっさと完成させろよ >>574
// form
void btnSaveInitialSettings_Click(object sender, EventArgs e) {
try { this.SaveInitialSettings(); }
catch(...) { ... }
}
void SaveInitialSettings() {
var initialSettings = this.GetInitialSettings();
var reaction =
this.initialSettingsController.SaveInitialSettings(initialSettings);
reaction?.Invoke(this);
}
// controller
Action<IInitialSettingsView> SaveInitialSettings(InitialSettings initialSettings) {
this.initialSettingsService.SaveInitialSettings(initialSettings);
return view => view.Refresh();
} 初心者は出来上がってから検討すりゃいいんだよ。
つうか、プロ目指してるなら、先ずは完成させる癖を付けないとな。
万年アマチュアでいいのなら些末な問題で盛り上がればいいさ。 まず終わらせろ、Facebookのにいちゃんも言ってたべな。 Facebookにいちゃんが誰かわからんがそいつが言うまず終わらせろ、とお前が考えるまず終わらせろは別物だと思うぞ
ユニットテストとリファクタリング込みでまず終わらせろ、って言ってるならマトモだけど、将来のことなにも考えずまず終わらせろって言うならただの害悪 >>580
リファクタリングなんか完成した後にバージョンアップする機会があったらやればいいんだよ。 将来が有るかどうかなんて、売れてから考えろw
タイムイズマネーだ。無駄なリソース費やしてる暇が会ったら次の案件片付けろ。 >>581
そうだよね
エッチな絵が一枚も表示されないのにリピーターがいることを想定してる
なんてピンボケもいいとこだよね
割とマジで 仕様通りの動きだけど汚いコードと
仕様通りの動きじゃないけど綺麗なコード
を同じ時間で仕上げたとして、どっちが優れているかと言えば前者だよな >>584
そりゃ仕様満たしていないなら比較以前の問題だわな
仕様満たして完成までの期間で比較とかならともかく まあ、熟練者になれば、素早く仕様通りのコードを綺麗に仕上げて来るからな。
初心者は先ず動くコード、次に仕様通り、最後に綺麗なコードでいいよ。
時間掛かるのはこの際問題にしないw リピーターが多い汚いコードと
リピーターが少ない綺麗なコード
後者はゴミだよね 世の中の多くのバカが勘違いしてるんだけど
綺麗なコード==間違えやすい製造に時間がかかるコード
じゃないんだよね
綺麗なコードはバグが少ないし製造も早い
汚くても動くコードを早く書け!なんて言ってるやつは根本的に何かがズレてる
そんな方針でコーディングしたら汚くて動かないコードを時間をかけて作る羽目になる 洗練された華麗なコードとインデント揃っただけの綺麗なコードを混同してるばか発見 >>574
UI(Form)がモデル(何か仕事をするクラス)の参照を持つのは問題ないが、
逆は良くない。理由は、
(1) 役割分担があいまいになる
厨房の人間が1分おきにウェイターに注文を確認するのは適切な役割分担と言えるか?
(2) つぶしがきかない
Formの参照を握ってFormのメンバーを操作するクラスは、UIをWPFやUWPに
変更しても使いまわしできるか? >>577
一読で理解できる知識がないのですが、勉強してみます。
ありがとうございます。 >>590
UIがデータ格納用クラスのインスタンスを生成
UIがプロパティを介してデータ格納用クラスの変数に代入
UIがコントローラにデータ格納用クラスのインスタンスを渡す
みたいな感じでよろしいでしょうか? >>592
>UIがデータ格納用クラスのインスタンスを生成
誰がモデルのインスタンスを生成するかはケースバイケースだしどうでもよろしい
>UIがプロパティを介してデータ格納用クラスの変数に代入
重箱の隅をつつくようだが、オブジェクトのプロパティやメソッドを操作する時に
「データ格納用クラスの変数に代入 」なんていう内部の実装を意識する必要はない。
必要はない、というか意識しなくても使えるように作るのがカプセル化。
>UIがコントローラにデータ格納用クラスのインスタンスを渡す
俺がMVCを理解してないだけの可能性もあるが、少なくともWindows Formでは
VとCを分けたりしないのが普通と思う。コントローラなんてイラネ 話蒸し返して悪いんだが、xmlシリアライザーって今使ってるとやばいの?業務アプリの設定ファイルほぼこれで今までやってたんだが。。
とりあえず今やってる案件JSONで見直してみるか
一人で開発やってるとついついこういうのに遅れがちになるなぁ csvとJSONなら圧倒的に後者のがメリットあるけど、
xmlとJSONなら規模がでかくない限りどっちでも良いや >>594
業務ドカタ系でJSONなんかほとんど無いから安心しろ
客サイドは情シスですらJSON何それとか平気で言いやがるしOSSのライブラリが必要なのもネック >>596
Excelで編集できるできないって違いもあるのに
どこが「圧倒的」なの?
根拠もない主張を強く推すなよ
願望だろ?お前の PCのiTunesって曲の情報管理全部XMLだよな
どうにかならんのか
https://i.imgur.com/zaooQAM.jpg Ant, Maven とか、Java系は、XML。
Android 画面の設定ファイルとか
Windows でも、XAML で画面設定する
プロジェクトの設定ファイルも
JSON を設定ファイルに使うのは、JavaScript を使ったもの。
例えば、Node.js を含んだ、VS Code
他には、プログラミング言語自体が設定ファイルになるもの。
Ruby, Groovy, Haxe >>594
え?全然やばくないよ
むしろ安定した手堅い選択肢と言っていい
JSONを設定に使う製品はむしろ少数派 >>600
>JSON を設定ファイルに使うのは、JavaScript を使ったもの
最近のC#もそうですが >>594
ヤバイってどういう状況?
殺されるの? >>602
project構成は不評で結局xmlに戻ったね
ASP.NETのappsettingsはボイラープレートがjsonになってるけどxmlやiniもサポートされてる 素のJSONはコメントが使えないので設定ファイルには使い辛い。 川俣さんのことを馬鹿にする人が2chには多いけど、この記事の趣旨は正しいと思う
http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_18/extremecs_18_02.html
特定の技術への信仰と「俺スゲー」っていう間抜けな自己陶酔が結びついてる奴ってよくいるし、
このスレにも時々そんなのが出るけど、そういう奴のいうことは真に受けない方がいいですw つか業務で使うなら余程のことがない限り枯れた技術の方が安定する COBOLは実際優れてるんだよなあ
低品質なPGでもほぼ完璧に見積工数通りに仕上がるし、バグもほとんど出ない
金持ちな客からきっちり工数見合いで金取れるならSIerにとってこれほど好都合な言語はない 工数が低減できるかどうかよりも見積が精確にできることの方が管理者にとっては重要ってわけだね 大体この時間にABENDしますって
異常停止をルーチンワーク化して運用している所があったな 現場運用だと稀によくある
開発側がそれを織り込んじゃダメだけど >>594だけど
蒸し返した話にレスくれてありがとう
自分の用途にはxmlでも問題なさそうでとりあえず安心した SVGやMathMLのような外部の名前区間が出てくるとか、Xamlのようにかっちりしたものを書きたい場合はXMLが有利
文字列や数値しか出てこないような簡単な構造ならJSONの方が便利なことも多い。
Trueなのかtrueなのかとか考えなくても良くて、エディタがサポートしてくれるし、エスケープの仕様とかがシンプルで、ファイルも小さい。逆に言うとその程度なのでわざわざ切り替えるほどでもないとは思う >>593
VCわけないんですか。
うーん・・・。
いろいろな設計方法があるということですね。
インスタンスの生成順として
A→B
A→C
とAからCにBのインスタンスを渡す方法は分かるのですが、
C→A
A→B
とインスタンスを生成した時、CにBのインスタンスを返すことって可能なのでしょうか? >>619
「返す」ことにこだわりがあるのなら結構難しい
そこにこだわらず、単にCからbを扱えれば良いのならa.bでアクセス可能だろう >>619
何でわざわざ話を複雑にするの?
class C
{
A a;
B b;
public C()
{
a = new A(this);
b = new B(a);
}
}
例えばこれじゃダメなの? DIコンテナとか諸々のイディオムを知らない初心者だからまぁしゃあない
MVCでもMVVMでもいいからチュートリアル的なものをひとつやっとくとだいぶ違うとは思う >>622
まず「返す」の意味が分からないんだよな
>>619
何のためにその実装が必要なのか、まずはそっちから
普通は複数の派生インスタンス扱いたいのならどこかでまとめて管理する方が楽
横に伸ばしていくんじゃなく中心から引っ張っていく形 馬鹿なこと考えないでジャンケンゲームでも作ってろって >>619
今時のマルチレイヤな設計ってのは、「汚い場所」をどこかに決めて、そこが依存関係の解決を一手に引き受けるようにするんだよ
で、他の部分は「汚い場所」に直接依存しないようにするの
>>623の例でいうと、Cを「汚い場所」とするならAがCを直接参照するのは良くなくて、
AからCのメソッドをコールバックしたいんだったらインターフェイスを介して呼ぶようにしたりする
汚い場所をどこにするかだけど、フォームアプリならフォームだったり、Webアプリならコントローラだったり
処理の起点となり、かつ、どのみち単体テストが困難な場所を選ぶのが一般的だ なんだか要領を得ないからわからないけど
Bを操作するメソッドをAに用意してCがA経由でBを操作するのはだめなのか? MVC をわかってないような奴に、何も教えられない
まず、無料のRails チュートリアルで、MVC webアプリの設計から学べ Railsってモデルがフォームの構造に依存するからなあ
あんなのAccessのフォームなんかと同レベルだよ
変な癖がつくから初心者には適さない >>632
何から始めても理解できない
分離するどころかやればやるほど結合が強くなる現実に打ちのめされるだけ やってみたけど難し過ぎて手に負えなかったってことだね。 >>632
Vue.jsあたりかな
XAMLはテンプレートやコマンドバインディングが複雑すぎて本質を掴みづらい
WebのMVVM系フレームワークのほうがずっと見通しが良くてMVVMの本質を素直に実装してる まずはUNDOなりマクロを実装するのに何が必要か
考えると、「C」の動きが見えて来るかと思うけどね
GOFの最初の章にも説明はあるよ >>623
アクセシビリティに一貫性がありませんってエラーが…
internalでインスタンス生成するとOKなんですが、フォームクラスはpublicで宣言してるんですけど。 >>625
ご指摘を受けてメインのフォーム上でインスタンス管理しようとしているのですが、
アクセシビリティの一貫性というエラーが出てきています。
public partial class ExaminationForm : Form
{
public InitialSettingForm initialSettingForm;
public InitialValues initialValues;
で最後の行にアクセシビリティ一貫性のエラーが・・・。
3行目のpublicをinternalにするとエラー消えるのですがなんでだろう。 そのビューの入出力項目と隠し項目とユースケースを抽出するだけだよ
ログイン画面だったら
入出力項目として
・ユーザーid
・パスワード
隠し項目は無し
ユースケースは
・ログインする
なので
class LoginViewModel {
public string UserId { get; set; }
public string Password { get; set; }
public void Login() {
// login impl
}
}
こうなる
あとはViewがVMを監視するために変更通知イベントなどを実装しましょう
それだけ >>638
InitialValuesクラスがinternalなんだろ
publicに変えれば意図通りになる
言っちゃ悪いけど正しい設計とか気にするレベルじゃないと思うよ
まずは汚くてもいいから一本何か形にできるようになってから考えればいい >>641
ああああああああ!
そこなのかあああ!
classってデフォルトでinternalになるんですね。
というかinternalって省略されるから気づきませんでした。
ここで半日費やしてたのでものすごく助かりました。
ありがとうございます。m(__)m >>641
一本ゲーム作ったんですが、form1(初期値)、form2(ゲーム)にほとんどぶっこんだオブジェクト指向ほぼ無視プログラムになってしまったので、
ゲーム内のデータ管理とform2だけでも分離しようとして悪戦苦闘しています。
はるか昔にBasicやったぐらいなので、インスタンスの参照渡しとかその辺がうまく実装できなくて・・・。
勉強用に買った本にもインスタンスの参照渡しなんて全く書いてないし・・・。(´・ω・`) あれでも
//インスタンス生成
InitialValues initialValues = new InitialValues();
//インスタンスの参照渡し
initialSettingForm.InitialValuesPointer = initialValues;
としているのに
フィールド”InitialValues"は割り当てらせません。常に規定値nullを返します。
となります。
実際にnull値が入ってるようで、initialSettingFormにインスタンスの参照は渡せていない模様・・・。
newしてるのになんで割り当てられませんと出るのでしょう?? //インスタンス生成
×InitialValues initialValues = new InitialValues();
↓
this.initialValues = new InitialValues();
でした。すいません。 >>644
すいません。ゴチャゴチャしてた変数名整理したらエラー消えました。。。
お騒がせしてもうしわけありません。 >>643
C++ 以外のすべての言語で、インスタンスの参照渡しだろ >>647
初代MSX-Basicでゲーム作ってた頃以来のプログラミングなので(;^_^A アホな質問ですが、
Class InitialValue
に初期値を全部詰め込み、必要であればコントローラから参照しているのですが、
インスタンスの参照をinitialValueとすると
initialValue.StartPointX+hoge
などインスタンスの参照がくどくて読みづらい。
いっそiVとかしたいのですが、自分にしかわからない省略は良くないと聞いたもので・・・。
initialValue.StartPointX
initValue.StartPointX
iV.StartPointX
どれが読みやすいコードでしょうか? >>649
どれもダメ
initialValueをそのまま使わずに設定値を使うクラスにコピーして >>650
えええ!
データはデータクラスで一元管理じゃないんですか?
そうしないとフォームなどからデータクラスを変更した時に、
コントロールクラス側でその通知を受け取って
もう一度データクラスからコントロールクラスにコピーする仕組みが必要になってきますよね。 自分がアホだと分かってる割には自分の判断を信じてるのな
アホ草 勉強のためにプロが書いた大きなプログラムを見たんだが
変数が全部4桁英数字でランダムに発生させてるような文字列だった
僕ら初心者には「これ何の変数だっけ?」と分かりにくいだけなんだけど
大きなプログラムだと万が一、変数がダブったりするのを避けるためにそうするんですかね?
変数一覧表かなにか作るんですか? >>652
いや、最初はコピーする仕様だったんですが、
データクラスで一元管理をするアドバイスを受けて変えたところです。
コピーするんなら元の仕様のままでよかったのかということに。 >>653
当然だよ。変数使うには課長級の決済が必要。変数管理台帳ファイルに全部記録されている。 >>655
そうか、公開用にリファクターしたのかな
いちいち一覧表見ないと何処につながってるか見えないなんて不便だもんね >>654
変数名が妥当かどうか聞いてるんじゃなかったの?w
そのInitialValueとやらのクラスを使う実装方法が妥当かどうかは実現すべき仕様を誰も知らないので
誰にも分からないと思うよw
ローカル変数の命名に関しては、型名InitialValueをそのまま変数名にしても
何をやってるのか理解できるような文脈なら変数名をivにしても同じことでしょう。
だったら短い方がいい。
ただしローカル変数でも説明的な名前の方が適切な場合もあるので馬鹿の一つ覚えはダメ。
情況に応じて柔軟に int[] intData = new int[10];
int intThread = -3; // 閾値
int intCount = 0;
for (int i = 0; i < intData.Length; i++)
{
if (intThread >= 0)
{
if (intData[i] > intThread)
{
// 処理
intCount++;
}
}
else if (intThread < 0)
{
if (intData[i] < intThread)
{
// 処理
intCount++;
}
}
}
閾値がプラスとマイナスで条件式を変えたいんだけど、
中の処理が一回で済む書き方ってあります? =を含まない条件式。
そして閾値というキーワード。
まとめない方がいいよ。 >>660
せめてCountメソッドにしとけと思うぐらい。 >>660
単に同じ処理を2回書く無駄をなくしたいだけなら&&と||を使って
条件式をまとめるだけ
if((threshold >= 0 && x > threshold) || (threshold < 0 && x < threshold))
{
....
}
値が不変のはずのthresholdの符号をループで毎回評価する無駄が許せないなら
Func<int, bool> predicate = x => x > threshold;
if (threshold < 0) predicate = x => x < thredhold;
....
if (predicate(x))
{
....
} async/awaitって呼び出しのネストが深くなると、大元の呼び出しで波線が立ってすごくもどかしいんですが、気にしなくていいでしょうか?それとも呼び出しのやり方を見直したほうがいいのでしょうか >>660
カウントをCountメソッドにして引数に突っ込むラムダ式を閾値によって切り替える ごめん。Count以外の処理もあるんだね。おらの回答は無視してくれ。 dataGridViewのデータソースをBindingListにしています。
この時にデータの絞込を実装する方法はあるのでしょうか。 >>664
波線が立つのは単にasyncなメソッドをawai付けずに投げっぱなし呼び出しの警告出ているだけじゃないのか
>>665の言う通りネスト関係ない すいません。ちょっと教えてください。
//Form1にて
Form2 f = new Form2();
f.show();
this.visible=false;
としてForm2を開いて、Form1を非表示にします。
//Form2にて
Form1 f = new Form1();
f.visible=true;
this.visible=false;
としてForm1に戻った場合、先程form1で入力した内容が消えてしまいます。
form1の内容を消さずにform2からform1に戻る方法を教えてください。 >>670
Form1 f = 「new」 Form1();
新しいForm1を作ったんだから前のはVisible=false;のままで表示されていない
例えばこうする
//Form1にて
Form2 f = new Form2(this);//Form2のコンストラクタの引数にForm1の参照を渡す
f.show();
this.visible=false;
//Form2にて
private Form1 form1;
//コンストラクタ
public Form2(Form1 f)
{
InitializeComponent();
form1=f;
}
//戻る処理
form1.Visible=true;
this.Visible=false; ■ このスレッドは過去ログ倉庫に格納されています