[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/29 16:42 / Filesize : 310 KB / Number-of Response : 1032
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



1 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 17:40:19.48 ID:oKXVP34zM.net]
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■関連スレ
C#, C♯, C#相談室 Part95
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
mevius.5ch.net/test/read.cgi/tech/1520057345/

■コードを貼る場合は↓を使いましょう。
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
referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

656 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 07:56:03.82 ID:jP3S3vDhM.net]
そのビューの入出力項目と隠し項目とユースケースを抽出するだけだよ

ログイン画面だったら
入出力項目として
・ユーザーid
・パスワード
隠し項目は無し
ユースケースは
・ログインする

なので
class LoginViewModel {
public string UserId { get; set; }
public string Password { get; set; }
public void Login() {
// login impl
}
}
こうなる

あとはViewがVMを監視するために変更通知イベントなどを実装しましょう
それだけ

657 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 07:59:07.77 ID:5QugQ9oMM.net]
>>636へのレスな↑

658 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 07:59:13.31 ID:4jNLOtgZa.net]
>>642
InitialValuesクラスがinternalなんだろ
publicに変えれば意図通りになる
言っちゃ悪いけど正しい設計とか気にするレベルじゃないと思うよ
まずは汚くてもいいから一本何か形にできるようになってから考えればいい

659 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 08:38:53.30 ID:WESx87C+0.net]
>>645
ああああああああ!
そこなのかあああ!

classってデフォルトでinternalになるんですね。
というかinternalって省略されるから気づきませんでした。
ここで半日費やしてたのでものすごく助かりました。
ありがとうございます。m(__)m

660 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 08:42:40.68 ID:WESx87C+0.net]
>>645
一本ゲーム作ったんですが、form1(初期値)、form2(ゲーム)にほとんどぶっこんだオブジェクト指向ほぼ無視プログラムになってしまったので、
ゲーム内のデータ管理とform2だけでも分離しようとして悪戦苦闘しています。

はるか昔にBasicやったぐらいなので、インスタンスの参照渡しとかその辺がうまく実装できなくて・・・。
勉強用に買った本にもインスタンスの参照渡しなんて全く書いてないし・・・。(´・ω・`)

661 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 08:47:43.78 ID:WESx87C+0.net]
あれでも

//インスタンス生成
InitialValues initialValues = new InitialValues(); 
//インスタンスの参照渡し
initialSettingForm.InitialValuesPointer = initialValues;

としているのに

フィールド”InitialValues"は割り当てらせません。常に規定値nullを返します。

となります。
実際にnull値が入ってるようで、initialSettingFormにインスタンスの参照は渡せていない模様・・・。
newしてるのになんで割り当てられませんと出るのでしょう??

662 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 08:55:56.96 ID:WESx87C+0.net]
//インスタンス生成
×InitialValues initialValues = new InitialValues(); 

this.initialValues = new InitialValues(); 
でした。すいません。

663 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 09:03:30.06 ID:WESx87C+0.net]
>>648
すいません。ゴチャゴチャしてた変数名整理したらエラー消えました。。。
お騒がせしてもうしわけありません。

664 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 09:34:05.49 ID:IdD83PdN0.net]
>>647
C++ 以外のすべての言語で、インスタンスの参照渡しだろ



665 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 10:42:46.03 ID:WESx87C+0.net]
>>651
初代MSX-Basicでゲーム作ってた頃以来のプログラミングなので(;^_^A

666 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 10:47:12.03 ID:WESx87C+0.net]
アホな質問ですが、
Class InitialValue
に初期値を全部詰め込み、必要であればコントローラから参照しているのですが、
インスタンスの参照をinitialValueとすると
initialValue.StartPointX+hoge
などインスタンスの参照がくどくて読みづらい。
いっそiVとかしたいのですが、自分にしかわからない省略は良くないと聞いたもので・・・。

initialValue.StartPointX
initValue.StartPointX
iV.StartPointX

どれが読みやすいコードでしょうか?

667 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 12:29:44.99 ID:2i/hB9LUM.net]
>>653
どれもダメ
initialValueをそのまま使わずに設定値を使うクラスにコピーして

668 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 13:05:19.58 ID:WESx87C+0.net]
>>654
えええ!

データはデータクラスで一元管理じゃないんですか?
そうしないとフォームなどからデータクラスを変更した時に、
コントロールクラス側で

669 名前:その通知を受け取って
もう一度データクラスからコントロールクラスにコピーする仕組みが必要になってきますよね。
[]
[ここ壊れてます]

670 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 14:10:34.54 ID:l7Fk1Hkl0.net]
自分がアホだと分かってる割には自分の判断を信じてるのな
アホ草

671 名前:デフォルトの名無しさん [2018/05/15(火) 14:32:03.09 ID:bP9crr2Q0.net]
勉強のためにプロが書いた大きなプログラムを見たんだが
変数が全部4桁英数字でランダムに発生させてるような文字列だった
僕ら初心者には「これ何の変数だっけ?」と分かりにくいだけなんだけど
大きなプログラムだと万が一、変数がダブったりするのを避けるためにそうするんですかね?
変数一覧表かなにか作るんですか?

672 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 14:38:53.82 ID:WESx87C+0.net]
>>656
いや、最初はコピーする仕様だったんですが、
データクラスで一元管理をするアドバイスを受けて変えたところです。

コピーするんなら元の仕様のままでよかったのかということに。

673 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 14:54:54.48 ID:oubZzl5I0.net]
>>657
変な変数名は難読化されてるだけ

674 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 15:26:01.82 ID:UPWhPqGh0.net]
>>657
当然だよ。変数使うには課長級の決済が必要。変数管理台帳ファイルに全部記録されている。



675 名前:デフォルトの名無しさん [2018/05/15(火) 17:20:29.21 ID:nA4SMkbe0.net]
>>659
そうか、公開用にリファクターしたのかな
いちいち一覧表見ないと何処につながってるか見えないなんて不便だもんね

676 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 18:44:33.69 ID:Fj6Vms3Xa.net]
>>658
変数名が妥当かどうか聞いてるんじゃなかったの?w

そのInitialValueとやらのクラスを使う実装方法が妥当かどうかは実現すべき仕様を誰も知らないので
誰にも分からないと思うよw

ローカル変数の命名に関しては、型名InitialValueをそのまま変数名にしても
何をやってるのか理解できるような文脈なら変数名をivにしても同じことでしょう。
だったら短い方がいい。

ただしローカル変数でも説明的な名前の方が適切な場合もあるので馬鹿の一つ覚えはダメ。
情況に応じて柔軟に

677 名前:デフォルトの名無しさん mailto:sage [2018/05/15(火) 19:35:30.36 ID:9ix52upSr.net]
>>660
初心者が真に受けるからやめれ

678 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 10:08:34.12 ID:5p+fPd0U0.net]
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++;
}
}
}

閾値がプラスとマイナスで条件式を変えたいんだけど、
中の処理が一回で済む書き方ってあります?

679 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 10:48:11.15 ID:6eYS9/+hd.net]
=を含まない条件式。
そして閾値というキーワード。

まとめない方がいいよ。

680 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 11:18:13.11 ID:XvxRw+U50.net]
>>664
せめてCountメソッドにしとけと思うぐらい。

681 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 11:47:06.88 ID:B7aMvtuba.net]
>>664
単に同じ処理を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))
{
  ....
}

682 名前:デフォルトの名無しさん [2018/05/16(水) 12:22:33.98 ID:CHLBL3ILa.net]
async/awaitって呼び出しのネストが深くなると、大元の

683 名前:呼び出しで波線が立ってすごくもどかしいんですが、気にしなくていいでしょうか?それとも呼び出しのやり方を見直したほうがいいのでしょうか []
[ここ壊れてます]

684 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 12:29:36.06 ID:+dukoeHCd.net]
>>668
ネスト関係なくね?



685 名前:デフォルトの名無しさん [2018/05/16(水) 13:23:25.14 ID:v6bC0eDAM.net]
>>664
カウントをCountメソッドにして引数に突っ込むラムダ式を閾値によって切り替える

686 名前:662,666 mailto:sage [2018/05/16(水) 14:23:23.94 ID:mC1mbnpn0.net]
ごめん。Count以外の処理もあるんだね。おらの回答は無視してくれ。

687 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 14:55:11.81 ID:c5ZU3C2K0.net]
dataGridViewのデータソースをBindingListにしています。
この時にデータの絞込を実装する方法はあるのでしょうか。

688 名前:デフォルトの名無しさん mailto:sage [2018/05/16(水) 19:51:48.39 ID:oU1pyBE30.net]
>>668
波線が立つのは単にasyncなメソッドをawai付けずに投げっぱなし呼び出しの警告出ているだけじゃないのか
>>669の言う通りネスト関係ない

689 名前:デフォルトの名無しさん [2018/05/17(木) 00:16:57.84 ID:OeNqnCBl0.net]
すいません。ちょっと教えてください。

//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に戻る方法を教えてください。

690 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 00:28:09.71 ID:yjgdFlmp0.net]
>>674
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;

691 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 00:35:36.78 ID:hTaKG8n8a.net]
>>674
目の前の問題を解決するよりまずインスタンスとは何かちゃんと理解した方がいいねw

692 名前:デフォルトの名無しさん [2018/05/17(木) 00:41:03.31 ID:OeNqnCBl0.net]
ありがとうございました。
大変助かりました。

693 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 00:45:08.18 ID:hTaKG8n8a.net]
もっと簡単にこれでもできるよw

var f2 = new Form2();
f2.Shown += (s, ev) => Hide();
f2.ShowDialog(this);
Show();

694 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 16:26:49.89 ID:GnA4tN+Fi]
アプリ全体の設定について、設定変更画面を作ろうとして、まずは設定そのものを1つのクラスにまとめることを考えた
そんで各設定項目を public get, private set にしようと思ったら
設定画面クラスからは各設定項目プロパティの値を書き換えられなくって困ったんだが
これってどうしたらいいのかな
コンストラクタに引数渡して各設定項目を設定することも考えたけど、
設定項目が20こほどあるからそれはやりたくない

プロジェクト分けて設定画面を別アセンブリにしてpublic get, internal setにしないといけないんかな



695 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 21:40:59.40 ID:Kw1Q24F60.net]
class Program
{
TargetOpe targetOpe = new TargetOpe();
static void Main(string[] args)
{
Target [] target= targetOpe.InitializeTarget();
Console.WriteLine(target[1].x);
}
}

Target [] target= targetOpe.InitializeTarget();の行のtargeOpeで
静的でないフィールド、メソッド、またはプロパティ 'Program.targetOpe' で、オブジェクト参照が必要です
のエラーがでます。
newしてるのになんででしょう?

696 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 21:46:08.12 ID:xJtGZ4kt0.net]
>>680
静的メソッドだから

697 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 23:37:38.13 ID:03oIkg7y0.net]
C#初心者です。
ある変数のその時々の値によって呼ぶメソッドを変えたいため初歩的にifやswitchで分岐させていたのですが、毎回分岐させるのもどうかと思い変数が変わるタイミングでデリゲートに代入して呼び出す方法を試してみました。
しかしながらパフォーマンステストを行ったところ、10程度の条件分岐であればifでメソッド呼び出し >>> デリゲートで呼び出しという結果でした。
速度を重視しつつ動的に呼び出すメソッドを変えるという場合はデリゲートではなく毎回条件分岐を行ったほうが良いということなのでしょうか?

698 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 23:45:29.87 ID:xJtGZ4kt0.net]
>>682
どんな用途で?

699 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 23:47:12.44 ID:fnhXcK68M.net]
>>682
どうでもいい
そんなミクロなレベルの速度が問題になることはない
IO一つで跡形も無く吹き飛ぶ

700 名前:デフォルトの名無しさん mailto:sage [2018/05/17(木) 23:49:51.73 ID:8WFSeAEB0.net]
くだらねーパフォーマンスとくだらねー暗号化の話題が大好きだよな

701 名前:デフォルトの名無しさん [2018/05/18(金) 01:57:49.78 ID:3OrmdyFD0.net]
パフォーマンスは重要だよ
だけど、そんなのを語る以前に、コンピュータの仕組みについての素養を極端に欠く人が多すぎるんだよ
最近のC#入門書はよく出来ていて、大抵の本が最低限の仕組みが知識が身につくようページを割いて解説してるわけだけど・・・・分かっていない人ほど読み飛ばすんだな
その結果、コンピュータの仕組みからしたらとてもありえないことを言い出す高卒様が出来上がるんだ

702 名前:デフォルトの名無しさん [2018/05/18(金) 02:22:20.29 ID:tl8rJsN/0.net]
>その結果、コンピュータの仕組みからしたらとてもありえないことを言い出す高卒様が出来上がるんだ

ありえないことなんてないだろ。頭硬すぎじゃねーの。「コンピュータはこうあるべきだ」とかに縛られてると新しい発想のソフトが生まれない。

703 名前:デフォルトの名無しさん [2018/05/18(金) 02:48:57.75 ID:3OrmdyFD0.net]
新しいものができたってのならいいけど、言うこと為すこと高卒様じゃあ・・・・

704 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 03:11:25.94 ID:eSpLSQVO0.net]
>>682
条件次第なのでなんとも言えない
インライン展開とかCPUのキャッシュとかまで関わってくる可能性がある

気にしなければいけないほどパフォーマンスを気遣うなら、JITの結果を比較したほうがいいけど、多くはそこまでするほどではない



705 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 04:39:51.09 ID:rO+HsCUo0.net]
デリゲート使ってる時点で初心者じゃないだろw

706 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 07:16:45.92 ID:tpc+hoQ/0.net]
>>690
いや、初心者がググった知識で背伸びしてるんだろ

707 名前:デフォルトの名無しさん [2018/05/18(金) 07:25:31.73 ID:40IvU0mB0.net]
デリゲートとラムダ式ってちゃうの?

708 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 07:56:30.88 ID:mGKF1mXv0.net]
>>681
ありがとうございます。
私アホでした。

709 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 08:01:25.12 ID:mGKF1mXv0.net]
public class TargetOperation
{
Target[] target = new Target[Constants.MaximumNumberOfTarget];

public Target[] InitializeTarget()
{
for (int i = 0; i < Constants.MaximumNumberOfTarget; i++)
{
target[i] = new Target();
target[i].x = 100;
}
}
return target;
}

710 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 08:05:21.79 ID:mGKF1mXv0.net]
最後の行で
クラス、構造体、またはインターフェイス メンバーの宣言でトークン 'return' が無効です。
です。
またアホなことをしてそうな気がしますが、昨夜からわからず・・・。

711 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 08:09:16.96 ID:WjwLG2oV0.net]
>>694
}
}
return target;
}
じゃなくて
}
return target;
}
}
じゃね

712 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 08:15:13.01 ID:SuBLVM61M.net]
>>682
サンプルコードと結果貼れよ

713 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 08:34:05.30 ID:Yy5wJYpea.net]
デリゲート使うくらいならストラテジパターン使うけど

714 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 09:57:58.57 ID:crDPuGzZM.net]
>>688
こんにちは猿の学校卒様



715 名前:デフォルトの名無しさん [2018/05/18(金) 22:42:24.82 ID:6iumh9Vb0.net]
DataGridViewのセルのValueを取得すると、既定の型がObject型なんですが、既定の型をstringに変更する方法はありますか?
今はConvert.ToStringで変換してるんですが、記述数が多くなりすぎて参ってます。

716 名前:デフォルトの名無しさん mailto:sage [2018/05/18(金) 22:48:37.44 ID:/dMxgLqhM.net]
As string

717 名前:デフォルトの名無しさん [2018/05/19(土) 01:23:31.00 ID:5ZvwKnWja.net]
C#初心者でフォームアプリを作っているんですが
例えばあるクラスAが非同期で外部機器を延々ポーリングしていて、トリガーが発生したらクラスBの処理を行いたいといった場合
・クラスAにクラスBのインスタンスを渡して、クラスBのメソッドを呼び出す
・クラスAに宣言したデリゲート(evemt?)にクラスBのメソッドをコールバック関数として登録し、クラスAはデリゲートを実行する
どちらが一般的なコーディングなんでしょうか
後者だと複数実行したい処理があるとかなり冗長な気がするんですが、他にセオリーあれば教えて頂きたいです
よろしくお願いします

718 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 01:32:36.76 ID:VIvIbG0Fa.net]
女?

719 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 01:53:30.54 ID:ZECHChrda.net]
>>702
前者
デリゲートは現段階で呼び出し先が定まってなくて後でアドホックに処理を差し込みたいときに使うも
最初から呼ぶ相手が決まってるならそんなまどろっこしいことをしないで直接メソッドを呼べばよい

720 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:13:21.77 ID:FwiHY2dca.net]
>>702
騙されちゃダメwww
そういうのはイベントで実装する。

何故か?
前者で作っちゃったら、その外部デバイスをポーリングしてるクラス(普通はそのデバイスの名前を付けると思うけど)、
前者で作っちゃったら他に流用できないよ

721 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:22:01.39 ID:6pEEqPiCM.net]
>>705
YAGNI
もしそれが必要になったらそのとき変更すればいい
そして、ほとんどの場合において結局必要にならない
職業プログラマじゃないとアプリのコードを目にする機会って少ないから、
.NET Framework自体のクラスのような不特定多数向けの設計を真似してしまいがち
一般に、アプリケーションプログラミングにおいては無駄な拡張性は極力組み込まずに必要最小限のコードでコンパクトに実装するのが正解
そのほうが結果的に変更時のコストも小さくなるよ

722 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:27:56.45 ID:FwiHY2dca.net]
>>706
YAGNIなんか関係ない
アホか

必要もない仕様変更を想定して寛容に複雑にするのは愚かだが、
抽象度の高い(つまり汎用性も高い)方のクラスにより具体的(つまりそのプログラムでしか利用できない)クラスの
参照を持たせて依存させるなんてもっと愚かだ

723 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:32:39.74 ID:6pEEqPiCM.net]
>>707
自己矛盾してるね
依存させるのが何故愚かだと思う?
理由は、「必要もない(質問者のレスにない)仕様変更を想定しているから」に他ならないだろ

724 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:38:49.87 ID:FwiHY2dca.net]
>>708
たぶん言っても無駄な人だと思うけど、普通はViewをModelに依存させるように作るのであって
ModelをViewに依存させない(Modelの参照をViewが持ってはダメ)なのと同じ。

こんな基本が分からない奴が回答する側に回ってはダメだと思うw



725 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:40:16.65 ID:FwiHY2dca.net]
>>709
いかん酔っぱらって逆を書いちまったw

× (Modelの参照をViewが持ってはダメ)
〇 (Viewの参照をModelが持ってはダメ)

726 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:40:41.00 ID:6pEEqPiCM.net]
あと、仮に>>705の想定が正しいとするなら、抽象化すべきはクラスBではなくAの方でしょ
例えばAのデバイス依存部分だけをIDeviceインターフェイスとして切り出して委譲するとかね
Aにイベントを持たせるんだと、別のデバイスを監視するクラスCができたら
AのイベントとCのイベントをそれぞれ個別にイベントハンドリングしなきゃいけなくなる
ちゃんと頭使おうね

727 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:47:51.94 ID:6pEEqPiCM.net]
>>710
揚げ足取るようで悪いけど、Viewの参照をModelが持つこと自体は何の問題もないよ
というか、そう

728 名前:オないとMからVへの変化通知が実現できない
イベントを使うにしても結局参照は持ってるよ
MVPといって、IViewのようなインターフェイスを通してMからVを呼ぶパターンもあるね
なるべく疎にしたいのは型同士の依存関係の話で、参照するのがダメなわけじゃない
[]
[ここ壊れてます]

729 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 02:58:10.85 ID:FwiHY2dca.net]
>>711
そういうのをYAGNIっていうんだよw
本当に何もわかってないねお宅w

730 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 03:03:16.45 ID:FwiHY2dca.net]
まあ質問者の>>702に言うけど、実際書いてみれば
イベントで実装した方がずっとコンパクトかつ可読的に書けることが分かると思うよ。

Bが仮にAでしか利用しないクラスだとしても、普通はAはイベントを発行するだけ、
Bはそのイベントを受信して何か処理をする、ってやった方がずっと分かりやすい

731 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 03:21:21.26 ID:ZECHChrda.net]
メソッド一つだけならイベントでもいいけど、少なくとも>>702はメソッドが複数あるときもあると言ってるんだからイベントは不適切でしょ
インターフェイスで纏めたほうが扱いやすい
あえてそこにインターフェイスを噛ませる必要があるかどうかはYAGNIの問題だが、それとはまた別の観点の判断だ

732 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 06:03:27.91 ID:uNgfR/HH0.net]
プログラムで使用するテキストデータを、excelで管理しています
closecXMLを使ってアクセスしていて、これ自体は無事に実装できました

テストが一通り終わって、テキストデータも確定したので、データの散逸や
改ざんを防ぐために実行ファイルに埋め込みたいのですが、リソースとして
取り扱うことってできないでしょうか

具体的には、

workbook = new XLWorkbook(filename);

として開いているところがあるのですが、このfilenameにリソースファイルの
名前を当てることができないのか調べています

string filename = "Properties.Resources.textdata.xlsx";

としてアクセスできれば簡単だと思っていたのですが、そうはいきませんでした

733 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 06:14:14.58 ID:gOuRua2dM.net]
ユーザー定義リソースは何でも書けるよ。

734 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 06:37:08.02 ID:uNgfR/HH0.net]
具体的にどういう手順を踏めばよいのでしょう?
excelデータは1,000行以上あるので、取り込みではなく手入力が必要だと
ちょっと切ないです
でももう修正しないもの(修正するとしても部分的)ですから、機械的に
データを移行できるのであればそれでも問題ありません



735 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 07:47:44.04 ID:gOuRua2dM.net]
静的に呼びだすなら5つのAPI
FindResource()
LoadResource()
SizeofResource()
LockResource()
FreeResource()
動的に更新するなら更に3つ
BeginUpdateResource()
EndUpdateResource()
UpdateResource()

736 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 07:53:26.18 ID:z3BmCHYgM.net]
>>706
こういう奴が頻繁に現れるのを見るとYAGNIの罪は大きいなって思う

737 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 07:55:26.69 ID:7BFPa/Jf0.net]
別に複数でもそんな多くなければイベントでも問題ないんじゃねぇかな

738 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 08:03:52.08 ID:uNgfR/HH0.net]
>>719
ありがとうございます、それぞれのAPIについて調べてみます

739 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 08:13:32.92 ID:7BFPa/Jf0.net]
結局バランスの問題だな。もちろん人によってバランス違うけど。
イベントによって結果再利用性あがるけど、
>イベントで実装した方がずっとコンパクトかつ可読的に書けることが分かると思うよ。
の通り、可読性の観点からしてもイベントの方が分かりやすいと思う。

これぐらいもYAGNIとかいってるようじゃ、極端すぎてバランス感覚おかしいんじゃねぇかな。

740 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 09:36:48.03 ID:ZECHChrda.net]
>>723
極端なのは君だと思うぞ
まさかクラス間の依存関係に全部いちいちイベントを噛ましてるってわけではないよね
その上で、この例において特にイベントを使うのが適切だと判断した合理的な根拠は?
少なくとも>>702のレスからはそれを具体的に読み取れないから、根拠のない仮定に基づいた無駄な拡張性だと言ってるんだけど

741 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 10:02:26.30 ID:35k9lSzB0.net]
>>696
( ゚д゚)
ありがとうございます。
その通りです。
一晩見直したのに気づかなかった・・・。

742 名前:デフォルトの名無しさん [2018/05/19(土) 10:47:04.32 ID:zmVeGZ3Ia.net]
>>702です
みなさん色々なご意見ありがとうございます
基本的にはイベント等で疎結合にしたクラス作りが望ましいが、ケースバイケースで状況に応じてどちらの実装でも問題はないといったところでしょうか
レスして頂いた内容は非常に参考になり、まさにその両者のいい分で自分もどちらが最適解なのか悩んでいましたが、結局状況を判断出来る私が決めて実装するしかないのかなと思いました
途中インターフェースをかましてすれば良いとのレスがありましたが、どういった実装をすればいいのか全くわかりませんでした。この方法でも検討してみたいので、すみませんが具体的な実装を教えて頂けないでしょうか

743 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 11:44:50.68 ID:mNRmauI8a.net]
>>726
interface IAlert {
void Set(Severity severity);
void Unset();
}
たとえば、あるアラートに対してこういうインターフェイスを定義する
クラスAはこれをコンストラクタで受け取り、温度センサーの値が閾値を超えたら危険度に応じた引数でSetメソッドを呼ぶ
温度が低下して閾値を割ったらUnsetを呼んで解除する
このIAlertインターフェイスを、具体的な実装、たとえばパトランプを操作するクラスが実装するわけ
こうしておけば、
パトランプじゃなくて画面でアラート状態を表示したくなったときにAに手を入れずにIAlertを実装するだけで済む
もちろん、パトランプしか想定しなくていいなら直接パトランプクラスのメソッドを呼んでもいいし、Unsetが必要ないならイベントでもいいかもね
ただしイベントの場合はBからAへの密結合が発生するとか、それを避けるなら追加で橋渡しのコードが都度必要になるといった懸念点もある

744 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 11:49:58.15 ID:F9kKaYLV0.net]
>>700
拡張メソッドでも定義すれば



745 名前:デフォルトの名無しさん [2018/05/19(土) 12:01:43.59 ID:hl18fyg5a.net]
>>727
早速ありがとうございます
ちょっとまだピンときませんが、じっくり検討してみたいと思います

746 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 12:20:10.98 ID:35k9lSzB0.net]
BASICしか経験がないど素人がC#始めたんだけど、
クラス間の参照の受け渡しというのが難しいです・・・。

クラスの参照を配列に入れて、それを受け渡しするとか動くコードはなんとかかけてるんだけど、
自分で一体何をしているのか分からなくなる時がある。

747 名前:デフォルトの名無しさん [2018/05/19(土) 13:04:35.48 ID:uWI+Vuzc0.net]
>>730
真っ先に直さなきゃならないのは、「スコープの広い配列にインスタンスを入れておけば、どこからでも全てのデータにすぐにアクセスできていいじゃん!」と思っちゃう点でさあ
C#のスキルの無さから設計までメチャクチャにしてるんじゃないのかねえ

748 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 13:15:00.73 ID:m/ZPa8pNM.net]
BASIC系って悪い習慣を覚えちゃうよね
特にVBAはひどい

749 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 13:27:26.49 ID:m/ZPa8pNM.net]
>>727
それだと温度センサーがアラートをコントロールしているように解釈される
常識的に考えてアラートのコントロールは温度センサーの仕事ではないだろう
これは名前の問題であってインターフェースよりイベントを使えと言ってるわけではない

750 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 14:08:44.26 ID:35k9lSzB0.net]
>>731
その通りです。
すべての変数をどこからでもアクセスしたい衝動にかられます。

Aのクラスの機能がA1とA2に分化できるから分けようと思うと、
AはCを参照してたからA1とA2両方にCのインスタンス参照を渡そうとなり、
結局機能は分けれたものの、どのクラスがどのクラスを参照してるのかがよくわからなくなってきました。

751 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 14:11:58.71 ID:35k9lSzB0.net]
値1、2個を渡すのは簡単なんですけど、
クラスのインスタンスを100個つくるためにその参照を配列にいれる
参照の入った配列をreturnで返す
とかしてるとなんの値をいじってるのかわけわかめです。

これまで値と参照の区別をして思考してこなかったからなのかなぁ。

752 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 14:31:05.11 ID:m/ZPa8pNM.net]
>>735
オブジェクト指向で参照を共有することは少ない
共有するとしてもイミュータブル、ステートレスにして共有によるデメリットを消した上で共有する

長時間生存するインスタンスがあちこち参照しあって状態を刻々と変化させていくような設計が最悪のパターン

753 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 15:29:17.89 ID:7BFPa/Jf0.net]
>>724
それは君が経験値不足なだけ。>>702である程度は想像できる。

754 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 16:13:13.77 ID:t/qQFhE80.net]
休みだってのに暇な奴ら



755 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 16:13:20.90 ID:35k9lSzB0.net]
>>736
なるほどCを参照しているA1、A2はCと独立したオブジェクトじゃなくなってしまいますものね。

756 名前:デフォルトの名無しさん mailto:sage [2018/05/19(土) 16:20:14.69 ID:35k9lSzB0.net]
Target[] target = new Target[Constants.MaximumNumberOfTarget];

public Target[] InitializeTarget()
{
for (int i = 0; i < Constants.MaximumNumberOfTarget; i++)
{
target[i] = new Target();
target[i].x = 100;
target[i].y = 100;
  }
}

こういうふうにForm1のクラスでターゲットの座標100個発生させて表示させます。






[ 続きを読む ] / [ 携帯版 ]

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

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