ふらっと C#,C♯,C#(初心者用) Part129 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part128
http://mevius.2ch.net/test/read.cgi/tech/1493730340/
■関連スレ
C#, C♯, C#相談室 Part94 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1492843013/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
---
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 多重継承するとメモリレイアウトがおかしくなって効率悪すぎ
↓
じゃあ継承はひとつだけにしようか
↓
でもフィールドなければ問題なくね?
↓
ならフィールドなしなら多重継承していいよ
↓
悪く無いねっていうかメソッド実装も衝突するから要らなくないか
↓
なんだこれ凄くイイぞコーディングがめちゃ捗る
↓
あまりにも便利だから名前付けて言語機能にしよう
↓
インターフェース誕生 多重継承が捨てられたのはそんな理由じゃない
ググってから出直せ >>900
javaのデフォルト実装についてコメント願います 結局テストするときはマトリックス書いて全部抜けが無いようにしなきゃいけないからインターフェイスなんて邪魔だけどな
継承なんてありがたがってるやつはまともなテストなんか要求されないゴミ環境にいるとしか考えられない >>907
まともなテストをしたことがない人って不思議とみんなこういうこと言うよね >>908
そうかな?
じゃあインターフェイスから派生してる処理は全部でいくつあってそれぞれいつ呼ばれるの?
一覧になってる?
こんな当たり前のこと聞かれても
本能に任せて作っちゃったもんだから
全く説明できないでしょ?
じゃ、明日までに一覧作ってテストやり直してくれるかなぁ?
って言われちゃうよ 単純に作るだけのアマチュアから脱却しなくてはならない >>909
そんなのすぐにわかるよ
わからないならそれはお前にスキルがないだけだろ
というか君の認識は全く逆だよ
そういった「機能が幾つあるのか」「どんな時に使われるのか」ってのを明確にするためにインターフェースを使うんだろ
インターフェースを使ったらそれがわからなくなるという発言は全くもって理解が足りてない証拠
インターフェースも使わずに密結合しまくった汚いシステムだと
そもそも「どっからどこまでが1つの機能なの?」って問いに明確に答えられない
そして境界がわからないから、「幾つあるか」も数えられないし
それが「どんな時にどれが有効になるのか」もわからない(どれ?という問いは当然だけどそれぞれが明確に区別できる前提がないと答えられない) さらにいうと
インターフェースで疎結合を維持すれば自動テストを構築できる
そうすれば明日までと言わずに1時間もあれば回帰テストをやり直せる
インターフェースを使わないガチガチに密結合したシステムではこうはいかない
テストだけでも丸一日、下手すれば数日はかかる >>911
え?明確になる?
はぁ?
swich caseで並べてあるときよりも?
俺には動かしてみないとどれが死にコードでどれが生きてんだかわかんねぇよw ここから俺とお前で
(*゚∀゚)明確になるなる!
(*゚∀゚)明確にならないならない!
(*゚∀゚)なるなる!
(*゚∀゚)ならないならない!
って1000レスぐらい想定www >>914
ほらね
やっぱりスキルがないじゃん
適当なコードを書くからわからなくなるんでしょ switchでその手の分岐かますと汚くて保守性低いコードになるから嫌い タイプコードswitchはたいていの場合おなじようなswitchをコードのあらゆるところにばら撒いてどこで何やってんだ状態(いわゆるスイッチヘル)に陥る
インターフェースを使うとそのようなswitchは一箇所にまとめられたり、設定ファイルに抽出されたり、コーディング規約に従って動作するようになり、誰が見てもはっきりとどんな時のどの実装が使われるかを理解できるようになる
このように構造化されていれば機能一覧や使用条件などをリアルタイムに出力することすらできる
switchとの格闘で費やしていた無駄な時間をバカンスに割当てることもできるのだ >>918
でも間違いが無いよね?
実行する場所ですべてのパターンがひと目でわかる
インターフェイスだとどう?
全部で何パターン処理があるの? >>919
じゃあ、ホイ
unko.flyhigh();
いくつあるか言ってみろよ
お前が判断に必要な情報を俺が出していってやるよwww >>920
間違いがあるのはswitchを多用する複雑怪奇な方法
間違いがないのはインターフェースを使ってエレガントな方法
switchでパターンがわかるのは1箇所だけ
実際にはswitchの数だけ掛け算したパターンを把握しなければならない
3分岐のswitchが4箇所で使われていたらそれだけで3 * 3 * 3 * 3 = 81パターンの実行パスが考えられる
このコードベースで処理パターンと条件を列挙するのは事実上無理と言っていい
ところがインターフェースを使った方法ならswitchは1箇所で済むのでコードパスの爆発は起こらない
機能一覧と使用条件を洗い出すのもとても容易になる >>922
コード全部ちょうだい
コードってのはインターフェース使ってOOPで書かれたコードのことな
あっという間に数えてやるよ
ちなみにお前の書いた汚いswitchスパゲティは意味わからんからいらないよ
それはコードじゃなくてゴミだから >>923
容易に判明するよ
インターフェースを使っていれば生成箇所だけを見れば判断ができる
場合によってはソースや設定ファイルを見ただけでわかるし
生成箇所が変数に依存して実行するまでわからない場合も生成箇所だけにログを仕込めばわかる
そして何より重要なポイントは仮に死にコードだとしても全く害がないということ
スイッチヘルだと全てのコードを追跡しなければならない
何時間も何日もかけてソースを読んで
ログを仕込む作業何百回と繰り返し
そのログを仕込む作業で凡ミスしてないかの確認を要求されて
また何時間も何日もかけて回帰テストを手作業で行い
スイッチヘルだと死にコードだからと言って無視することはできない
なぜならスイッチヘルでは死んでるコードと死んでないコードが密結合していて分けて考えることが極めて難しいから一緒くたに行きていると判断するしかないからね
もう考えただけでも嫌になってくるよ >>925
それはすべてのコードを見ないと分からないという敗北宣言でいいのかな? >>927
そう言っておかないとお前後出しするじゃん
じゃあ逆に
void main() {
switch (unko) {
case 1: foo();
case 2: bar();
case 3: baz(); } }
このシステムにおいてどの機能がいつ使われるか全て列挙して
もちろん関数の呼び出し先にも無数のswitchがあるけど聞かれたことしか教えないよ >>928
だろ?
(*゚∀゚)なるなる!
(*゚∀゚)ならないならない!
ウォーズになっただろ?
そもそも根拠も示さないで
明確になるなんて嘘つくのが悪い
switch case以上のものなんかできねぇよ >>930
根拠は示してるがお前が無視してるだけだろ >>931
続けたいならコード出してよ
出せないなら続かないよ 底辺SIer丸出しで草
まあ初心者なら混乱するよな、処理追おうとして読んでもインターフェースの呼び出ししか書いてないからswitchのほうが分かりやすいってなる >>934
いや、明確に判断するにはインターフェイスが継承されてるクラスをくまなく追っかけて呼び出されてる箇所マークして
死にコードと生きコードを分けなきゃならんでしょ?
こんな面倒臭いものをなんで有難がってるのか?
頭がおかしいのか?
switvh caseが問題とかいってるけどお前の脳味噌のが問題だよwww >>933
全部見ないと分かんないって言ったよね?
あの一言で僕の勝ち
君の理論は腐っている
そして全部みなきゃ分からないという君の主張は正しい
だけどそんな複雑なものを好んで使おうとしてる君の脳みそは腐っている 前回の再復刻がふたつ同時だったから、以降はふたつずつ追加されるのかと思ったら今回はひとつだけで残念
実は実装間隔が半分に短縮されている…とかじゃないよね? 社内でユニットテスト定着させようとしたらこんな感じの話がズレている層に拒否られたの思い出したわ .NETのソース見ればいいよ、switch連打じゃなくてインターフェースばっかだから このクソ最近暴れてた奴だろ
クソの相手するな
スカトロ趣味かオメー 気づいたらすげー流れてるなぁ
関心があると考えたらいいこととも思えるけど xp C#2008
メモリが30Mなんだけど、そんなもんなん?(正常に動きます) >>891
要は、本来全然違う物を同じ物とみなして使いたい場合が結構あるってこと。
例えば、
例1:
外部機器との通信プログラムで、USBもRS-232Cもイーサも「通信ポート」とみなして
同じように扱えるようにしたい
例2:
ゲームのプログラムで、物理的なゲームコントローラも、過去の操作の記録データも、
AIによる操作も同じように扱えるようにしたい
インターフェイスは同じ物とみなされるために必要な要件を定義するためのもの。 C#使っててinterfaceの有用さを実感したいなら、IEnumerable<T>を実装したクラスたちについて調べるといいと思う
(そして同時にジェネリックのありがたみもわかる) スレが進んでると思えば…
ID:YwzOlwqa0はNGにしておけばいいよ
テストやったことない人の意見はガン無視でいい 頑固なヤツに成長はない
そのまま消えていただければ幸いです enumrableとenumratorの発音にいつも困る。 >>950
で、その結果がソース全部出せなの?
(*゚∀゚)ズイブンコウリツヨサソウジャン >>953
誰と勘違いしてるんだか
まともにテストツールを使ったことがないか
まともな方法でテストしたことない人の意見は読むだけ無駄 >>954
おお、そりゃスゲェ
是非その超絶技巧をご披露いただきたい
(*゚∀゚)オモシレー 俺にレスしても無駄だよ
お前の超絶技巧で.net framewaorkをinterface無しで再実装してからにしてくれ >>956
アレ?お前はなんにもしないの?
(*゚∀゚)イツモドオリダナオマエ まあ、お前の言いたいことはわかるよ
みずほ銀行のシステムをcobol無しで再実装してからcobolの批判をしてくれないか?
ってことだろ? COBOLの話がすぐ出てくる辺りマジで底辺か、多分ほとんどの奴はお前と話合わないからすっこんでろ >>960
え?お前誰?
単発IDが主義主張もなく割り込んでいいcobolじゃねーよ >>961
誰でもいいじゃん、匿名掲示板なんだしお前と議論する気なんて一切ないし >>961
ここはC#のスレだよ
COBOLの話は別でどうぞ >>928
たとえばclass PCを定義したいと、
インターフェースとしてUSB、HDMI、DP、PCI-exを持ってる。
この場合
class PC: interface USB, HDMI, DP, PCI-ex
より。
PCはUSBやHDMIを具備していると解釈するのが自然でしょ。つまり
class PC{
public:
Interface USB{
};
Interface HDMI{
};
Interface DP{
};
interface PCI-ex{
};
};
とでもした方が感覚的にしっくりきませんか?
アクセス権としてはclass 内部でInterface宣言されたものはPCのリソースに無条件でアクセスできる。
としたほうが直感的にわかりやすくないですか?
USBやHDMIがPCを出産するってのはあまりに無理がある。 つづき
工業製品のシミュレートを考えると継承でインターフェースを増やす、とか機能を増やすとかがしっくりこない。
新製品が旧製品を継承するってならOKだけど、
ある世代のみの製品を定義するなら、
基本モデルに搭載された機能があって、
そこにオプションが追加されて、製品グレードが構成される方がしっくり来ませんか?
この機能追加が継承で実現されるってのはしっくり来ない。
>USBもRS-232Cもイーサも「通信ポート」とみなして
>同じように扱えるようにしたい
これこそ各種インターフェースが通信ポートと派生関係 (is a)関係にある話で、
それらが搭載される大本のPCを派生関係に巻き込むのはおかしな話じゃないですか?
PCから見て同じ通信機能を有するポートと見なしたいだけならエイリアスにでもするとか。
通信ポートがセクロスしてPC出産するなんて考える方が無理ボ 何論点に話してるがしらんけど、
部品を組み合わせるんだからhas aで持たせておけよ。
こんなのに継承なんか使ったら破綻するわ。 is-aって電子回路で例えるとICの非公開の隠しコマンド使うようなもんだからなあ
その密結合した側からは百歩譲っていいとしても他からそのICを使うと整合が取れなくて
マニュアル通りの動作をしないような事態になったらほとんど手直し不能と言う インターフェイスとしては、
IDataIOConnectable みたいなのを持つのでは? C#は移譲とプロバティーとインターフェースを使って、C++の多重継承と外形上同じものを構築できて
しかもより安全なんだよね
道具は使いようだよ 個人的にはis-aは仮想関数のためにあるのだと思ってる
>>970
実際コンポジション(移譲)で90%以上事足りるしな よくわからないなら特に理解する必要はないよ
>>967が正解だし きませんかと言われてもきませんとしか言えんわな
Interfaceを理解することが目的じゃないならチラ裏いき
理解したいならとりあえず自分で利用したコードをかけとしか そもそもPCクラスが直接USBインターフェイスを実装する必要なんてないし
USBインターフェイスを実装したUSB1クラスとかUSB2クラスをプロパティで持つのが普通だろ
IO装置としてのインターフェースって用語と、プログラミング用語としてのそれを混同してるとしか思えん そもそも、USB端子2つ持ってたらどうするの?
PC自体にUSBの機能を持たせたら、usb1と2の区別ができない。
よって、そういった場合を考慮すると、部品化して、プロパティとしてusb1、usb2を持たせるのが正しい。
終了。 この話どーせCOMやActiveXの時代までさかのぼるんでしょ? Visual Studio2017でタプルを使いたいのですが
(ネットで公開されている)正しいコードを入力しても「valueTupleがインポートされていません」
と言われてしまいます。
ターゲットフレームワークがタプルをサポートしているものより古い4.6.1であるのが原因だと思うのですが、
プロジェクトのプロパティには4.6.1までしか表示できず、visual studioの更新もいろいろ試したのですが(CreatorsUpdateなど)
どうしても4.7を採用できません。
どうしたらよいでしょうか OSはwin10です >>979
新しいプロジェクトの作成画面で.NET Framework 4.7になってないとか
もし古い.NETでプロジェクトを作成してしまっていたらソリューションを右クリック→プロパティ→アプリケーション
で、ターゲットフレームワークを.NET Framwork 4.7に変更する >>979
インストーラーから4.7開発ツールインストールしてないなら当たり前 http://imgur.com/a/F6nPY
>>979さんがいうプロパティの画面はこれで良いでしょうか
画像の通り4.7が表示されません。
プロジェクトの作成画面も同様です。 ただのアップデートしただけじゃ4.7は使えない
インストーラーから個別のコンポーネント選んでインストール 解決しました ありがとうございます
個別のコンポーネントを選択していませんでした。 複数の読み込みタスクと一つの書き込みタスクを並列で動かすとき、
書き込みタスクを優先させて動かしたいんだけど、どうするのが正解?
タスクのプライオリティ上げるのかと思ったけど、調べるとどうも違いそうで。
ConcurrentExclusiveSchedulerPairとかのスケジューラをうまく使うのかな? ・複数サーバからネットワーク経由でファイルDL
・ファイル数が閾値を超える毎にDB書き込み(シリアル)
DLタスクの並列数を増やすと、書き込みタスク1つあたりの処理時間が伸びて困ってる・・ それタスクの優先度じゃなくて単にファイルIOの問題じゃないの
ファイルDLの書き込みとDLしたファイルの読み込みとDB書き込みを同じストレージに対して行っているなら処理時間伸びるのは当然に思えるが >>988
書き方が悪かったかな、すまない。
DLタスクは書き込まない、HttpClientのGetStringAsyncでメモリに読み込む >>989
System.Threading.Thread.CurrentThread.Priorityで、優先度弄れるらしいが、実際に使ったこと無いから何とも・・・
スレッドのメソッドの上の方で指定すればOK スケジューラを実装するといいよ
優先度の設定があるけどそれをどう解釈するかはスケジューラの実装によるからね 並列にするメリットが全くわからないのだけれど?
分析能力の欠如っていうか脳がやられたの? 謎行為やってるなとは思うが
謎行為をする動機を語ってないからそう見えるだけだろ
と好意的に解釈してやる とりあえずダウンロードしたファイルはさっさとローカルに保存しなよ
ネットワークに余裕がある時にDBにストアすればいい 現役PGの頃に宇宙仮面のサイトみてたけど
2014年で更新止まってるんだよね。
あの人生きてる??? >>990,991
ありがとう。スケジューラの方向で色々やってみる
>>992,993
ありがとう。動機を説明してみるので、おかしな実装だったら指摘してもらえると嬉しい。
わりと見たことある実装だと思ってるんだけど・・
どこの部分に対する指摘かわからなかったので3点で書いてみる
1.なんでファイルDLしてるの
→空いた時間にダウンロードして、日時の決まった時間にDBを更新するようなバッチじゃないから
2.DLタスクが並列な理由
DLタスクでは数kbのファイルを読み込んで、それをパースしてDBに格納するデータに変換してる。
ファイルは10数個のサーバ毎に日時で1万個くらい生成される。
→各サーバに対して並列で一斉(ないし数台)にリクエストを送る方が、サーバ*ファイル数分、直列でやるより速いと思ってる
3.DLタスクとDBへの書き込みが並列な理由
DLタスクが終了してからDB書き込みしてももちろん動作はする
(実際はメモリの関係で、何度かに分割するだろうけど)
DLタスクはネットワークがボトルネック
DBタスクはDBでの処理がボトルネック*1
→だったらDLタスクが一部終わる毎にDBに書き込ませていった方が、全体のパフォーマンスとして効率的だと思ってる
(本当にpriorityが問題なのかとか、*1が正いかとか、スケールの話は実装とか環境によると思うので省いてほしい。パースはDBタスクの方じゃってのも) 訂正
誤)1.なんでファイルDLしてるの
正)1.なんでファイルDLして保存しないの 書き込みタスクもファイル毎に別なのか?
どうせシリアルなら書き込みはBlockingQueue使って単一コンテキストでループさせ続けるのが無難だと思うが 訂正
ConcurrentQueueを使ったBlockingCollectionだな
BlockingCollectionなら上限数を指定しとけばコンシューマの処理が追いつかないときにプロデューサをブロックすることもできるよ レス数が1000を超えています。これ以上書き込みはできません。