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

レス数が1000を超えています。これ以上書き込みはできません。
2021/03/23(火) 12:58:24.10ID:ACoFzk2L0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part149
http://mevius.5ch.net/test/read.cgi/tech/1608085775/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
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/
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
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/04/20(火) 23:17:25.34ID:+w5LC8La0
初歩的な質問ですいません
オブジェクト初期化子とコンストラクタは何が違うんでしょうか?
やってることは同じのように感じるのですが…
2021/04/21(水) 01:35:22.73ID:qZ+z+JK20
>>324
デリケートって追加や削除されるたびに全リストコピーしてるんだっけ?
ぶっちゃけ効率考えたらデリケートよりインターフェースをリストで持たせた方が効率はいいよね
2021/04/21(水) 01:38:27.35ID:GnM/pYwY0
どいつもこいつもデリケートデリケートってよお!
2021/04/21(水) 02:00:12.49ID:9Dxtj7zY0
♪シーズソーデリケート(デリケート、デリケート)
2021/04/21(水) 05:50:25.83ID:iaWKhvh90
>>327
初期化子は参照側が任意に行う。代入しか出来ない。
コンストラクタはオブジェクト側が初期化のルールを決めて、ロジックが書ける。
ってことじゃないのかな。
2021/04/21(水) 09:15:40.20ID:hAG7zCyL0
>>327
コンストラクタにはそのオブェクトを生成するために必要なものを渡してる
初期化子は特に生成には関係ないない項目にも初期値を設定してるイメージ
使う側はあまり気にしなくていいけど用意する側は意識しといた方がいいよ
2021/04/21(水) 09:18:16.78ID:zaNQ2p2Bd
>>327
初期化子はフィールド単体に対しての初期化で、コンストラクタはクラス全体に対しての初期化って考えたらイメージしやすいかも
まあ、初期化子を指定しない場合でも、def aultで初期化されるんだけどね
2021/04/21(水) 11:04:40.00ID:9tzd621Ta
>>327
そもそも問題設定が間違っていると思うよ。
正しい問題設定は「オブジェクト初期化子って何?」

オブジェクト初期化子とは、コンストラクタ呼び出しと、複数の任意のプロパティーやフィールドへの
値の設定をインラインで書けるようにした糖衣構文。
2021/04/21(水) 16:34:49.04ID:yCZSrEkI0
>>326
実を言うとnull safetyのせいで隠蔽したくなるんだな

もちろん、別の名前つければいいけど
2021/04/21(水) 16:56:18.92ID:yCZSrEkI0
C#に限らずnull safetyの言語で、特にビューモデルのクラスでnullableなフィールドを宣言する機会が多いいんだが、
フィールドはメソッド内でnullチェックしても非nullableに昇格しない(kotlinでいうスマートキャストが効かない)
から、
if (field == null)
 throw new IllegalState
var field = field!; // わざわざnon nullableなローカル変数に代入で、ローカル変数に適当な名前が思い付かないのでフィールド名と同じ名前で隠蔽
2021/04/21(水) 17:04:17.58ID:yCZSrEkI0
メソッド内で1,2回とか参照しないのであればわざわざnon nullableなローカル変数に代入しないが

特にkotlinとかスコープ演算子とかもあるがkotlinは「!!」と二重だからこれがいっぱい現れるとソースが見苦しい...
2021/04/21(水) 22:17:44.76ID:4gUtTQ4z0
>>333
違うだろ。C#ならフィールドとプロパティをきちんと区別しないといかん。
2021/04/22(木) 08:19:06.23ID:b0xCXWo1M
x = a ?? b; ←null合体演算子

x.?method() ←これなんて言うんだっけ?
2021/04/22(木) 08:59:45.35ID:bBpUq1Fa0
ピリオドとクエスチョンの位置逆だけどnull条件演算子
341デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 10:42:48.70ID:XvsGXOnj0
linuxとwindowsで動くguiソフト作りたいんですが、共通の開発環境と言語ってあるでしょうか?
openglを扱ってみたいのですが、c++とqtが多いんでしょうか?
c++を扱うと思うので、erectronやwxpythonなどは除外されるんでしょうかね。
2021/04/22(木) 11:01:31.56ID:8IHXhPWQM
>>341
C++の話をするのに何故C#のスレに来たの?
2021/04/22(木) 11:15:40.26ID:wjS6T4Xy0
>>339
逆にnullだったらそのままにしたいってことが多いんだけどそういう演算子ないよね

int? x = null;
int? 2x = (x == null ) ? null : (2 * x);

みたいな
344デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 11:16:13.25ID:XvsGXOnj0
opengl関係無いアプリも作りたいので(´・ω・`)
c#は恐らくlinuxでは動かないものですよね
2021/04/22(木) 12:12:49.77ID:fYKo/KH70
>>343
nullだったらメソッドやプロパティにアクセスせずnullを返すのがnull条件演算子(?.)
そのint?のケースは単に`2 * x`でnullが返されるようになってる
2021/04/22(木) 12:36:03.10ID:TgsR4gUfM
>>344
人脈があれば出来るぞ
2021/04/22(木) 13:12:31.50ID:V2Z7bz83a
>>344
Unityならwindowsでもlinuxでも動くはず
2021/04/22(木) 13:26:29.41ID:r34CJZmP0
.NET MAUIがそういうの目指してるんだろうけれど…
349デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 14:05:53.62ID:XvsGXOnj0
>>347
unityをguiアプリ開発に使いませんよね 普通
2021/04/22(木) 14:23:56.91ID:wSGfQWAL0
>>349
mono 使えばいいんじゃないの?
2021/04/22(木) 15:04:02.14ID:wjS6T4Xy0
>>345
条件演算子を使えないパターンの例をあげたつもりだったんだけどそういう動作すんのか
x.method()に対応するならmethod(x);にも対応してくれてもいいのにって思った
352デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 15:44:38.28ID:XvsGXOnj0
>>350
monoやxamarinはc#ですよね。
c#製アプリはlinuxで動かないと効かされていましたが。
あと、openglなので、c++ではないですか?
2021/04/22(木) 15:47:59.35ID:TgsR4gUfM
.net core も動くぞ
354デフォルトの名無しさん (ワッチョイ 778e-u7Bp)
垢版 |
2021/04/22(木) 17:02:51.26ID:RDEPc8rd0
釣りだろ
2021/04/22(木) 20:02:51.51ID:YBnx4+wd0
なんでも釣りって言わないで
2021/04/22(木) 21:59:40.16ID:8RSzlZOe0
なんでguiにunity勧める奴いるのw
2021/04/22(木) 22:01:36.51ID:itFZ12540
何にでもRuby勧める奴もいるだろ
2021/04/22(木) 22:05:49.71ID:JJ/RFZ5mM
まあC#スレでC++連呼してるのは釣りか底抜けのバカのどちらかだからいずれにせよスルーが基本かと
2021/04/23(金) 21:53:03.64ID:e/IHU4YJd
c#でPCがアイドル状態か否か判定したくて
マウスの動きが一定時間なしで判定するのは出来たんだけど
マウスを動かさずブラウザで動画再生しているときにもアイドル状態ではない判定にしたいんだけど
どうすれば判定取れるでしょうか
2021/04/23(金) 22:15:06.79ID:2LOGdF5/0
特定のキー押下でアイドル判定されない状態を追加して置いた方が今後楽じゃないかな?
2021/04/23(金) 22:40:41.15ID:vlx7cXWJ0
メディアプレイヤーの類で動画再生は構わないの?
ブラウザのバックグランドタブで再生中の場合は?

一応各プロセス各スレッドがSetExecutionStateした結果のステートはこんな感じで取れるらしい
https://stackoverflow.com/questions/10970625/how-windows-decides-to-show-the-screensave
2021/04/23(金) 22:41:57.81ID:vlx7cXWJ0
SetThreadExecutionStateだった
2021/04/23(金) 23:45:20.80ID:tWGuVFO60
その他の案
スクリーンセーバーのプロセスをトリガに利用にする
例えば「ブランク」のスクリーンセーバーが起動してたら、
「scrnsave.scr」がプロセス一覧から取得できる(はず)
つまり*.scrが動いてたら確実にアイドル状態と判断できる
この方法はスクリーンセーバーを無効にしてたら意味ないけど、それはレジストリから判断できるはず
問題はアイドル+スクリーンセーバーの起動時間まで待つ必要がある事
2021/04/24(土) 00:09:09.60ID:gwk+qBm00
つ WM _ enteridle
2021/04/24(土) 00:13:28.13ID:RPGHdVOi0
タスクスケジューラでアイドル状態を条件にプログラムを起動できる
コードから直接利用する方法があるかどうかは知らない
2021/04/24(土) 01:30:28.39ID:+FP4d2caa
>>359
率直に言って無理がある気が。

結局システムで正式に定義されたステートじゃないと
今たまたま何か方法を見つけ出してもいつまでそれが使えるか
わかんないよね。

スリープを抑止するプログラムが起動しているかどうかで
判定できないかとも思ったけど、ブラウザの動画再生は
たぶんスリープ抑止しないよね知らんけど
2021/04/24(土) 01:42:09.65ID:lUFfLIkMd
SetThreadExecutionStateを試してみます

>>360
同じような機能入れてたけど設定し忘れ&解除し忘れで意味なかったです
2021/04/24(土) 11:26:55.87ID:gMqF1SGc0
GetLastInputInfo
2021/04/24(土) 13:52:13.80ID:gg+BSg3V0
>>361 でよさそう(未確認)
>>368 GetLastInputInfo は数ヶ月前10で試したけどうまくいかなかった
2021/04/24(土) 14:17:41.68ID:zhh/+6W6M
.NETで文字列の見た目の幅を求めるライブラリってある?
等幅フォント前提で半角英数なら1文字分、全角漢字なら2文字分、、、といったように計算したい
2021/04/24(土) 14:21:02.35ID:n+JXhE4b0
https://dobon.net/vb/dotnet/graphics/measurestring.html
これじゃだめなの?
2021/04/24(土) 14:34:56.09ID:CavyEmf6a
>>370
シフトJISでエンコードした時のバイト数を数えればいいと思うけど
今時そんなの何に使うの?
2021/04/24(土) 15:01:36.07ID:zhh/+6W6M
>>371
ありがとう
でもできればプラットフォーム依存しないほうがいい

>>372
Markdownのテーブルをフォーマットしたり色々です
2021/04/24(土) 15:03:28.91ID:6TA9BQj40
絵文字やサロゲートペアも考え出すとめちゃめちゃめんどくさいよね
2021/04/24(土) 15:27:27.20ID:h2P4AVL30
>>370
雑にやるなら、StringInfo.ParseCombiningCharacters2倍して、半角文字の文字数引いたら良いんじゃないの?
アクセント付き文字も半角文字に入れればそれなりに並ぶんでは?

タイ語とかアラビア語まで考える?
2021/04/24(土) 15:41:18.56ID:Of2cOFGz0
MeasureStringの数字を見ながら、頭がウニになったGDI+の思い出
勝手に文字の大きさ計算してくれるwpfの有り難さよ
2021/04/24(土) 16:14:48.80ID:RPGHdVOi0
>>370
wcwidthとかeast asian widthで検索してみるといいと思う
https://www.nuget.org/packages/EastAsianWidthDotNet
2021/04/24(土) 16:54:43.52ID:zhh/+6W6M
>>375
情報ども
とりあえず日本語対応できればいいかなと

>>377
あざす
これたぶん正解っぽいすね
2021/04/24(土) 17:00:48.70ID:TFlZREhta
Markdownのテーブルっていうのが何かよく分からないけど、
細かいこと言えば等幅フォントであってもどの文字がどの幅で
描画されるかはフォントに依存するはずだと思うので、(一般的に半角の文字だと
されているものが半分の幅で描画される保証なんて実はないんじゃないか?)
グラフィック関係なら>>371みたいに実測するのが一番確実だよね
2021/04/24(土) 18:10:11.92ID:EfI17DN20
同じ文字で同じ等幅フォントで表示しても、アプリによって全角/半角相違することもあるよ
MS製品間でもVisualStudio/Officeで幅が一致しなくて以前困った記憶がある
2021/04/24(土) 18:17:52.33ID:shUiIChg0
httpclientでpostした時にレスポンスヘッダーのlocationが取れないんだけど取る方法なかんかな
2021/04/24(土) 18:37:25.15ID:jBCuAF2S0
HttpClientをnewするときに渡すHttpClientHandler(.NET Core/5ならSocketsHttpHandler)の
AllowAutoRedirectをfalseにすればいけるような
2021/04/25(日) 09:16:00.93ID:pCSAoCZZ0
>>382
できたわ
サンクス
2021/04/25(日) 15:07:37.80ID:hcyifmDsx
パネルに貼り付けているlabelの数を数えることってできませんか?

テキストファイルの1行目ならlabel1へ表示するってな感じにしたいのですが、
行数が少なければ↓でいいんですが、

label1.Text = File.ReadLines(FileName).Skip(0).Take(1).First();

数が多くなるとコードが長くなって修正等に時間がかかると思うんですよ。
そこでラベルの数が数えられるなら繰り返し文を使えばコードがスッキリするんじゃないかと思ったんです。
良い案のある方いらっしゃいましたらレスをお願いします。
2021/04/25(日) 15:38:30.38ID:nePod60N0
>>384
controlsっているじゃん?
2021/04/25(日) 15:45:05.88ID:jBx2XbWF0
>>384
var count = this.panel1.Controls.Cast<Control>().Count( x => x is Label );
2021/04/25(日) 16:09:10.43ID:FaKFDW610
>>386
Controlにキャストする必要あるのか
つかOfTypeで良いんじゃねえのか

ちなみにControlsの列挙順って一定なのか?
2021/04/25(日) 16:11:55.60ID:jBx2XbWF0
>>387
思わずCastで書いちゃったけど、OfTypeの方がいいね
2021/04/25(日) 16:15:19.50ID:pX1h9NBm0
男だったらキャストして突っ張り続けろよ
2021/04/25(日) 16:16:57.02ID:vWpG1hhV0
>>387
designerの登録順に依存するけどイジるたびに変更を確認するの馬鹿馬鹿しいから
自分はコントロール名やタブ順で並び替えてる
2021/04/25(日) 17:17:41.16ID:FaKFDW610
>>390
(デザイナーでの)登録順ってのは「保障」されているのか?って話なんだが
ディクショナリとか一見登録順に見えても、それは条件が良いだけか実装依存な場合がほとんどだぞ

まあデザイナの定義もVSでいじるとどう変わるかわからんけどな
2021/04/25(日) 17:43:19.45ID:jBx2XbWF0
>>391
自分で調べもせずに何でそんなに偉そうなんだw
Control.ControlCollectionはIListインターフェースを実装してるとDocsに書いてある
2021/04/25(日) 17:57:58.07ID:NMiXqa1mM
>>388
いやCastの方がいいよ
失敗しない確信を持ってるんだから
2021/04/25(日) 18:22:24.73ID:Jq50cbcAa
>>384
なんかやりたいことと質問の内容が噛み合ってないような気がw

n番目のLabelにn行目の内容を表示したいんだったら
欲しいのはLabesの数じゃなくてIEnumerable<Label>とかじゃないの?

っていうかそういう目的ならLabelじゃなくてListViewとか使った方がいいんじゃないの?w
2021/04/25(日) 18:45:17.32ID:6eSN7Ebq0
MVVMならもっと楽だったな
2021/04/25(日) 20:58:32.34ID:hcyifmDsx
皆様回答ありがとうございます。
Controlsプロパティに関しましては↓に
https://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html
>PanelコントロールやGroupBoxコントロールなどを利用している場合には、フォームのControlsプロパティからすべてのコントロールにアクセスできるわけではない。

と書いていたのでスルーしていました。

>>394
まだ入門書を終わったばっかりでなにが正しいのかわかrない状態なので、変な感じなってるっぽいです。
ご指摘ありがとうございます。


とりあえずやりたいことはできたので、皆様本当にありがとうございました。
2021/04/26(月) 12:04:27.44ID:aoKZLvu10
>>396
一応釘を刺しておくけど、コントロール名を変えるだけで動かなくなるような実装にならないよう気をつけてね
2021/04/26(月) 15:48:20.09ID:57LVbzrx0
>>397
横からすみません。
そういう事態を避けるにはどういう実装にすればいいでしょうか。
2021/04/26(月) 17:00:40.17ID:fVZ2op5+0
Nameプロパティを見ない処理にすればよくね?
2021/04/26(月) 17:16:30.71ID:57LVbzrx0
>>399
現在、ToolStripのクリックされたボタンをNameで判別してます。
if(e.ClickedItem.Name == "") { }

この場合、Name以外のプロパティを使うようにするだけでいいでしょうか。
2021/04/26(月) 17:43:14.20ID:1JVi9H1ud
>>400
Nameじゃなきゃいいわけじゃないよ
じゃあTextで″削除″だった時にって分岐をすると、後にダイアログを出すから″削除...″に修正しなきゃってなって動かなくなる
派生してカスタムコントロールを作るとかTagを利用するとかが一般的かな
2021/04/26(月) 17:43:28.37ID:+MtLiehda
>>400
どのプロパティーを使おうが、そのコードを書いた時と違う値が設定されてしまったら
識別子として使えないのは同じじゃないの?w

素直に「クリックされたのは○○か?」を検査するコードを書けばいい。
if (e.ClickedItem == hogeButton) { ... }

そもそもボタン自身のイベントを使えば何がクリックされたか識別するコードを書く必要がない
2021/04/26(月) 18:57:38.53ID:fsnGR4b00
ありがとうございます。

>>402
以前、その方式でやっていたのですが、理由あってToolStripと、そのコンテナになるFormを別にした結果、以下のコードになってしまいました。
結果、FormからMenuItemを直接参照出来なくなりました。
https://ideone.com/dlhYMG

対策的に、別途、MenuItemの一覧のenumと、クリックされたItemを伝播するイベントを作りました。
https://ideone.com/da5kPY

ただし、この場合はMenuItemを追加する時に、enumに要素を追加する必要がありますが、
enumは定数なので、アプリ使用中にItem追加した際、enumにそのボタンを登録出来ないのです。

それで結局Nameを参照するようになりました・・・
2021/04/26(月) 19:20:00.87ID:+MtLiehda
>>403
メンバー(fileMenuItem)のアクセスレベルを非privateにして晒すのが嫌なら
素直にイベントを作っちゃうのがいいんじゃないの?

public class MyToolStrip : ToolStrip
{
  private ToolStripMenuItem fileMenuItem = new ToolStripMenuItem();

  public event EventHandler FileMenuItemClick
  {
    add
    {
      fileMenuItem.Click += value;
    }

    remove
    {
      fileMenuItem.Click -= value;
    }
  }
}
2021/04/26(月) 19:27:06.52ID:fsnGR4b00
>>404
それで行きます!ありがとうございます!
2021/04/26(月) 19:35:35.06ID:/WVOYzSd0
動的にオブジェクト追加してるならそのオブジェクトの参照は持ってるはずだから
Nameプロパティとか見る必要ないはずだが
2021/04/26(月) 19:50:40.13ID:fVZ2op5+0
言語の機能でインスタンスを特定しようとするのはギルティ
だいたい作っていくと痛い目にあう
2021/04/26(月) 21:00:37.58ID:zRuX+7dna
>>405
本来はToolStrip自身じゃなくて、ToolStripやMenuStripを持った
Formを継承した方がいいような気もするけどね。
まあそれじゃ満たせない要件なのかもしれないけど。

でもToolStripやMenuStripってFormの継承と相性悪いんだよな確か。
修正されずに放置されてるバグがてんこ盛りだった気がする
2021/04/26(月) 22:26:58.02ID:VGqr4loSx
>>397-408
入門書がNameプロパティでの判別をしていたので、当たり前のようにやっていましたが、
あまりよくないやり方なんですね。
ありがとうございます。勉強になりました。
2021/04/26(月) 23:28:26.99ID:fsnGR4b00
>>409
よくないかどうかは状況次第だと思う。
自分や他人がコントロールのNameを変更した時に、判定する側もきちんと変更すれば問題ないはず。
そもそも変更しないなら問題になることもないし。
2021/04/27(火) 00:39:04.06ID:H7ElJCU2a
>>410
「〇〇を変更した時には××も変更すべし」みたいな自明じゃないルールが存在すると、
そのルールをコードを保守する人が忘れているか知らない場合には
正常に動作しなくなるリスクが発生していることになる。

プログラミングの目的は要件を満たすことなので、他に手段がなければ
あえてそういうリスクのある方法を採用することはあってもいいけど、
今の話は明らかにそうじゃない
2021/04/27(火) 00:47:33.70ID:8Unh/3dq0
Windows,LInux,Macで動作するものを作る場合は.Net coreとmonoどっちがおすすめですか?
2021/04/27(火) 00:58:04.31ID:ezafVa/dM
今からなら.NET 5 (.NET Coreの後継)
今年中には更に後継の.NET 6が登場予定
.NET Coreは既に終了済、monoはモバイル向け(.NET 6に統合される予定)
2021/04/27(火) 01:08:57.42ID:8OBs4sir0
なんか次々思い付いてはゴミのように捨てていくよな
2021/04/27(火) 01:13:33.58ID:8Unh/3dq0
そうなんですね
.NET 5調べてみます!
2021/04/27(火) 01:19:08.19ID:DUr8YxD70
.NET Core 3.1の次バージョンを.NET 5とリネームしただけだから.NET Coreが終わったわけじゃない
2021/04/27(火) 08:59:07.35ID:nkW/cvkg0
>>413
既に終了済み??
418デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 09:09:39.16ID:+C/fTs2P0
インターフェースや抽象クラスのメリットとは?

つまりvirtualで処理をかかない純粋仮想関数を作る意味はあるのかということです。

そもそもvirtual指定するのであればデフォルト処理というものを書いておけば必要に応じてオーバーライドすればよいと思うのですが。
2021/04/27(火) 09:56:11.35ID:zT7wmnFt0
>>418
>インターフェイス
多重継承

>抽象クラス
デフォルト処理が決まらないメソッドを継承先でオーバーライドで強要する
420デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 10:13:30.82ID:+C/fTs2P0
>>419
ありがと、
めちゃわかりやすかった。
2021/04/27(火) 13:59:45.19ID:MoRpu0yA0
ちゃんとifやcase文で書いた方が実は後で楽だけどね
使うかどうかはかっちょええかどうかである場合が多い
2021/04/27(火) 14:31:58.08ID:H51IIUOO0
将来的にスパゲティ化することを防ぐために多少手間でもインタフェースや抽象クラスを使って制約を設けるもんじゃないの?
2021/04/27(火) 15:29:38.21ID:5DBHgWrVM
そういうのは大抵、いざ要件が増えたときには、今の引数だけでは〇〇の情報が足りないとか、拡張を想定していなかった部分を拡張しなければならなくなったとかで破綻するんだよ
要件にないなら後で実際に拡張が必要になってからリファクタリングした方がよい
2021/04/27(火) 16:06:23.66ID:NpDZDySr0
俺は>>422派だな。
要件が増えたときにパラメータが増えたとしても、ファクトリーに渡す拡張用の値増やすだけで元の処理に手を入れなくていいから
425デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 17:44:39.71ID:+C/fTs2P0
もしかして抽象クラスとインターフェースって使う必要ない?
メリットはスパゲティコードにしない制約を追加するだけで有れば設計ミスの方じゃないか?
2021/04/27(火) 17:54:44.27ID:MoRpu0yA0
>>425
まあでも知ってると他の誰かが使ったときに欠点がわかるよ
下地がそうやってできてるのにそれに逆らって作ってもしゃーないし
合わせるのは大事

ただメリットはよくわからん
List<object>やobject型の悪用とあんま変わらん気がする
落ちてもどこで落ちたかわからんのもいっしょ
2021/04/27(火) 17:58:00.62ID:3vzUzKx8M
>>425
同時平行開発するときは有用だな
2021/04/27(火) 18:04:24.32ID:pi+NfSuo0
interfaceはこのクラスにはこのメソッドがありますよと言う事を約束するだけで
実装が共通化しようもないようなものに使うものだし
(例としてforeachで回せるようにする為のIEnumerable)
抽象クラスは良くある例はFruitクラスの子クラスがAppleやら関連性のあるものに対して使うものだろうし
そもそも用途が違うような
2021/04/27(火) 18:05:20.92ID:eLMexJPua
>>425
アーキテクチャ綺麗だとあんまし使わないね
依存関係グチャグチャのスパゲティになってるとインターフェースで切ってDIしないとキツイ
けどそれは最初から設計ミスなんだよ
2021/04/27(火) 18:06:48.09ID:eLMexJPua
>>428
アルゴリズム書くときには便利かもね
431デフォルトの名無しさん (スッップ Sd70-I7vP)
垢版 |
2021/04/27(火) 18:14:04.55ID:RVxlIcyJd
クラスを他の人に使わせてまうとあとで変えれなくなってのっぴきならなくなることがあるからやがな。

interfaceにしておくことでサイズゼロにしておくことが出来る。
相手が不特定多数だと「変更したから変えてくれ」とはいえないわけですわ。
2021/04/27(火) 18:16:27.98ID:H51IIUOO0
多態性を利用するために必須なんだから使わなきゃ不便じゃない?
純粋に楽になるついでに、構造に制約を設けて将来的に品質維持する保険にもなるっていう複数のメリットあるので、使わない理由が無いというか
一回つくって終わりの書き捨てならいらないけど

426の後半2行は意味がよくわからない
2021/04/27(火) 18:32:34.55ID:/yDoZvzG0
下手の考え休むに似たりって本当だよな
434デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 18:33:38.95ID:+C/fTs2P0
>>432
多様性を使う為に必須というのは初耳だった
別に普通のクラスでも継承してインスタンス化すれば多様性は使えると思ってたんだけど

同じ親クラスやvarの配列にしてfor回したり
そこでインターフェースや抽象クラスにしてしまうよりかは
少なくとも何も処理しないダミー関数でも書いて仮想メソッドで実装しておいた方が良いとおもてる
2021/04/27(火) 18:35:08.09ID:MoRpu0yA0
>>431
いやいやinterfaceから触るでしょうよw
2021/04/27(火) 18:37:58.55ID:MoRpu0yA0
ちゃんとcase文書いた方がいくつ分岐してるかわかっていいじゃん
これをメリットと思えないのってなんでなの?
ソース読むときいくつに処理が別れてるか知らずに済むことって皆無だと思うけど
2021/04/27(火) 18:48:41.39ID:K2ItIfw9D
今って多態性じゃなく多様性って言うのが主流なの?
2021/04/27(火) 18:49:53.91ID:tjxIRyEc0
>>436
いくつに分岐しているかを気にしなくてすむのがinterfaceによる抽象化のメリットの1つだろうに
439デフォルトの名無しさん (ワッチョイ fc63-On6t)
垢版 |
2021/04/27(火) 18:51:27.27ID:LNs0Wm240
いいえ多態性です
440デフォルトの名無しさん (ワッチョイ 74e5-4uvq)
垢版 |
2021/04/27(火) 18:53:45.11ID:QWBqF+Zq0
>>431
interfaceって実装しなくてもいいの?
詐欺にならない?
2021/04/27(火) 18:59:04.44ID:izPR1pTAa
OOPの歴史も30年以上あるのでさすがに本質的に不要なものが
淘汰されずに生き残っているってことはないよ。

インターフェイス不要論とか抽象クラス不要論とか
staticおじさん級に幼稚で非生産的な書生論w

もっとマシなことに時間使った方がいいよ
2021/04/27(火) 19:07:16.33ID:pi+NfSuo0
>>440
実装しなくても良いのではなく、interfaceそのものには実装は書けない。必要なメソッドを定義するだけ
良くある例としてIDisposableがあるけど
using(var obj = new TestClass()) {
}
みたいな使い方したければ上記のTestClassにDispose()メソッドを用意してねって事で
class TestClass : IDisposable
{
public void Dispose() {何らかの終了処理}
}
みたいに実装を用意しないとそもそもエラーになる
2021/04/27(火) 19:27:42.16ID:H51IIUOO0
>>434
普通の継承でも使えたね。すまん
具象クラス継承の適切なケースがわからんので考えなくなって、出来るって事も忘れてた
2021/04/27(火) 19:49:20.62ID:MoRpu0yA0
>>441
ハイ、じゃあメリットは?
2021/04/27(火) 19:53:09.03ID:zk58yDApM
>>440
単一継承しか許されないクラスと違い多重継承が許されるインタフェースでは、実体を実装するとC++同様に基底メンバの衝突の問題が発生する
この問題を回避するために実装を派生先に委ねてしまうことにしてインタフェース内では実装は禁止されている
2021/04/27(火) 20:06:45.34ID:3YkNPMA00
教えて下さい。VBから書き換えて勉強してます。
フォーム1と2があり、それぞれTextBoxが無数にあります。フォーム1→2まで入力をして最後入力した情報を保存したいのですが、どういった形式、方法で保存するのが望ましいですか?
VBは区切り文字を入れ、datファイル1つに2行で書き込んでます。再度呼び出す際にsplitでそれぞれのTextBoxに入れてます。
が、何かのタイミングでTextBoxが増減したとか面倒そうなんですが一般的にはどんな感じでしてるんですかね?
2021/04/27(火) 20:21:32.78ID:cvesXM3a0
辞書を作りたまえ

DDXって死語け?
2021/04/27(火) 21:09:28.77ID:3TA75SVH0
json
2021/04/27(火) 21:15:25.28ID:YZq/AI+30
自分で使ったことはないけどinterfaceはデフォルト実装持てるようになってなかったっけ?
2021/04/27(火) 21:17:18.55ID:AfIT+tVg0
>>449
なってるけどあんま使いたくないな
2021/04/28(水) 01:26:19.18ID:C+xRRq0o0
まあどうしてもバイナリ互換性を崩したくない時に使うもんだよね
2021/04/28(水) 02:42:21.15ID:2iApvDDg0
バイナリ互換性って何?
2021/04/28(水) 03:00:12.55ID:C+xRRq0o0
あるdll(A)にインターフェイスが定義されており、別のdll(B)にその実装があった場合、Aを修正してもBに影響がなければバイナリ互換性があると言う。
たとえばAのインターフェイスに実装を持たないメンバーを追加するとBはコンパイルエラーになってしまうので互換性が崩れる。
Aにメンバーを足す際にデフォルトの実装を書いてあげれば、Bはコンパイルエラーにならない。

破壊的変更にならないようにフレームワークやライブラリを改修したいってのがインターフェイスのデフォルト実装の動機。
2021/04/28(水) 03:09:37.20ID:QdyWhJOJ0
まあCOMみたいにナントカ2とかナントカ3とか増えるのもまたアレ感があるんで
455デフォルトの名無しさん (ワッチョイ 3702-6Fjd)
垢版 |
2021/04/28(水) 06:00:02.52ID:Nr1kHF1d0
"IsDisabled": false,
"Name": "Tap",
"Arguments": [
"Keys.O",
"112",
"12600",
"True"


これって、キーボードのOを112ms間押して、12600ms離すって意味だよね?
約24時間、キーボードのPを押す時間も離す時間もランダム(10〜10000msの範囲で)にしたい場合どう入力したらいいの?
あと24時間以内にとある画像を認識した場合、認識したその都度W、S、A、Fを押すという時どう入力したらいいの?
2021/04/28(水) 11:10:31.63ID:905Z8E/r0
それ何の言語なの?
2021/04/28(水) 11:34:29.86ID:o3+T5GoG0
json
458デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/28(水) 12:01:20.73ID:k6d6iGQO0
アップキャストを行うと何が嬉しいのでしょう?
インスタンス化は普通
クラスA a = new クラスA();
なのに
クラスB b = new クラスA();
ってする意味です。入れれるのと使えるメソッドはイメージ通りですが、使うタイミングが不明です。
2021/04/28(水) 12:12:07.08ID:CT/VgEdf0
>>458
親クラスがクラスBで、クラスBを継承したのがクラスAってことなんだろうけど、
クラスBを継承したクラスCを追加して時に、クラスAとクラスCを同じように扱いたい時に使う。
2021/04/28(水) 15:39:41.26ID:z2mXZLfz0
>>458
foreachでまとめて処理するのに使ったかな。
2021/04/28(水) 16:32:07.21ID:snAX0stPa
>>458
あえて言えばサブクラスで隠蔽(new)を使ってるメソッドやプロパティがあると、
サブクラスのインスタンスをスーパークラスの変数に入れた場合に
動作が変わってくるんだけど、恐らくそういう目的でそれをやるケースは
ほとんどないんじゃないかな。

ほとんどの場合、それは積極的な意味を持たないと思う。
2021/04/28(水) 16:58:01.56ID:MNdo4yxk0
>>458
List<Human> list;
に派生したクラスとかを入れたい時に使う
463デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/28(水) 17:52:40.77ID:snAX0stPa
>>462
大阪人「は」人間なので、そんなことは不要。

class Human { }
class Osakan : Human { }
....

var o = new Osakan();
var hs = new List<Human>();
hs.Add(o);
2021/04/28(水) 17:59:49.82ID:1SQ+syPV0
アップキャストってそれ自体を目的にするものなのかな?
意識せずに使ってるだけで、見方を変えればアップキャストが目的とも言えるのかもだが
2021/04/28(水) 19:54:14.62ID:MNdo4yxk0
>>463
それ暗黙的にアップキャストをしてるから不要ではないよね?
質問が、アップキャストの嬉しさについてだから例としては適切だと思うけど

アップキャストとしての嬉しさではなく、
クラスB b = new クラスA();という変数を作る意味があるのかって話なら、大抵は暗黙的なキャストてどうにかなるからやる意味はない
2021/04/28(水) 20:13:50.67ID:VZRYywec0
var s = new LinkedList<char>();
_ = Console.ReadLine().Select(x => s.AddLast(x));

これでsに標準入力が入る気がするのですが実際何も入りません
どうすればいいんでしょうか?
2021/04/28(水) 20:44:33.40ID:snAX0stPa
ポカミスだと思うけど、Selectはシーケンスを返すだけだよね。
Selectが実行された時点ではstringの中のcharを列挙したりしない。
2021/04/28(水) 20:50:43.89ID:VZRYywec0
>>467
var s = new LinkedList<char>();
_ = Console.ReadLine().Select(x => s.AddLast(x)).Count();

こうですね...
遅延評価にハマりました
ありがとうございました
2021/04/28(水) 21:04:25.17ID:VZRYywec0
var s = new LinkedList<char>(Console.ReadLine());
というかこれで良かったみたい
2021/04/28(水) 21:35:36.25ID:CT/VgEdf0
Select(x => s.AddLast(x))
はやっちゃ駄目だろう
471デフォルトの名無しさん (ワッチョイ 38e6-4uvq)
垢版 |
2021/04/28(水) 21:38:57.70ID:ohiKXwgS0
ToLinkedListを実装するのが絶対的正義
2021/04/28(水) 21:54:47.35ID:2iApvDDg0
>>457
このスレってJSONを推してる人むっちゃ多いんだけど、CSVと比べて何がいいの?
CSVに出来なくてJSONに出来ることってあるの?
2021/04/28(水) 22:01:00.21ID:N4TU29msM
階層構造を持たせられる
項目の追加が楽
シリアライザが充実している
方言の多いCSVと違い、仕様が統一されている
2021/04/28(水) 22:13:27.34ID:RJLrCSIQM
CSVの方がよさそうならCSVって回答するけど
このスレくらいの質問者だと背景や用途を喋らないので最大公約数的回答になる
2021/04/28(水) 22:18:25.06ID:SKK3EpB30
俺はjsonの方が好きだからjsonを使う
2021/04/28(水) 22:33:03.67ID:roTNJzpQa
CSVとかトラブル製造機じゃん
2021/04/28(水) 22:43:14.57ID:2iApvDDg0
>>473-476
ありがとうございます
なるほど、XMLでも階層構造は持たせられるけど仰々しいですよね
ああ、あれをシリアライザって呼ぶんですね
昔、一回JavaだかでJSON読んでみて満足した記憶があります
GW明けの使い捨てのスクリプトではJSONで書いて読んでみます
2021/04/29(木) 00:09:54.46ID:uAu0lWj/0
CSVは方言多すぎてそこらのパーサー使うの怖いわ
2021/04/29(木) 04:38:08.16ID:mJShgxJuM
unityでc#ぼちぼち覚えてきたけどc#って何ができるんや
2021/04/29(木) 05:53:27.68ID:Pwf8A7W+d
>>479
何でも出来るさ。ライブラリが揃えば。
2021/04/29(木) 05:59:02.89ID:RErNGDPY0
[ {"a" : "1"}, {"b" : "x"} ]

a列のみとか、b列のみしかないJSON が、CSV では、

a,b
1,
,x
2021/04/29(木) 09:03:47.11ID:lalb0v+EM
>>481
わからん
2021/04/29(木) 09:48:46.58ID:IBkpf/CX0
>>477
階層を持つのは後の欠点にもなるからね
結局はCSV形式で持ってた方がいずれ近いうちなるデータベース対応時に楽だよ
2021/04/29(木) 09:55:18.98ID:gug0J2oaa
楽じゃない
2021/04/29(木) 10:10:10.40ID:IBkpf/CX0
>>484
なんでだよ
階層データじゃデータベース入んねぇだろ
2021/04/29(木) 10:27:55.67ID:EFYWvXghd
楽じゃないな。
きちんとした形してるなら階層持ってるデータのほうがマシ。
正規化するよね?常識的に考えて。
2021/04/29(木) 10:28:53.11ID:qu9Hv39D0
jsonはそのままクラスに持たせられるから便利
あとパースできない読めないってことが少ない
xmlもcsvと比較するとjsonに近い

csvはそのまま行と列のデータだからDBにいれるだけなら悪くないしそれならサイズ的に軽い
改行ダブルクォーテーションとかあと上で言う方言とかあるから、なかなかトラブルを消しきれないこともある

Excelでもよみたいとか要件があるならcsvかな
2021/04/29(木) 10:37:53.58ID:EFYWvXghd
>>487
エクセルで読ませたら先頭のゼロ消すやつとか日付のフォーマット変えるやつとか、ハイフンがついた数字を日付にするやつが現れがちなのですごく嫌かな。
2021/04/29(木) 10:49:23.57ID:PVZP3gNe0
目的の違うデータ形式を個々人で違う基準で評価してあーだこーだ言っても仕方ないのと違うか。

ただ。
json 形式の意味があるのか分からない深い階層を持つデータに対応するクラス作ってたときは本気でイヤになったけど。w
きちんと正規化して意味のない階層だとかを排除してくれるなら扱いやすい方式だとは思う。 < json
2021/04/29(木) 11:15:55.38ID:Ta5ufSky0
csvのrow/columnをjsonで表現できるが逆はできないからcsv⊂jsonだけど
大量のデータを扱うにはjsonは冗長だよな。
2021/04/29(木) 11:30:58.28ID:b5j8CNbM0
jsonで大量データだと、容量削減のために要素名を変数1文字とかやりだすしな
2021/04/29(木) 11:40:51.69ID:gug0J2oaa
CSVよりJSON Linesですわな
2021/04/29(木) 12:43:50.51ID:Gvkp+FCpM
>>491
そんなことするくらいなら圧縮するわ
冗長だから圧縮した状態同士での比較ならCSVと変わらん
2021/04/29(木) 12:52:51.92ID:IBkpf/CX0
>>493
デカイ階層データで気になるのは処理速度だから圧縮されると余計時間かかる
2021/04/29(木) 13:06:57.09ID:C0wDcO7Sa
シリアル化方法(CSVをシリアル化とは普通は呼ばない気がするけど便宜上)を選択する上での
評価基準としては、

(1) 可搬性
(2) 対応するデータ構造の自由度
(3) 変換速度
(4) バージョン耐性
(5) テキストとしての可読性(これが重要なケースはほとんどないと思うが...)

こんなとこかね。
CSVで評価できるのは(1)ぐらいなので積極的に使う理由はないね当たり前だけど
2021/04/29(木) 13:39:52.49ID:gug0J2oaa
エクセルおじさん用のデータ交換フォーマットと割り切ったほうがいい
2021/04/29(木) 13:47:05.06ID:MqlSo6MR0
>>494
展開時間かかる代わりにアクセス時間が相当減るから、変わらんか早くなるよ。
2021/04/29(木) 14:36:43.78ID:t8Qsv63f0
用途次第だけどjsonのままDBにつっこめばいいじゃん()
2021/04/29(木) 14:44:24.17ID:hnM2dBp9M
>>497
そんなのCPUとI/O次第としか言えん
2021/04/29(木) 15:11:48.04ID:IBkpf/CX0
>>498
え?どうやって?
2021/04/29(木) 15:19:29.90ID:IBkpf/CX0
結局、データベースに入れる運命なのに今の時代に階層データにするやつなんか頭悪いんだよ
2021/04/29(木) 15:28:12.72ID:zh8QYWZnM
いまどきはどんなDBMSでもjson形式のデータインポートくらい出来るだろ
LINQでクエリ走らせるだけだろ
2021/04/29(木) 15:32:29.05ID:Ta5ufSky0
>>496
じゃあjsonはテキストエディタおじさん用か。
2021/04/29(木) 16:10:49.54ID:1OxYHKr7d
最近のRDBMSだとjson型とかあったりするからな。
>>499
ライトはともかくリードは2021年だと殆どの場合で早いぞ。
2021/04/29(木) 16:16:56.06ID:4wXFV0waM
>>504
いや、リードが速きゃ圧縮してなくても速いわけだが…
2021/04/29(木) 16:48:57.18ID:t8Qsv63f0
>>500
もう言われてたけどjson型サポートされてるRDBMSもある。触ったことないのでパフォーマンスは知らぬ
mysql,PostgreSQLはカラムの型としてサポート済で、oracleとsqlserverは文字列型で格納して制約や関数でjsonとして扱う感じなのかな?
PostgreSQLだとjsonのキーに対してもインデックス作れるんだね。便利そう
2021/04/29(木) 17:02:11.90ID:IBkpf/CX0
激レアケースを例にあげて自分の失策を正当化するのは良くないぞ
今の時代にデータベースに入れにくいデータ構造にしたのは明らかにバカ
それがわからないならお前らも結局時代に対応できないんじゃんwぷw
2021/04/29(木) 18:39:45.09ID:Yt1JhF/90
1ビット脳の生活って楽しそうだよね
2021/04/29(木) 18:44:26.59ID:pn1fVmji0
>>507
rdbに突っ込むの前提ならcsvでも正規化されたテーブルが対象なんだから入れやすさなんかだけでは語れない。csvのデータは概ね正規化されたデータの結合と見れるので。
正規化·データの関連性を考えればjson·xmlの方が有利まである。
結局用途次第だと思うよ
2021/04/29(木) 19:28:20.05ID:MqlSo6MR0
>>505
10MBのデータ読んでメモリに乗せるのと、100KBに収まったデータを展開してメモリに乗せるの、だいたい後者のほうが早いぞ。
2021/04/29(木) 19:30:06.10ID:IBkpf/CX0
>>509
は?じゃあjsonそのまま入れてみろよ
2021/04/29(木) 19:32:01.32ID:gug0J2oaa
CSVはインポートで有利とか言ってる人が居るけど
ほとんどの場合インポート用CSVに整形する手間があるからトータルで損してるんだよね
2021/04/29(木) 19:36:37.76ID:IBkpf/CX0
>>509
そうやって実際にはできないことできるってなんで言っちゃうかな?
2021/04/29(木) 19:37:51.57ID:bhMl+eBD0
いつまでスレ違い無意味なマウント合戦続ける気?
2021/04/29(木) 19:45:35.14ID:MqlSo6MR0
>>511
MSSQLならJSONそのままインポートできるだろ。
https://docs.microsoft.com/ja-jp/sql/relational-databases/json/import-json-documents-into-sql-server?view=sql-server-ver15#parse-json-documents-into-rows-and-columns
2021/04/29(木) 19:47:56.90ID:h5Kbt4/jM
>>512
それはあるな
一応データエンジニア名乗ってて仕事でいろんなCSVをロードしてきたけど、貰ってきたCSVをそのまま取り込めるのは稀だわ
2021/04/29(木) 19:48:06.90ID:4VO5KYJUa
交通整理マンが出てこない時は(以下略

>>510
どんな圧縮率w
2021/04/29(木) 19:49:52.48ID:IBkpf/CX0
>>515
そんな誰も使ってない上に階層構造のjsonに使えるかどうかもわからん上に
さらに絶対仕事で使えないもの持ってきて必死だなw
採用実績あるの?ソレw
2021/04/29(木) 19:50:03.03ID:MqlSo6MR0
>>517
カラム名が長いなって思うようなデータだと、それぐらいの圧縮率になるぞ。
おまえやってみても無いだろ。
2021/04/29(木) 19:50:38.18ID:MqlSo6MR0
>>518
2016以降できるし、普通に使う。
2021/04/29(木) 19:52:56.86ID:IBkpf/CX0
>>520
絶対嘘だろw
2021/04/29(木) 19:53:21.85ID:4VO5KYJUa
>>512>>516
英語が世界共通語として機能しているのは
英語が優れた言語だからではない。

可搬性と技術としての優位性は完全に別問題。
2021/04/29(木) 19:53:32.90ID:pn1fVmji0
まぁすれ違いなんで最後で
>>513
そのままなんか入れないよ。
csvも正規化されたテーブルに分解·展開して入れる
jsonも正規化されたテーブルに分解·展開して入れる
データ構造の形で関連性が分かるのでこの点ではjsonのほうが有利
これはわかるでしょ?
まぁxml·jsonは言われている通りにdbmsがサポートしている場合があるから、その場合はそのまま入れればいいけども
2021/04/29(木) 19:53:48.66ID:MqlSo6MR0
>>521
なんで嘘つかないとならんのだ。

知らなかった事は、勉強になった、で済ませた方がいいんじゃないか?
2021/04/29(木) 19:55:35.85ID:IBkpf/CX0
>>523
じゃあ、できないじゃん

>>524
やってないってさw
嘘つきくん
2021/04/29(木) 20:00:29.06ID:MqlSo6MR0
>>525
俺は、やってるよ。
jqで突っ込む事もあるけど。
jsonで持ってるとnullと空文字の区別がついたりそこそこ便利なんよ。
2021/04/29(木) 20:01:40.70ID:IBkpf/CX0
じゃあ、jsonぶん投げて入れてみろよ
どこのテーブルのどのフィールドにどうやって入るかもわからんけどw
階層になってるデータをなw

なんでできないこと言っちゃうかなw
2021/04/29(木) 20:05:16.52ID:t8Qsv63f0
時空が歪んで20年くらい前の環境からレスしてるんだろ
火曜日のインターフェース不要さんと同じ人っぽいし
2021/04/29(木) 20:05:41.39ID:MqlSo6MR0
>>527
対応を設定する方法はこれな。
https://docs.microsoft.com/ja-jp/sql/relational-databases/json/convert-json-data-to-rows-and-columns-with-openjson-sql-server?view=sql-server-ver15#option-2---openjson-output-with-an-explicit-structure
2021/04/29(木) 20:09:44.80ID:IBkpf/CX0
データベース使うとインターフェースも出番ないよね
そういうテーブルないし
2021/04/29(木) 20:11:38.28ID:Yt1JhF/90
急加速してて笑
2021/04/29(木) 20:12:58.48ID:MqlSo6MR0
データとしての互換性は全く無いが、同様にinserted,updated,deleted列を持っているデータ、なんかはインターフェイス作っても良いんじゃないの?
2021/04/29(木) 20:38:56.88ID:CPrTMOXFM
>>510
だいたいって言われてもねぇw
圧縮ソフトによるけど1/100に圧縮できるソフトだとそれなりにCPU負荷もかかるだろうしね
2021/04/29(木) 20:50:11.97ID:qknGBKNj0
また圧縮沼に😅
2021/04/29(木) 20:51:47.22ID:nwdNubv1M
>>527
> どこのテーブルのどのフィールドにどうやって入るかもわからんけどw
> 階層になってるデータをなw
マジで知らないなら黙ってなよ…
1つのフィールドにjson形式でそのまま(内部的にはデシリアライズしてるだろうけど)入るんだよ
jsonをサポートしてるrdbmsはjsonの階層も含めて検索などができる
ただ、rdbmsによるだろうけど制約かけられないとかインデックス効かないとか色々制限あるので使い所はよく考えた方がいい
2021/04/29(木) 20:54:18.51ID:IBkpf/CX0
あっそう
2021/04/29(木) 21:09:28.12ID:PVZP3gNe0
あっそう w
2021/04/29(木) 21:10:59.33ID:JLw8VMIz0
流れあんま見てないけど何MBにもなるjson扱うって結構あり得る事なの?
GTA5も数十MBのjsonからのデータ読み込みがパフォーマンスのボトルネックになっててクラッカーが改善Mod作ったいうニュース見たけど、普通はそんな膨れ上がるならsqliteとか利用するもんじゃないのか?
2021/04/29(木) 21:22:08.52ID:MqlSo6MR0
>>538
あるよ。
ブラウザで3dモデル表示するときに使う形式にglTFってのあるんだけど、もろにデカいJSON。
540デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:20:12.08ID:QUExeogh0
プログラミングでファイル入出力を早くするにはやっぱり
良いGPUが必要なんでしょうか?
C#とGPUの関係を教えてください。
541デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:21:16.85ID:QUExeogh0
ちなみにGPUは欲しいですが3Dのゲームはしません(ゲーミングPCを購入予定ですが…)
プログラミングの良い環境を整えたいのでお勧めのがあれば教えてほしい
言語はもちろんC#です。
2021/04/29(木) 23:27:45.10ID:Gvkp+FCpM
そんなレベルならMac買っとくのが無難
なんでC#なのか知らないけどC#を選んだのもその調子じゃどうせまともな理由じゃないだろう
2021/04/29(木) 23:30:51.76ID:PtPwSG5y0
ファイル入出力はGPU関係ない
ストレージに左右される
HDDよりもSSDの方が速い

何のプログラム作るか知らないけど
WinFormsでアプリを作るならGPUは関係ない
WPFで作るならアプリの描画にGPUが使われる
2021/04/29(木) 23:40:25.95ID:DcwAc3waa
GPGPUってなんか暗号通貨のマイニング以外で聞かなくなっちゃた印象があるけど
C#から簡単に使えるライブラリとかあったりするん?
2021/04/29(木) 23:42:47.01ID:Eeg/SlYmM
>>538
あるだろうね
サーバーもクライアントもDB持ってるけどその間のやり取りはjsonでとか普通にあるから
ストレージとしての用途ならsqliteでもいいけど伝送手順として使われることも多いので
546デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:59:30.38ID:QUExeogh0
>>543
大学の課題でテキストを読み込んで文字列を探すプログラムを作ってます。
文字列を読み込むスピードをほぼ0秒にすると実行時間が短くてすむので
良いGPUはないかと思ってるんですがね。。。
547デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:59:59.65ID:QUExeogh0
ちな読み込むファイルの容量は100MB程度です。
2021/04/30(金) 00:14:03.55ID:ZjT67Y+80
折角回答してくれてる内容の1行目を声に出して10回読め
2021/04/30(金) 00:15:07.47ID:wixFV2dt0
>>546
GPU関係ないって書いてあるじゃん
重要なのはストレージとCPU
速ければ早いほどいいというだけ
550デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/04/30(金) 00:19:41.24ID:f4OC/lzG0
ありがとうございます。
どんな高性能なPCでも時間は0秒にはならないってことですね?
俄かに信じがたいですが、早くなる方法ないでしょうか。
2021/04/30(金) 00:26:18.54ID:wixFV2dt0
ジューダス版のJohnny B Goodええで
2021/04/30(金) 00:26:29.50ID:wixFV2dt0
ごめんw
2021/04/30(金) 00:28:43.93ID:IafryiiR0
信じられないなら信じられる別の場所で聞けばいいんじゃないの。
2021/04/30(金) 00:35:48.48ID:ZjT67Y+80
> どんな高性能なPCでも時間は0秒にはならないってことですね?
C#全く関係ないスレチ

あと元の質問自体が「サッカーで速く走るにはいいスパイクが必要なんでしょうか。シュートとスパイクの関係を教えてください」みたいな謎文脈なので、
こちらはそっちの脳内でどんな解釈されてるのか、まるで見当が付かない
2021/04/30(金) 00:45:47.98ID:FVXE5M810
>>550
そういう根拠のない思い込みでこうなるはずなんて思考をしてたらプログラミングなんて理解できなくて詰むから、早いうちに矯正しろよ
まあ根っから性分だろうからもう手遅れだろうけど
2021/04/30(金) 00:55:52.99ID:1FoMz0PJ0
今jsonの話で忙しいのに話の腰を折る荒らしにしか見えない
2021/04/30(金) 01:50:11.84ID:OqlMgVmX0
なんだそれジョークか?
2021/04/30(金) 06:01:15.69ID:6G/EU7oZd
大学の課題でスペックの条件が必要なの?
無駄のないロジックを書くとか、そういうのが目標だったりしないのかな。
なんだったかな。C#だったらライブラリのメソッド一発で終わってしまう話だよ。
スペックが必要ならハードディスクじゃなくてSDとかの電子メモリにするだけ。
2021/04/30(金) 06:33:18.17ID:9CWg3MHlM
なんで相手するかなぁ…
2021/04/30(金) 07:21:05.92ID:c/yKDnhO0
うっわ
ファイル名変更ってgit上で削除→追加になるのかよ
なんでこんな仕様なんだ面倒くさい
2021/04/30(金) 08:20:45.76ID:/49R4AUmD
大学生が処理時間を0秒にできると考えてることが恐怖
2021/04/30(金) 08:31:59.95ID:hl1Q3MIe0
>>560
git mv
2021/04/30(金) 08:49:07.02ID:c/yKDnhO0
すまんVisualStudioスレじゃなかったな
2021/04/30(金) 09:24:19.33ID:QS3EuJUrM
まあgitはC#プログラマーでも使ってる人多いし、意味不明な大学の課題よりマシ
2021/04/30(金) 12:19:19.36ID:2B0L3g8/0
c# でもファイル名変更はFile.Moveメソッドだし、考え方は同じだと思うがな。
566デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/04/30(金) 12:37:03.29ID:clFaH4DRM
>>561
中2ぐらいなら許される?
2021/04/30(金) 13:53:37.33ID:IafryiiR0
真面目な話、設問の但し書きの部分を真に受けただけなんでは、とか思うのだけど。
「ただしファイルI/O などの処理時間は無視できる物とする」とかの。

大学の課題に取り組むのに私物のゲーミングPC を用意するって時点で意味が不明だもの。
私物の環境で設問をクリアできてもそれを持ち込むことなんて出来ないだろうし。
どこかを取り違えてたんだろ。
568デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/04/30(金) 14:02:57.22ID:clFaH4DRM
並列処理においてボトルネックになりやすいのがI/O
そこを改善しようと試みるのは良い
ただしこの場合C#とは関係ない話なのでスレタイすら読めない脳足らずという事になる
2021/04/30(金) 15:01:33.00ID:Fe1MTD+iM
いつまでその話題やるの?
2021/04/30(金) 17:03:31.63ID:OOQWIiqB0
最近はサーバーで、データベースのCPU が不足する事も多い
2021/04/30(金) 21:55:35.01ID:HehJ8LLK0
C#とJAVAを併用してるけど、C#の解説者のほうが深く理解していて簡潔に解説してるね。
JAVAはコピペで説明していて、動かないことも多々ある。採用人口が多いのに不思議
androidの仕様変更が原因のときもあるけど、C#は洗練されて理解しやすい。
つまりC#を扱う人はレベルが高いと感じる
2021/04/30(金) 22:21:45.51ID:kkXqBkDB0
Javaは裾野が広い分ゴミとの遭遇率も高いのかと
573デフォルトの名無しさん (ワッチョイ 2701-SFYt)
垢版 |
2021/04/30(金) 23:53:02.12ID:fJ1TA+qd0
/// 問題点 ///
処理をどのクラスに持たせるのかの指標がわかりません。。。
同時にクラスの分ける粒度感もわかりません。。。

/// 質問 ///
どのクラスにどの処理を持たせれば良いのでしょう?
そもそも何をクラスにしたらいいのでしょう?

/// 具体例 ///
前者でいえば例えばドキュメントクラスとプリンタークラスがあって印刷するメソッドはプリンターに持たせるのかドキュメントに持たせるのか決めきれないということです。
後者でいえば例えばキャラクタークラスがあってそのクラスはHPクラスやMPクラスを作りインスタンスを持つべきかそれともただ単に値型のフィールドとして持つのかどちらが良いのか判断しきれないです。
2021/05/01(土) 00:34:45.81ID:vLfObWug0
>>573
前者の例は現実と一緒じゃダメなん?
印刷の機能は書類じゃなくてプリンターの仕事。

後者はどうなんだろう。
自分なら、値型の方が代入比較が簡単で早そうだから、ギリギリまで何でも値型で。
でも、参照型の方がクラス継承とか参照渡しとか出来るから、その時の都合で使う。
機能と性能、仕様と規約、自分の主義で決めたらいいかと。
2021/05/01(土) 00:35:58.96ID:u8jqB+2A0
>>573
お答えしましょう
どこに書いても動きます
好きなところでいいですよ
2021/05/01(土) 00:37:52.50ID:GAZiMPha0
C#関係ないやね
折角なので答えると正解はない問いだと思う。みんながベストを探してる
つくるソフトや環境で適切なモノを周りと相談して作り上げるしかない

とりあえずの指標という意味であればDDDについて調べると具体例の質問については答えが得られるかもしれない
特に後半はvalueObjectとEntityと言われるもの
ただしこれも小規模のソフトで取り入れても冗長になるだけという問題もある
2021/05/01(土) 00:45:41.04ID:ToMJKZXq0
>>573
1. どういう選択肢があるのかを把握できる力
2. それぞれの選択肢のメリットとデメリットを理解する力
3. 用途に対してより適切な選択肢はどれなのかを判断する力

あらゆる設計判断には上の3つの力が必要だが土台となるのは1と2の力
それらの力をつけるためには考えられる複数の選択肢をそれぞれ簡易実装してみて比較検討するのが一番
失敗を数多く繰り返すのが上達の近道

どのクラスにどの処理をもたせるのがいいのかは用途次第でケースバイケース
one size fits allな答えはないのでやる前からそれを求めていても進歩しない
2021/05/01(土) 00:47:18.48ID:F0kMZy38a
どっちでもいいからまず作れ
なんかへんだなと思ったらリファクタ
2021/05/01(土) 00:54:13.87ID:CrHqAudLa
>>573
そういうのはやる前からいろいろ考えるより
「失敗したらやり直せばいい」と考えてとにかくいろいろコードを
書いてみることが大事。

老人より子供の方がスマホなんかの操作を覚えるのが早いけど、
あれと同じだね。

アントニオ猪木のポエムのノリでw
580デフォルトの名無しさん (ワッチョイ 2701-SFYt)
垢版 |
2021/05/01(土) 01:21:16.01ID:5wEuRr/u0
574から579の方々
ありがとうございます。
とりあえずやってみるというアドバイスが多かったので実装から着手していきたいと思います。

この質問の背景としてはクラス図やUMLでの設計をしてC#コードに落とし込もうとしてクラス図がごちゃごちゃし出してコーディングまで行けなかったという経緯です。
(OOPの話でc#そのものの質問でなかったのは申し訳ない。とはいえc#初心者の人でオブジェクト指向が初めての人は少なくないはずなのでやはりこういう質問になりがちな気もする)

様々な意見感謝です☺
参考させて頂きます。
581デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 10:59:09.68ID:BCm84eaD0
この前質問したバカですが(一応国公立)
何故レースゲームは膨大な建物や道路データをリアルタイムに
読み込めているんでしょうか?どういう仕組みなんですか?
例えば1Gのテキストファイルを読み込もうとすると実験しましたが、10秒かかってしまいます。
テキストファイルではなく、グラフィックデータを瞬時に読み込めるのはなぜですか?
C#より速い言語なんでしょうか?
2021/05/01(土) 11:07:42.89ID:bkjJ/QRj0
>>581
streamとして必要な分だけ読み込む、圧縮したデータを読み込んで展開する、あらかじめパーツを指定しその配置だけ読み込むなどなど
最初以外C#は関係ないから該当する板でやってくれ
ゲ製作技術
https://mevius.5ch.net/gamedev/
2021/05/01(土) 11:10:22.30ID:Bazlrq4sd
>>581
そのレースゲームがどんなんだか判らないけど、
ゲーム中じゃなくて起動するときに10Gでも100Gでも、
あらかじめ10分かけて読んでおけば良いんじゃないかな。
圧倒的に問題に対する条件が乏しくて、どう考えればいいのかこちらも判らないよ。
584デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 11:22:20.62ID:BCm84eaD0
>>583
市販のゲームは10分もかかりませんが、何故でしょうか?
2021/05/01(土) 11:25:02.89ID:B2x+2kSO0
地図上の物体検索とかなら
numerical recipes の3rd edition に
説明があるからそれを読みたまえ。

なお日本語もC#版も無い
2021/05/01(土) 11:35:09.71ID:nO6fZcYL0
>>584
583は分かりやすく極端な例を出しただけで常識的に考えて10Gのデータ読み込みなんてしないっしょ
大体重めのゲームでも起動時やマップ入場時のロードは500MBくらいじゃね?
つまりそのレースマップ入場時にそこで必要なグラフィックデータを数十秒かけて読み込ませればいい
2021/05/01(土) 11:52:19.99ID:nO6fZcYL0
>>584
君のレス追ってみたけどゲームじゃなくて目的はテキストファイル?
ファイルI/Oにボトルネックがあると思ってるようだけど、テキストファイルだとしたらボトルネックはエンコードにあるんじゃない?
File.ReadAllTextは割とオーバーヘッド大きいから、.NetCore3以上でSpanを利用したエンコードを構築すればいくらか早くなるかもしれない
2021/05/01(土) 12:02:16.59ID:79IzxePJa
>>581
自分もゲームまったく知らないので偉そうなことは言えないけど、
いきなりそんな高度な話より、例えば40年前のゲームのスーパーマリオは
たった30kBの中にどうやって32面分オーバーのマップデータを詰め込んだかを
考える方が有益だと思う。

要するに本質はI/Oじゃなくてデータをどうやって圧縮/展開するかじゃないの?
「リアルタイムで(ストレージやネットワークから)読み込み」なんかしてるはずがないと思うけど。
2021/05/01(土) 12:54:20.94ID:R4IHrQy80
馬鹿は的確な質問ができないってのを凄い的確に示してくれている
590デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 12:58:57.73ID:GvoaCTGBM
ファミコンカセットはROMアドレス指定でCPUからダイレクトアクセス出来る
初期以外はアドレス足らないからマッパーで切り替えてる。物理で
591デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:13:02.51ID:GvoaCTGBM
プレイステーションのすごいところは
ファミコンやPCエンジンと違って
ロード中にギャラガができる事
作りての工夫によってロード時間ゼロにすることが可能
ドラクエなんかはマップ切り替え直後はエンカウントしないよね
592デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:34:26.28ID:GvoaCTGBM
サガフロの5連携が3連携で一休みしたりサガフロ2の連携が我々のレベルになると通常と変わらず目で追えたり
RAMが少ないと苦労が耐えないですね

えーっと500MBでしたっけ?ウフフ
2021/05/01(土) 13:37:34.47ID:/yhKW3U+0
>>591
ファミコンはそもそもロード時間ないだろ
594デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:39:40.13ID:GvoaCTGBM
>>593
円盤システムの話なので
2021/05/01(土) 13:41:51.01ID:/yhKW3U+0
>>594
ファミコンやPCエンジンと違ってって自分で言っとるやん
596デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:47:26.99ID:GvoaCTGBM

つまりdiskとdiscについて話し合いたいってこと?

スレ違いでは??
2021/05/01(土) 14:03:33.45ID:v2ArV8E8D
>>581
結婚式場を出たら、もう披露宴会場が準備されていました
これを披露宴会場の支度を瞬時に終えたと言うことだと思うか?
2021/05/01(土) 14:26:22.67ID:CCHnejZpa
MIDIとかMMLの方がたとえ話としては適切だったかな
たった数10kBのMIDIファイル一つで16bit-48kHzの音を何分も出力できるのはなぜなのか。
1分音を鳴らすのに6MBの量子化データが必要なはずなのに
599デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 14:40:58.52ID:GvoaCTGBM
つまり薄っぺらな嘘を伸縮自在な愛で…
600デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 16:17:08.68ID:BCm84eaD0
>>586
10Gは大きいとか目安が分かるのすごいですね。
ゲーム制作者じゃなくてもわかるんですか?
>>587
そうなんですよ。テキストファイルを読んで、特定文字列の抽出カウントを
行いたいわけです。C#じゃなくてC言語なら夢見れますか?
低級感があって爆速なイメージですが。
>>588
難しいですがゲームプログラマが夢なんで、思考自体は高度になりがちです。
まず30kbってのはメモリ領域でですか?磁気領域でですか?

そもそも何でCPUの進化バージョンGPUは存在するのに
HDDの進化バージョンGHDDみたいなのは無いんですかね。

あったら困るんですかね?
2021/05/01(土) 16:28:44.50ID:LX/vNMTG0
うん、C#じゃなくてC言語がいいと思うよ。
頑張れ
2021/05/01(土) 16:29:01.53ID:5BASMYuN0
高度どころか怠慢な素人丸出しなんだが。

高度なことを望むならまず地道に足場を固めていくべきじゃない?
すごいことをやってる(みたいだ)から、その方法を教えて!じゃなくて、自分でその理由を調べることをしないと成長はないよ。
2021/05/01(土) 16:33:44.86ID:k3UheK6C0
少しずつ積み上げた方がいいという意味を早めに分かった方が良いかと思う・・・
2021/05/01(土) 16:35:36.04ID:qXtdoAsC0
GPUはCPUの進化バージョンではない。
テキストファイルから特定文字のカウントするのに、全部メモリに乗せる必要は無くて、適当なサイズずつ読み込みながら文字カウントしたら?
別にC#でもそんなに重くないと思うけど。
2021/05/01(土) 16:35:45.23ID:IqH/tXjj0
>>600
まだいたんか
ファイルの読出しにGPUが関係するとか変なこと言ってたから素人だとは思うけど
まず>>602が言うように足場から固めていった方がいいよ
ゲームは小さい処理の積み重ねなんだし

ファイルIO
データの圧縮展開
CPU/GPU制御
並列制御
アルゴリズム
etc・・・

一人でやるんだったら全部自分で制御しなきゃいけないんだし
2021/05/01(土) 16:52:35.85ID:qdLbyML+0
このセンスの無さすぎはひどいな
ゲーム作りたい中学生でも簡単に理解できる話なのに
2021/05/01(土) 17:23:02.96ID:v2ArV8E8D
597には応えてくれなかったな
質問を変えよう
母に呼ばれてリビングからダイニングに行ったら食事の用意がされていました
これはリビングから呼ばれた者がダイニングに行くまでの一瞬に、
母が食事を用意したと思うか?
2021/05/01(土) 17:36:18.28ID:h1NN14xsa
>>600
ストレージの「革新」については15年ぐらい前にこんなのがちょっと話題になった。
だけど、自分が知らないだけかもしれないけどその後の進展を聞かないね。
https://gigazine.net/news/20060710_mram/

NVRAM的な物のコストが下がれば記憶デバイスのカーストの中にある
メモリーとストレージの間の分厚い壁が崩壊するわけで、かなり革命的な
ことなはずなんだけど。
2021/05/01(土) 17:59:43.20ID:h1NN14xsa
しかしいつもの交通整理の人はこんだけ質問者が罵倒されてるのに何で黙ってるのかね。
ここはそういう行為が禁止されているはずのスレではなかったのか(笑)
2021/05/01(土) 18:12:14.87ID:4GddeLjJM
それ以前に連休で暇だとしてもなぜこんなみえみえの嵐に付き合うんだよ…
2021/05/01(土) 18:28:58.67ID:R4IHrQy80
外も嵐だからね(意味不明)
612デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 18:53:13.69ID:BCm84eaD0
>>607
いやわかりますよ。料理を調理する時間が
HDDアクセスってことですよね?ただ料理と違う部分は、煮えるまで待つとかなくて
目的のものをとってくるだけでいいから、一瞬でその場所にいけたら、
基本的には0秒なんですよね。HDDのシークバーがその場所から動く必要がなければ最速ってことですよね。

すいません、そろそろ去ります。
基本的にC#単独では無理という結論にしました。。。
2021/05/01(土) 20:10:11.18ID:GAZiMPha0
本人に聞きたいわけじゃないのだが、基本的に0秒ってどういう意味なんだろう
文中に出てくる一瞬って言葉は0秒じゃないし、なのに一瞬で行けたら基本的に0秒ってのはどういうことなんだろう
小数部は切捨てて整数部だけを考えることを基本的にって言うのかな?
2021/05/01(土) 20:12:10.14ID:IqH/tXjj0
蒸着スピードは0.05秒
2021/05/01(土) 20:14:14.93ID:nnvUFYDz0
薄さ0.02mmでも付けてるんだぜ
616デフォルトの名無しさん (ワッチョイ dfe6-HlUj)
垢版 |
2021/05/01(土) 20:16:16.11ID:hvNg7eLP0
HDDの代わりにGPUにデータファイルを置けば速いって意味だろ
2021/05/01(土) 20:18:32.92ID:5BASMYuN0
その後に思ったことなんだけど、ファイルI/O 以外の処理速度が気になる。
100MB だっけ。そのテキストファイルの中身がメモリにあったとして、検索が終了するまでの時間はどのくらいだったんだろう。
618デフォルトの名無しさん (ワッチョイ dfe6-HlUj)
垢版 |
2021/05/01(土) 20:22:53.83ID:hvNg7eLP0
>>617
流石に大学生をバカにし過ぎでは?
2021/05/01(土) 20:28:50.64ID:jUoUZG3Jr
>>612
君は面白いおもちゃだな

実際に1秒で100MBでしか読めなかったらそれを使ってどうやって派手だったりリアルな画面を作ってやろうかと思うのが
PGやゲーム制作者です
ハードに自分の要望を求めるのは単なる消費者です

昔はもっと制約が厳しかった
自分たちは子供のころからそればかり考えてた

あおりでもなんでもなくあなたには向いていません
2021/05/01(土) 20:30:35.88ID:Bazlrq4sd
いわゆる「ロード中」っていう処理待ちをさせずマップ切り替えが可能なゲームがあったけど、そういう話かな。
古い時代の話だから、今じゃ大したこと無いかもね。
2021/05/01(土) 20:32:10.77ID:jUoUZG3Jr
ハイドライド3
2021/05/01(土) 20:33:10.01ID:jUoUZG3Jr
1秒じゃなくて10秒だったな
2021/05/01(土) 22:04:23.51ID:u8jqB+2A0
そもそもPCのマザボに
CPU、メモリ、HDD、グラボ乗ってんだから
それぞれに行き来するのに時間かかるってわかるやろ

CPU↔メモリ↔HDD
メモリ↔グラボ

とりあえず物理的にどうやってくっついてるのか調べるべきだと思う
2021/05/02(日) 00:05:56.42ID:Jc9e5ibud
まぁ自作したことすらない子も多い。
うちの会社もゲームやゲームハードも作ってるとこなのに開発メンバーなのにスカジーケーブルすら知らん子が入ってきてる。
抽象化や隠蔽化が進んで上のレイヤーばかり意識するようになってるから地盤が無い。
2021/05/02(日) 00:19:41.09ID:9GC+BpRR0
>>618
そお?
動作を「速く見せる」ための制約条件としては確実に必要な要素なんだけどね。
いまさらだけど。
626デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/02(日) 00:23:00.38ID:BrJlALbya
>>624
SCSIなんか知らなくて当然だし別に何も問題ないと思うよ
むしろ「お前らこんなの知らないだろう」オジサンの方が問題だw
2021/05/02(日) 00:25:26.19ID:BrJlALbya
もうISAやCバスだって知らない人の方が多いよね。下手したらAGPも
それどころかPS/2やLPTみたいなちょっと前のレガシーポートだって
今の20代の大半は知らないだろう
2021/05/02(日) 00:29:06.70ID:Jc9e5ibud
その辺の事務や営業じゃなくて、コンピュータハード作ろうという子がバリバリ現役のスカジー知らんとか相当不勉強なんだけとw

Unityでちゅろっとゲーム作るような層じゃあるまいし。
2021/05/02(日) 00:35:00.92ID:BrJlALbya
>>628
SCSiが現役な程度にはISAバスだって一部の産業用途で現役だけど、
さすがにあなたもISA知らんのは不勉強とか言わんでしょ(笑)

要するにそれ自分中心主義なんだよ
そういうおじさんみっともないよマジで
2021/05/02(日) 00:42:55.47ID:smoYWJQA0
一部業界でしか生き残っていないものを知らなくて当然
SCSIが一般的でなくなってから相当経つからな
2021/05/02(日) 01:03:34.73ID:WAC22cE20
コンシューマゲーム機だとSCSI使ってたのは、ドリームキャストとかGBAの世代までだったなー
SCSIは相性があるから結構厳密に型番指定されてたっけ
そしてそれら以降のハードはみんなUSBだった気がする
2021/05/02(日) 11:04:21.93ID:9GC+BpRR0
「SCSIを知ってる」ってどのレベルでのことを言ってるんだろう。
名前を知っていればいいレベルなら、必要になったときに調べれば済むんじゃ。
昔に流行ったの技術を知らないのは不勉強、って言われても困るような気がする。
2021/05/02(日) 11:34:55.65ID:kVgm1y330
SCSIは抽象化されて残ってるじゃん
物理インターフェースだけの存在じゃない
iSCSIなら当たり前に見かけるだろ
そもそも0と0を超えた時間とを同一視し、
0にならないことをにわかには信じられないと宣う国公立大学生って嘘くさい
国公立中学生っぽいからまずは基本情報技術者の勉強でもして、
言語とハードウェアの関係から学ぶのがよさそうだね
2021/05/02(日) 12:23:17.90ID:i3WiXYxp0
sasはまだ現役でしょうに
2021/05/02(日) 12:30:57.35ID:smoYWJQA0
抽象化や隠蔽化の進んでいない下のレイヤーの話としてのSCSIケーブルだから
iSCSIやSASは想定していないと思うけどなぁ
2021/05/02(日) 13:02:24.18ID:PbhH3UoFD
それは今の必須知識じゃないからね
SCSIバスやケーブルの知識があっても、今となっては古いシリアル規格の知識でしか無い
2021/05/02(日) 13:16:44.85ID:bVQBnZjhM
> C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
> C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください

大事なことなので…
638デフォルトの名無しさん (ワッチョイ 2701-SFYt)
垢版 |
2021/05/02(日) 13:26:41.16ID:6VPLrRfP0
インターフェースって継承以外でインスタンス化してフィールドに持たせるように使う場合があるけど、それって違う場所に定義している関数を呼び出して使うような感じ?
いまいちインターフェースの使い方がわからぬ
2021/05/02(日) 13:41:54.97ID:Jc9e5ibud
「コントロールがきかない、再コンパイル依頼が効かない」第三者にバイナリのdllを公開してかつ、3年5年と更新しつづけていけばいやでもわかる。
2021/05/02(日) 13:48:58.41ID:JVX0w7410
オブジェクト指向の言語やってて、デザインパターンの勉強しない奴とか居るんだな。
2021/05/02(日) 13:51:59.04ID:gOHPQIPOM
それぐらいなら別にinterface要らんけどな
自社DLLの指し替えOKならメソッドの中身変えるのはできる
TypeScriptのinterfaceぐらいになったら便利だけどC#やJavaのinterfaceはそこまで重要じゃない
2021/05/02(日) 14:46:34.33ID:hSgvj4Ff0
>>638
実装を入れ替え可能にするために使う
インターフェースを使う側はインターフェースがどう実装されてるかを気にしない
関心事の分離や責務の分割というやつ

public class CustomerService
{
private readonly ICustomerRepository customerRepository;

public CustomerService(ICustomerRepository customerRepository)
{
this.customerRepository = customerRepository;
}
}

CustomerServiceはcustomerRepositoryがどういう永続化技術を使ってるか関知しない
RDBMSを使った実装からKVSを使った実装に変更したとしてもCustomerServiceクラスは変更する必要がない
単一責任の原則や依存性逆転の原則というオブジェクト指向設計の基本原則に従ってる
2021/05/02(日) 14:53:27.70ID:vJ/g4PX7a
>>638
全然違うものを透過的に扱いたい場合ってあるでしょ?
例えばビデオゲームで入力デバイスとしてゲームコントローラーだけでなく、
キーボードやタッチパネルも使えるようにしたいとか。

とりあえずはInterfaceはそういう要求を満たすためのものだと
理解しておけばいいよ。それ「だけ」ではないけどね
2021/05/02(日) 15:09:58.26ID:vJ/g4PX7a
汎用性を高めるためって考えた方が分かりやすいかもね。

昔テレビデオってあったけど、世の中にHDMIみたいなインターフェイスが存在せずに
ああいうモノリシック構造の機械しか存在しなかったらどんだけ不便か考えれば
インターフェイスの意味なんてイチコロだと思うけどな
2021/05/02(日) 16:17:56.85ID:jdfWZ4dSM
最近はそういうのは関数を渡すんでよくなってる
2021/05/02(日) 17:53:29.91ID:two2wwYId
関数を渡すとしても、引数なり戻り値なりの型を定義しないとならんしな。
実装を含まない定義を切り出しておかないと、容易に循環参照になってクリーンビルド出来なくなるぞ。
2021/05/02(日) 18:03:29.16ID:sTlH4cY7a
>>645
デリゲートで済む用途に(無理に)インターフェイスを流用しなくて済むようになっただけ。
648デフォルトの名無しさん (ワッチョイ df61-Lr3t)
垢版 |
2021/05/02(日) 18:14:35.65ID:KSgMbN0G0
インターフェイスつかってるとVisualStudioで定義に飛んでもメソッドの実装見れないから腹立つんでやめてください。
2021/05/02(日) 18:16:04.86ID:two2wwYId
>>648
逆に、実装を見るなという意思表示では?
650デフォルトの名無しさん (ワッチョイ df61-Lr3t)
垢版 |
2021/05/02(日) 18:24:40.27ID:KSgMbN0G0
>>649
見られたくない恥ずかしい実装してるってことですねわかりました
2021/05/02(日) 18:25:03.65ID:t+a18Ga0M
class X: IX {
private IY y;
public X(IY yy) {y=yy;}
public T foo(U u) { ... }

↑こんなの冗長で面倒くさいだけじゃん
↓これでいいんだよ

static class X {
public static T foo(Func<...> y , U u) { ... }

C#最大の欠点はTSなどと違ってトップレベル関数を定義できないことだな
まあそのうち導入されるだろうけど

>>647
まあそうだね
そしてデリケートで済まない用途なんてのは、ないんだなこれが
2021/05/02(日) 18:48:49.12ID:sTlH4cY7a
OKでは

(1) IEnumerableと機能的に等価なものを実装してみせてほしい

(2) IComparable<T>はComparison<T>で置換できるが、
  (a) ジェネリックでIComparableで制約をかけるのと同じことはどうやって実現するのか?
  (b) 毎回いちいちComparisonを指定しなきゃならん煩雑さはどうしてくれる?
2021/05/02(日) 19:00:20.53ID:2vdkVbTy0
>>651
Funcの型と、Uはどこで定義した何なの?
俺ならUはインターフェイスにすると思うけど。
fooを呼ぶ側も、foo側からも参照できる型である必要があるよね。
なんとなくプリミティブしか意識してない気がする。
2021/05/02(日) 19:41:10.32ID:sTlH4cY7a
制約の問題はIComparableぐらいならコンストラクタで必要なデリゲートを指定しないと
インスタンス化できないようにするみたいなことで解決できるけど、
インターフェイスのメンバーが多かったりイベントを含んでたりするとそうもいかんね。
2021/05/02(日) 20:12:47.50ID:t+a18Ga0M
>>652
(1)
var (moveNext, getCurrent) = MyGetEnumerator(x);
シンタックスシュガーは流石にコンパイラのサポートないと無理よ

(2)
(a)言語サポートないと無理だね
逆にいうとそういう機能を言語でサポートすりゃいいんじゃない?
言語機能の利点であってinterfaceの利点じゃないよねこれ
(b)もっともらしいデフォルトを用意するだけ

>>653
Funcはシステム定義だが?
TやUは架空のコードでよくあるただのプレースホルダであって特に意味はない
どこかで定義されていると考えていいよ
2021/05/02(日) 21:45:53.38ID:2vdkVbTy0
>>655
プレースホルダはわかってる。
引数の型の定義場所が問題だって言ってんだけど。
実務したことない?
2021/05/02(日) 21:58:29.87ID:+xOhjhDaM
>>656
言ってること意味不明だから多分君なんか勘違いしてる
2021/05/02(日) 22:16:38.89ID:keNMubny0
>>648
Ctrl+F12でよくない?
2021/05/02(日) 22:20:11.10ID:/HNwvjpa0
>>648
実装へ飛ぶ的な右クリックメニューがある
2021/05/02(日) 22:52:19.04ID:vVweUfCP0
実装に移動なんてあったんだな
これかなり助かるわ
2021/05/02(日) 23:12:46.37ID:OnfmzaV30
>>657
クラスに実装するのなら、ドメインに焦点を当てたクラスにその実装も凝集されるけど、
外部からデリゲートで渡す場合はそのデリゲートをどこに定義すんのって事じゃない?

1回しか使わないのなら匿名関数でいいけど、複数箇所から同じ用途で使うのなら書き捨てじゃなくどこかで定義しておきたいと思うし、
更にそれが一体何のための処理なのかを設計に落とし込むなら適切な場所で宣言実装しないとだし

抽象的な話してると自分の頭じゃ理解しきれないな
こういう設計の場合こうすればよくね/こういう問題があるやんっていう具体例が欲しい
2021/05/02(日) 23:55:49.46ID:2vdkVbTy0
>>657
>>661が殆ど言った。
インターフェイスはインターフェイスで切り出しておかないと、
完全に単一のアセンブリでやらない限り、循環参照しがちだぞ。
AクラスのメソッドFooがBクラス受けてて、
BクラスのメソッドBarがAクラス受けてるだけで困ったことになる。
これはA.Foo(B)→B.Bar(C)→C.buz(A)と遠回りになってもそう。
2021/05/03(月) 00:35:06.67ID:AKP9VyEvM
>>661
構文レベルでクラスで書く意味はなく、関数でこう書けばいいでしょ、って意図のレスに対して
その疑問(設計レベルの問題)って方向性ズレてるってことは理解してる?
まあいいけど

ドメイン上のある責務に関連した処理をまとめたいって意図で聞いてるなら、モジュールで分ければいいよ
クラスは要らない

例えばOOPでIY, YがリポジトリでIX, XがリポジトリのCreateメソッドを使う何らかのサービスだったとするよ

関数で書くときはYモジュールにget, update, create, deleteなどの関数を定義する
Xにはfuncを定義して、もし関連性が高い別の機能もあればまあ一緒に定義してもいい
んで実行時にはX, Yをインポートして
func(create, u);
みたいにして呼び出すだけでしょ
funcとcreateをバインドして
_func = u => func(create, u);
みたいにしてDIでやってるようなこともできる

これならインターフェースもクラスも要らんよね?
関数だけがあればいい
構文上のムダが多いクラスを使う利点はほとんどないよ

>>662
相変わらずなにが言いたいかわからん
2021/05/03(月) 00:50:26.13ID:MrRb6D/k0
>>663
なんでわからんのかな。
2021/05/03(月) 01:00:53.01ID:ppBWlDH7M
>>663
できるできないの話ならアセンブラなら何でも実現できるよw

> 構文上のムダが多いクラス
と言うなら何がどうムダなのかを書かないと単なる個人の感想にしかならないよ
2021/05/03(月) 01:42:30.76ID:FYXS8pYUa
>>665
>できるできないの話ならアセンブラなら何でも実現できるよw
意外にこれが本質だろうね。

一昔前のOOP批判にも「構造体でも同じことが実現できる」ってのがあった。
そりゃできるに決まってるが、そういう批判には無理してそうやって
書いたコードが果たして人に理解しやすいのか、
人間の認知能力に親和的なのか、という視点が欠けていた。
2021/05/03(月) 01:44:06.35ID:p8zZzwHv0
おじいちゃんこないだから暴れ過ぎ
OOPもInterfaceも不要って何でC#使ってるんだろう
2021/05/03(月) 01:44:36.83ID:JIK/4A/q0
xview/sunview のAPIは全部構造体だったなぁ
2021/05/03(月) 01:46:57.30ID:el9v2bCt0
>>663
構文レベルでは引っかかるところは無いので、設計レベルの質問した感じ
自分の理解があやしいのは自覚してるので質問しつつ補おうとしてる ※自分は半人前くらいなので

663読んで見えてなかった場所が見えたのだけど、
>>651のコード例でいうとIYとYの定義が無くなって、代わりにYモジュール増えてるんだよね?
差し引きで言うほど構文が楽になってる?この辺は個人の感覚だけど、そんな変わらないような気がした

ついでにいうと、Xから見たときに何やってるのか解らなくなってる気がした
インターフェース使った時であれば詳細は良くわからんけどリポジトリ用のIYインターフェース使ってそっちに任せてるんだなという隠蔽だけど、
デリゲートでやると何か良くわからん関数受け取って処理させてるわってならない?
2021/05/03(月) 02:08:36.88ID:PW8YFNOca
>>666
関数のほうが認知しやすいよ
OOPみたいにあちこち参照しないし
interfaceのように不要なメソッドにも依存しなくなる

>>667
ぶっちゃけ昔は選択肢が少なくJavaよりC#のがマシだからって理由かな
あとは惰性

>>669
C#だとトップレベル関数がないからあんま変わらんかもな
C#も近いうちに変わっていくと思うよ
デリゲートが何やってるかわからないなら命名に失敗してるってこと
命名に失敗したらデリゲートだろうがinterfaceだろうが同じようにわからないよ
2021/05/03(月) 03:11:07.27ID:oM0LAQLj0
>>667
突き詰めるといらない
だってc言語で完成されてるし
だから場面場面で使用するメリットを説明できるかってのは重要になると思う

先読みでの将来的に〜になる見込みで
先行投資を現場のPGの勝手な判断で行ったってのは相当アホな所業
2021/05/03(月) 08:08:21.32ID:MrRb6D/k0
Interfaceが不要なメソッドってのも意味がわからんのだがな。
OOPでなくとも、型のキャスト可/不可には、インターフェイスがあったほうが良い。

これはGoみたいな、トップレベル関数で書ける他の言語でも同じ。
2021/05/03(月) 08:20:32.49ID:kW5Idv8oM
ここはC#初心者のためのスレのはずなんだけど
このおじいちゃん、なんでこのスレで自分の主義主張を振りまいてるんだろう?

自分の書き方が2021年時点で一般的な書き方と大きくかけ離れた時代錯誤なものと分かったうえで
初心者にもそういう書き方を強要したいの?
それとも誰かに構ってもらうのが目的なの? 自社の若手に煙たがれて敬遠されてるとこういうスレでクダを巻きたくなるのかな?


率直に言って、このおじいちゃんは
Rubyガイジ並みorそれ以上の害悪だからもうこのスレで書きこまないでほしい
2021/05/03(月) 08:36:10.53ID:MrRb6D/k0
どっちの指摘?
2021/05/03(月) 09:50:34.48ID:AZIpChV60
構う奴もガイジって20年前から言われてるはずだがいい加減学習できないのかねチンパン君
676デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 11:36:41.28ID:8gAH2GR/M
昨日は触れなかったけど、関数のメリットの中でも特に大きいのは、テストのしやすさね

インターフェースにしちゃうと、テストモック作んのが面倒くさすぎんのよ
いちおうモックフレームワークみたいなのもあるけど、ありゃプログラミングパズルみたいでマトモじゃない
長くメンテナンスするには疲弊が勝る
そもそもなんでモックが必要になるかって
、OOPでインターフェース使ってDI、なんてことをやるから無駄にオブジェクトの数とオブジェクト間の参照が増えていくからだ

関数なら簡単だ
都合のいいラムダを渡すだけ
関数には無駄なオブジェクトも参照もない
これ以上にシンプルなものはない

これを知ってしまうとOOPなんてやってられんくなるよ
2021/05/03(月) 11:37:53.09ID:WvqQmPZG0
まあ1対1のインターフェースは要らないな
複数のクラスを同じ仕組みで扱うときに有効になるものだ
2021/05/03(月) 11:42:45.35ID:KphYKkJEd
都合の良いラムダを渡すだけ。
そのラムダの引数の型は?

普通ベースクラスかインターフェイスでは?

なんか勘違いしてる気がする。
アセンブリ1つが前提になってる?
2021/05/03(月) 11:45:24.03ID:KphYKkJEd
>>677
そりゃそうね。
680デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 12:09:02.97ID:bhpArzgTM
>>677
それ関数でいいよ

>>678
意味不明
2021/05/03(月) 12:19:41.29ID:US3b2rihD
>>680
関数をオーバーライドするってことか?
2021/05/03(月) 12:43:57.15ID:KphYKkJEd
どう意味不明なのかマジでわからん。
OOを捨てて関数型推したいのはわかるけど。

IDisposableなんかはどう不要にしていく?
IEnumerableは?

IDbConnectionは不要で、クラスがだけあれば良いって話?
2021/05/03(月) 12:48:01.71ID:9l24SOSQ0
>>676
興味あるのですが、参考になるサイトとかありますか?
2021/05/03(月) 12:51:04.01ID:1Sg6AXuHM
初期のC++がCにトランスレートできてたようにクラスやインターフェースなんて無くてもコードは書けるわな
その方が楽とか言うならそれでいいと思う
俺のプロジェクトに関わらない限りは
685デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 13:04:29.64ID:57hGL+DgM
>>682
IDisposableとかIEnumerableのような、言語が特別扱いしてるインターフェースを代替することはできない、ないし難しいだろうね
そういう特別なインターフェースを引き合いに出して、インターフェースのほうが優れてると主張することはアンフェアだとも思う
実際きみたち、特別扱いのインターフェースでしか優位性を主張できてないよね?

ちなみにGoだとdeferという構文があって、
いちいち特別なインターフェースの実装を”強いられる”ことなく、破棄関数を遅延実行させることができる
こちらのほうが洗練されてるね
C++だとこれはデストラクタの仕事になる
インターフェース?関係ないね
C#はどういうわけか、破棄関数の遅延実行にIDisposableというインターフェースを選択したが、だからといって、それがインターフェースの優位性を示すということにはならない
2021/05/03(月) 13:14:13.33ID:KphYKkJEd
>>685
アンフェアでもなんでもない。
IDbConnectionみたいな、何らかのデータベースへのコネクション、を表すものの代替も出来てないよね。
具象クラスでは事足りないし「データベースへ接続する関数を渡すイニシャライザ」からの返り値は同じように、汎用的なインターフェイスにキャストされてないといかん。
Goでもこれはsqlパッケージの中にインターフェイスが定義されてるよね。

と言うか、アセンブリの循環参照もわかってないんじゃないの?

Goのdefer文は破棄の遅延実行ではない。その関数を抜けるときに必ず実行する、だけ。
破棄以外にも使えるんよ。
finally節だと思えば妥当でしょ。
2021/05/03(月) 13:30:48.18ID:QO7vn18f0
>>685
特別扱いされているinterfaceが例にあげられたのはそれがよく知られたinterfaceの一例というだけの話であって、特別扱いされていることは本筋ではないだろう
688デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 13:44:29.08ID:57hGL+DgM
>>686
データベース接続も関数でいいよ
同じシグニチャの関数セットを異なるモジュールに定義して必要なものを必要な時にインポートするだけ
2021/05/03(月) 14:15:02.88ID:KphYKkJEd
>>688
シグニチャが同じなら、引数も戻り値も同じなんよね。
DBごとに違うコネクションをどう表現するの?
GoでもDriverインターフェイスでさばくよね。DB。
具象クラスのメソッドが呼びたい時はアサーションするよね、
2021/05/03(月) 14:23:09.97ID:el9v2bCt0
無駄をなくしたとかシンプルにしたとか言ってるけど、言語仕様側で受け持ってた制約を無駄と評して人任せにしただけに感じてしまう
>666で言われてるけど
2021/05/03(月) 14:28:16.36ID:LjFlj8XQ0
その関数のシグニチャを定義して強制するのがインターフェイスじゃないのかね
2021/05/03(月) 14:43:05.66ID:KphYKkJEd
そう。結局インターフェイスのこと言ってるの。基底になるオブジェクトとかそういう話になるだろうけど。
定義場所の問題。
そんで、それを定義だけ外に出せないのが問題だと俺は思う。
2021/05/03(月) 15:09:53.18ID:JDQ36HZh0
>>682
それを許すならコールバックのがいいなー
結局、実装見てみないとそいつらってわかんなくない?

MSが作ったメソッドなら実装されているだろう多分って言えるけど
それって組む人間の信頼性の話でさ

昔のデバイスコンテキストみたいに
え?解放されてんの?されてないの?
どっち?
みたいなのソースから無駄にわからんじゃん
こういうの欠陥品として捨てていくべきだと思うよ俺は
2021/05/03(月) 15:24:55.90ID:KphYKkJEd
>>693
コールバックはどうかなぁ。
それこそ、呼んでくれるかどうかわからんくない?
例外のハンドリングがいよいよ大変になるから、async awaitみたいにうまく隠蔽してくれる方が良いかなぁ。

確かにまぁ、開放したはずが開放できてなくて再起動するはめになったりしたし、わからんでもないけど、それこそIDisposableなんかでハンドリングした方が良いんじゃないかな。
2021/05/03(月) 15:33:42.40ID:JDQ36HZh0
>>694
ぶっちゃけよんでるかどうかわからんのは退化だと思う
2021/05/03(月) 16:10:09.16ID:bSPfVkbS0
デリゲートvsインターフェースの戦いはつまるところ気軽に使いたい派vs丁寧に型付けしたい派の宗教戦争なのだろうな
JavaのFunctional Interface、TypeScriptのStructural Subtyping、オブジェクトリテラルがあれば両陣営とも納得すると思われる
2021/05/03(月) 17:27:13.66ID:NFEIEsrVa
>>696
むしろこうだね、

適材適所派 vs. バカの一つ覚え
あるいは

常識派 vs. 俺だけがネットde真実に覚醒したんだ!!派
2021/05/03(月) 18:11:29.08ID:MrRb6D/k0
単純に、7割位のケースで有効な方法が、銀の弾丸な気がする時期じゃない?

Interfaceなり、型クラスなり、トレイトなり、定義と実装を分離する方法は色々だけど、どの言語でも完全に無くなってない事はゆっくり考えたらわかると思うんだけど。
どっちも出来ればいいんよ。
関数型も良いけど、世の中の殆どは状態を持っているんだから、結局モナドなんかを持ち出すぐらいなら手続き型でデータドリブンぐらいでバランスが良いとか、Entityクラスを軸にするんだ、とか、色んな考え方もあるわけだし。
2021/05/04(火) 00:13:22.42ID:9VBk1Szv0
循環参照だけど、例えば、FileLoggerと、StreamWriterみたいなクラスがあるとして、両方別アセンブリになってて、
FileLoggerはStreamWriterを使ってログ出力する事もできる、とすんじゃん?
で、
ここまでは普通にビルドできる。

StreamWriterもログを出力することになって、FileLoggerを使うことにするとすんじゃん?
前回の結果からの増分コンパイルはできるけど、クリーンビルドは出来なくなるよね。

結局は、最低IWriterなりILoggerなりとして、どちらかを定義と実装に分けておいて、
具象クラスをコンストラクタなり、ラムダを渡す初期化関数なりで渡すしか無くなると思うんだが。

ベースクラスと派生クラスにしておいて、ジェネリクス使えばそれで良いのでインターフェイスは要らない、と言うのは一見それで良さそうに見えるけど、
今度はダイアモンド継承になるから、WriterでありLoggerであるものが作れない。

関数型と排他の存在ではないと思うよ。
嫌いなら、必要悪ぐらいに思っといたら?
700デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 00:35:29.27ID:M19mZJ1ZM
Action<string> logなりAction<string> writeLineなり必要な関数を引数で渡すだけ
FileLoggerをリビルドするのはFileLoggerを変えた時だけ
StreamWriterをリビルドするのはStreamWriterを変えた時だけ
どちらもコアライブラリであるActionにしか依存しないので常に単体でクリーンビルド可能
2021/05/04(火) 01:22:47.37ID:DanBAz9l0
>>699
受け渡しする関数のシグニチャ(=デリゲートの型)が
メソッド1つだけのインターフェースと同じ働きをするので
IWriterやILoggerがメソッドを1つしか持たないなら高階関数で処理したほうが適切な可能性もあるよ

map/filter/reduceのように毎回一つ一つの関数を渡すのが便利なものと
リポジトリのように事前に定義された一連の機能セットに互換の型を利用することで
クライアントコードは実装の詳細を気にせず使うほうが便利なものとそれぞれある

比較関数を毎回渡してソートする方式とIComparableを使ってソートする方式の違い
どういう種類の仕様変更に対してどこまで影響が波及するかを比較して考えるといいかも
2021/05/04(火) 07:53:17.60ID:9VBk1Szv0
>>700
Action<string>が、どう「ログ出力関数」になるわけ?
そんな漠然としたシグニチャになるわけ無いでしょ。
百歩譲ってAction<LogInfo>だろう。
ログレベルとか発生場所とか全部プリミティブで渡すの?ってのが、>>653だよ。そのログ出力内容が変わったらシグニチャ全部変えてくの?

>>701
うーん、まあ、それもまた然りかな。
一つしか持たないインターフェイスはたしかにそうかもしれん。
俺のイメージはLoggerもWriterも、状態を持たざるを得ないイメージだったので、IDisposableも一緒に持つイメージだった。
ログレベルとか、開いてるファイルと書き込み状態とか。マルチスレッドだとうまく排他しないとログが乱れるから。

IWriterもILoggerも、もう少しメソッドを持つイメージかな。
頑張ればLoggerは一つのメソッドでいけるかもしれないけど、LogLevelみたいなLogger側にEnumは持たせないといかんかも。
DIするなら、ILoggerの方が楽だと思う。
2021/05/04(火) 08:02:02.52ID:9VBk1Szv0
なんか「こうすると後始末が楽」ってのと、「これてもできる」ってのは違うと思うんだが。
Action<string>とかAction<int,string,string>みたいなものでログ出力関数をロガーとして関数に突っ込むのは「これでもできる」側としか思えんのだ。

それでホントに改修も含めた総工数が下がるとも思えないし、
確かに今風だけどメリットはすごく薄いし、
合理的かと言われたら俺は違うって言いそう。
2021/05/04(火) 08:21:09.46ID:YPdSU1M4d
意味不明と言い続けてたのも、
全く解決になってない方法をゴリ押しすんのも、
もしかして、OOP・Interfaceが不要と思ってるんではなくて、OOP・Interfaceの考え方とか活用法を理解できてない?
>>666
本当にこれなのかな。
705デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 09:40:15.42ID:/WM42vypM
>>702
stringでもLogInfoでもなんでも好きにしなよ
お前ずっと反論がズレまくってんだよなぁ
ただの例示のコードスニペットの重箱の隅をつついて本質に触れないのは、ワザと話をそらそうとしてんのかな?
業務で書いてるコードじゃねえんだから、細かいとこは省略してエッセンスだけ書くに決まってんだろ

>>703
これでもできるじゃなく、そのほうが楽でわかりやすい、な
DIなどでおなじみの大量生産される型定義、プライベート変数定義、コンストラクタ定義が消えてスッキリ
コードの可読性を著しく下げる予測困難なコード≒隠蔽されたコード、長いスコープ変数(メンバ変数)などが消えてスッキリ
前にも書いたが、テストしやすくてスッキリ

>>704
いや真面目に、俺が意味不明ってつけたレスは、本当に意味不明だよ
頼むから、わかる日本語で書いてくれ
ちなみに俺も昔は、OOP信者でもちろんインターフェースも大好きだった
デザインパターンを1つ学んでは、一喜一憂してたのもいい思い出だ
ま、知識をアップデートしようってことだな
2021/05/04(火) 10:04:47.13ID:9VBk1Szv0
>>705
あのさあ。ホントにズレまくってるのそっちなのよ。
逸らそうとしてるんじゃなくて、業務で使うようなコードで、イニシャライザに任意の関数を渡すスタイル「のみ」でうまく行ったパターンは無いし、どのみちその関数のシグニチャは定義することになるんよ。

Kestrelでセルフホストする時に、どちらの方法も使うことになるけど、インターフェイスを受ける、具象クラスを返すラムダで初期化したりするよね。
GenericHostBuilderExtensions.ConfigureWebHostDefaults(IHostBuilder, Action<IWebHostBuilder>
とかもそうじゃない?

スッキリはしないよ。はっきり言って。

知識はアップデートしてるつもりだが、だからこそ、高階関数で万事解決だとは思ってない。

なんでも高階関数でやればスッキリする、依存を減らそう、呼んでほしいロジックは渡せば良いんだ、って発想は一時期かぶれたけど、
結局、相互に依存してるのと変わらんことに気づいた。
別にそれ自体がテスタブルでもなんでもない。
結果的にテスタブルになっただけであって、同じように気をつけてInterface使えばどちらもテスタブルになる。
2021/05/04(火) 10:37:19.27ID:x7uRD8HC0
まだ集団ウンチしてるのだ…
708デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 10:37:49.24ID:/WM42vypM
>>706
既存のフレームワークはまだ追いついてないんだよ
中心的なフレームワークをOOPでインターフェースも使う前提で作っちゃったんだからある程度”使わざるを得ない”のは仕方がない
あとはそこから如何にして脱却していくかだな

依存を排除しようとしてるのに、相互に依存してるんならOOP、関数以前に設計が下手な可能性が高いな

テスタビリティは明らかに関数のほうが上
おぞましいモックオブジェクトの大群に襲われなくて済む
関数ならモックオブジェクトはただのラムダに置き換えられる
テストコードは短く、シンプルに、理解しやすくなり、テストのための黒魔術(モックフレームワーク)への依存関係を完全に断ち切れる
これがいかに素晴らしいことか、業務で真面目にテストを書いたことがあるなら、わかるはずだ
もしわからないなら、本気でテスト書いたことがない”ニワカ”でしょ
2021/05/04(火) 10:52:23.31ID:9VBk1Szv0
>>708
追いついてないわけではなくて、現実見てるんじゃん。

結局、相手方にラムダなり関数なりの自分の一部分を「呼ばせる」仕組みになるのであれば、それは結局は依存してるのと同義だと思うぞ、俺は。見た目上依存が排除できてるようには見えるけど。

モックオブジェクトの作り方が悪いのでは?
結局、短くて大量のラムダに襲われるだけだし。
モックフレームワークとか開発の規模感にあってなかっただけではなかろうか。

別に俺は、完全にラムダを渡すスタイルが悪いと言ってるんじゃないんよ。
インターフェイスは必要な部分では必ず必要って言ってるだけであって。

インターフェイスと拡張メソッドでめちゃくちゃ効率的にできる事もあるし、抽象的に扱う必要があるものはある。
IDbConnectionをどういう関数にするかまだ答え貰ってないけど、どうするつもり?

宗教戦争じみてきたけど、絶対にインターフェイスは要らないって言いたいだけ?
710デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 10:56:22.23ID:/WM42vypM
実を言うとね
関数には様々な利点があるわけだけど、それらの利点がもし全くなかったとしても
この”テストコードの生産性の向上”だけが理由でも、俺は関数に取り組むべきだと考えてる
レガシーコードとはテストのないコードのことだ、とは有名なフレーズだが、心から同意する
テストコード生産性の低いOOPは、レガシーコード予備軍と言ってもいい
モックフレームワークは本当に君たちの良き友人だろうか?
よく考えてみてほしい
2021/05/04(火) 11:18:30.42ID:9VBk1Szv0
そもそも論だが、モックフレームワーク自体がまず必須ではない。
インターフェイスを満たしていればそれで良い。
依存性の注入をしはじめるとそりゃモックは作る必要があるかもしれないが、フレームワークを使う必要は無い。
そもそもそれは関数やラムダを渡す方法でも同じ。もちろん関数やラムダのテストはするよね。それが、結局依存してるって言ってるの。注入してるからあたり前よね。

なんか嫌な記憶があるんだろうけど、インターフェイスという概念が完全に使い物にならなかったら、世間はそう変わっていってる。でも、どの言語にもあるよね。型クラスだったり、少しずつ実現方法が変わることはあっても。
自分の使い方が悪いのを、ものが悪いと言うのはよろしくないぞ。
712デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 11:19:32.83ID:/WM42vypM
>>709
短くて大量のモックラムダの定義は常にテストと共にあり、全てが目に見えて、嘘も隠し事もなく、理解容易だ

モックオブジェクトの大群は全てが隠蔽されており、その実体はお世辞にも理解しやすいとは言えない黒魔術で構成されている
モックオブジェクトを扱う人間はモックオブジェクト独特の世界観を深く理解し、信仰しなければならない

僕らはただ楽に単純明快なテストを書きたいだけなのに…
2021/05/04(火) 11:23:09.70ID:9VBk1Szv0
>>712
自分で作れば、モックオブジェクトも別に隠蔽されてないし、理解しづらくも無いんだが。
必要十分なものを作れば良いと思うよ。

なんかフレームワークに振り回された思い出があるの?
それは俺にもあるからわからんでもない。
2021/05/04(火) 11:27:48.16ID:XePiVdwm0
これ回線2つ使った自演芸やんけ
せめて文体変えようよ・・・
715デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 11:28:41.29ID:/WM42vypM
>>711
何故モックフレームワークのような出来損ないが、世の人々にありがたがられているか理解してる?
モックフレームワークを使わなければいいと、言うだけなら簡単だよ
でもねその代償に今度は、大量のモッククラスを書かなければならなくなるんだ
世の人々はそんな大量のモッククラスを書くのは嫌だ、ということでモックフレームワークを作ったんだ
苦肉の策だったんだろうけど、世の人々は薄々疑問を感じながらも自分を納得させてモックフレームワークを受け入れた
大量のクラスを書くよりは、たぶんマシだから

さてなんでこうなってしまったか、根本原因はもうわかるね?
依存性分離のためにインターフェースを採用しちゃったからだよ
インターフェースに実装を与えるのは、関数と比べるとものすごい労力かかるんだね
2021/05/04(火) 11:29:07.24ID:F3N+oY4e0
ID:9VBk1Szv0
ID:/WM42vypM
いい加減議論スレへ行け

ふらっと C#,C♯,C#(議論用) [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1469538912/
2021/05/04(火) 11:30:27.06ID:9VBk1Szv0
>>714
違うぞ。

>>715
やり方が悪い。そして関数のシグニチャはインターフェイスそのもの。

>>716
すまん、そんなスレあったのな。
ありがとう。
まあ水掛け論だろうし、もうやめとくわ。
718デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 11:34:02.42ID:/WM42vypM
>>713
僕らはテストを書きたいんだ
大量のモッククラスを書きたいわけでもない
モックフレームワークを自作したいわけでもない
モックフレームワークを利用して疲弊したいわけでもない
僕らはただたんにテストを書きたいんだ
2021/05/04(火) 11:42:00.80ID:5c9CWd/c0
ま、インターフェースなんかいらんな
データベースが当たり前になってきた頃からインターフェースを積極的に使うやつは確実に減ってきた
だってこれやっぱテーブルにしにくいじゃん
いやね
差分だけ本当にまとまってるならそういう手もありなんだけど
実際は虫食い状態の共通部と固有部分を分けるのって現実的じゃないと思うんだよね
2021/05/04(火) 12:03:51.01ID:UFmf8yJF0
属性のメリットが全然わからなくてとまどってる
obsoleteなど例外を除いて、summaryなどと違って参照時に開発者側へメッセージを呼び出すわけじゃないんだな
obsoleteのような開発時のエラーメッセージの表示を条件分岐したかったけど見当たらないし、obsolete自体が継承できないときた
メソッドの代わりとして使うしかないのか?
2021/05/04(火) 12:09:41.03ID:9VBk1Szv0
>>720
組み込み属性以外だと、リフレクションでメソッドなりクラスなりを探すときに、特定のAttributeがついてるものを対象にしたり、呼び出し元に特定のAttributeがついてるかをコールスタックから探したりするためのものでは?
あとはAttributeUsageAttributeで制限かけたりかなぁ。
2021/05/04(火) 12:36:44.27ID:rb0F5K+LM
属性は、
EntityFrameworkとかASPNETとか属性利用ありきのライブラリを使ったり自作したりしない限り
特にメリットなんてないという理解でいいと思う

逆に言えばそういうライブラリを使うときに初めて意味を持つんで
ひとまず書き方使い方だけ頭の片隅にいれておけば十分
2021/05/04(火) 13:01:40.29ID:UFmf8yJF0
>>721
ども
求めてる機能は作れそうにないや
724デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 13:41:23.71ID:p57xGa3RM
>>720
属性はメタプログラミングで利用するもの
C#ではダイナミックに型情報にアクセスすることできるが、属性はその型情報に”お好みのラベル”を付与するための機構だ
ただラベルを貼り付けるだけではなんの意味もない
ラベルを解釈して振る舞いを変えるクライアントプログラムを作ることで、初めて属性に意味が生じる

同じ事をあちこちでやってるけど、クラスや関数など従来の言語基盤ではモジュール化しにくいもの
いわゆるアスペクトというものをモジュール化するための道具として使われることが多い
またIDEを初めとする周辺ツールなどからも参照できるためツールの拡張などに使われることも多い

はっきり言って泥臭い、洗練された機構ではないのでメンテナンスは大変だが、ただの利用者の立場では便利なものだ

python、TypeScriptなどでは属性より柔軟性は低いものの十分な効果が得られ、より理解、実装が容易なデコレータというアイデアが導入された(ちなみにこれは関数を受け取り関数を返す関数だ)
C#にもデコレータがあれば良いのだが……まだまだ遅れてるね
2021/05/04(火) 13:55:11.06ID:9VBk1Szv0
デコレータと属性は目的も実態も全く違うものだろ。
726デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:02:18.42ID:p57xGa3RM
同じものってどこかに書いたっけ?

属性とはこういうものだ
他の言語では(アスペクトの実装手段として)より洗練されたデコレータというものがあっていいなあ
という文脈だが?
2021/05/04(火) 14:05:17.38ID:geYLSs/TM
で、デコレータでどうやって開発時にObsoleteのようにメッセージを出すんだ?
Pythonみたいなデコレータじゃ実行時にしか出せないだろ
728デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:07:36.50ID:p57xGa3RM
俺がいつデコレータで開発時メッセージを出す話をしたのかな?
2021/05/04(火) 14:08:07.94ID:EiXw2d7yM
お前がじゃなく、質問者がそう言っている
730デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:11:39.63ID:p57xGa3RM
質問者は”属性の有用性が理解できない”と聞いてきてる
Obsoleteはその例でしかない

であるので属性の一般的な説明と用途を説明し
その後に参考としてデコレータを紹介した
731デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:17:24.30ID:p57xGa3RM
質問自体が”開発時メッセージを表示させたい、コントロールしたいがどうすればいいか”だったら、デコレータの話はなかっただろう
2021/05/04(火) 14:17:31.82ID:An0jw/zOF
いや質問者はObsoleteのようなことがやりたくて属性を調べたけど結局何ができる機能なのかよく分からなかったと言ってるだろ
この文脈で>>724のように書かれたらデコレータでならやりたいことができると質問者が誤解してもおかしくない
不適切というか意地悪な回答だと思うぞ
733デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:19:16.62ID:p57xGa3RM
お前が俺を攻撃したいのはわかったが、もう少し冷静に考えてから攻撃したらどうだ?
毎回、返り討ちにされてはつまらないだろう?
2021/05/04(火) 14:19:35.90ID:9VBk1Szv0
属性とデコレータは似てるようで全然違うので、同列に扱うのがよくわからん。
TSのreflect-metadataなんかでもわかるように、あれはデコレータで属性を与えるようなものなのよ。
逆にJavaのように属性でデコレータを与えるようなものももちろんある。
javax.decoratorとかな。

属性は属性でデコレータとは本質的に無関係で同列で引き合いに出すものではない。

その言い方してると、Serializableの説明がしにくくなる。
2021/05/04(火) 14:20:23.79ID:9VBk1Szv0
>>733
攻撃したいんじゃなくて、間違ってる。
頭でっかちでしかない。
736デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:30:08.24ID:p57xGa3RM
>>734
2回目だが同じとは誰も言ってないぞ
(アスペクト指向という)目的を達する手段が複数あり、片方がより洗練されていると言ったんだ
なぜこれで”属性とデコレータが同じものだ”になるのか理解し難い
2021/05/04(火) 14:35:07.15ID:9VBk1Szv0
>>736
誰もアスペクト指向の話は求めてないし、アスペクト指向にも使えるのは事実だが、アスペクト指向のためだけのものではない。
属性は属性。

Webフレームワークのパンドラとかロガーみたいな、特定のアスペクト指向に使う用途しか知らないならそう言いなよ。
2021/05/04(火) 14:40:27.36ID:9VBk1Szv0
データバリデーションのIndexやRequired、シリアライズのJsonPropertyとかColumnなんかは、別にアスペクト指向として割り込むためのものでも集約するためのものでもない。
XamarinのAndroidのActivityなんかはビルド時にXML産むために定義したり。
739デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 14:41:32.01ID:p57xGa3RM
>>737
はぁ…何度目だ?

質問者は明にアスペクト指向の話を求めているわけではないが、属性の有用性についてコメントを求めている

で、あるならば属性の利用形態として大きなウェイトを占めるアスペクト指向について、言及しないわけにはいかない

属性は単なるラベルであり、クライアントによって様々な利用形態が考えられることは、俺が先に説明した通り
2021/05/04(火) 14:44:33.97ID:NgJtJBuAM
そうか?
C#で属性使ってアスペクト指向ってあまり一般的じゃないだろ
ヘルスバーグがAOP嫌いなのも有名な話だ
2021/05/04(火) 14:46:49.09ID:9VBk1Szv0
>>739
属性の有用性はそれ以前の問題。
アスペクト指向に属性は実際問題必須ではない。
インターフェイスは要るがなw

単なるラベルであり様々な利用形態が、ってのは、わかってる相手に説明する方法であって、全く知らない人間に対しては何の説明でもない。せめてググるためのワードを出せよ。
2021/05/04(火) 14:50:23.97ID:wdzHnAM+0
初心者にまったく役に立たない話はここでしなきゃいいのでは?
2021/05/04(火) 14:52:35.33ID:9VBk1Szv0
別にね、アスペクト指向はルールベースでも良いのよ。
Rubyなんかだと命名でフックしたりするようにね。
744デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 15:04:03.10ID:p57xGa3RM
>>741
属性はAOPに必須ではないが、ないと非常に大雑把な実装になり、挙動のコントロールが難しくなるため、実用上はほぼ必須だよ
太平洋横断に船は必須ではない、と言うようなものだ、最後の旅にならないといいね

いやいや、何もわかってない人にこそ、属性とはただのラベルでしかない、と説明したほうがいい
ただのラベルということを理解してないと、元の質問者のように属性には開発者メッセージを出力したり、色んなことができる、なにか不思議な力がある魔法の道具なのかな、と誤って認識してしまうんだ
1. 属性には本当にラベル以上の意味は何もないし、何もしない
2. 何かするのは、そのラベルを見て処理をするクライアントプログラム
3. 何をするかは、そのクライアントプログラム次第で全く異なる
これが属性の基本の基本な
このシンプルな3つの事実を教えないで、有耶無耶にはぐらかすと、初心者が属性を理解できなくなってしまう
745デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 15:07:33.04ID:p57xGa3RM
ほぼ必須といったのは誤解を生むかもしれないな
デコレータのようなより洗練された機構が無く、AOPをメタプログラミングで実装する以外の選択肢に乏しい言語にとっては、ほぼ必須と訂正しておこう
2021/05/04(火) 15:16:46.55ID:9VBk1Szv0
だから、そんな話はしてないの。AOPとか。
デコレータの話が蛇足な上、その根拠のAOPの話が蛇足だったのよ。

属性はただのラベルではない。
誰かが読み取るためのラベル。
それはシリアライザだったり、コンパイラだったり、Webサーバのランタイムだったり様々だけど。
だから、Obsoleteなんかが意味を成すんであって。

現実的にC#の属性はAOPのためのものではない以上、蛇足そのものでしょ。
だから頭でっかちだと言ってるんだよ。

「ただのラベル」こそ「うやむやにはぐらかしてる」でしょ。
2021/05/04(火) 15:18:25.60ID:F3N+oY4e0
ふらっと C#,C♯,C#(議論用) [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1469538912/
2021/05/04(火) 15:18:59.72ID:9VBk1Szv0
じゃああっちで。
2021/05/04(火) 15:42:18.40ID:vNyUKbw80
デコーダ太郎は責任とってクビ吊れ
750デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 15:43:52.50ID:/UxZFiSCM
>>746
>属性はただのラベルではない。
>誰かが読み取るためのラベル。
それをただのラベルっていうんだよ
読み取る側がそのラベルを見て何らかの作用を起こすまではなにもしない
まさにただのラベルだな
2021/05/04(火) 15:54:23.06ID:9VBk1Szv0
>>750
しつこいわ。
752デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 16:04:50.31ID:/UxZFiSCM
>>751
ええと
ブーメランってご存知?
2021/05/04(火) 16:08:55.98ID:9VBk1Szv0
お前の理想以外聞き入れないなら、ブーメランでもなんでもないわ。
754デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 16:10:37.11ID:B/7UzgrKM
というブーメランなのでした
ちゃんちゃん
2021/05/04(火) 17:28:51.83ID:DanBAz9l0
>>723
ビルド時にカスタムのエラーや警告を出したいなら
Code Analyzer使って属性をチェックすればいい
2021/05/05(水) 09:44:41.21ID:0AxeylkVr
昨日は頭のおかしい人が大活躍してたみたいだな
策っとNGしときましょう
757デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:21:29.88ID:Oi9dh/iA0
WebClient使ってWebサイトのhtmlを文字列として取得したいんですが、
読み込みに数十秒かかるような重いページだと、途中でエラーします。
そんなページでもエラー無く読み取る方法有りますか?
758デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/07(金) 00:26:59.06ID:xGNvq5Jp0
Irvine
759デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:34:48.56ID:Oi9dh/iA0
>>758
それはC#から呼び出して使えますか?
2021/05/07(金) 00:39:08.58ID:rhVsIWeg0
>>757
HttpClientクラス使った方が良いと思うけど
WebClientクラスの場合は、GetWebRequest()をオーバライドして
WebRequest.TimeoutプロパティとHttpWebRequest.ReadWriteTimeoutプロパティを設定
761デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:43:50.02ID:Oi9dh/iA0
>>760
ありがとうございます。
>GetWebRequest()をオーバライド
は既に試したんですが、相変わらずエラーで中断します。
>HttpClientクラス使った方が良いと思うけど
それは何故でしょうか?
2021/05/07(金) 02:50:42.19ID:sg0+DWIO0
どんなエラーが出るのよ
2021/05/07(金) 03:48:20.57ID:bebMDo2e0
DLしたいサイトのURL教えてもらっただけでだいぶはかどるよね。
2021/05/07(金) 04:25:10.15ID:Bc+rT72I0
中華から攻撃受けてるときの重いふたばとか
2021/05/07(金) 04:39:35.33ID:FF3+CPRk0
デフォルトだとタイムアウトが足りてないだけなんじゃないの?
2021/05/07(金) 05:39:50.22ID:LQe9nctZ0
> 途中でエラーします。
エラーしますとか変な日本語使う奴の相手はしない
2021/05/07(金) 08:08:05.60ID:n4YBHC+Y0
エラーいたします。
2021/05/07(金) 08:28:13.14ID:96M3luB+0
エラーがございます
2021/05/07(金) 08:44:51.51ID:1BryI6MR0
エラーなさる
2021/05/07(金) 11:18:16.60ID:4XrAAqdx0
エラーになられます
2021/05/07(金) 11:23:53.77ID:ckc6TxMx0
エラー仕る
2021/05/07(金) 12:35:02.79ID:iq1HEmUXM
エラー参上
2021/05/07(金) 12:37:58.01ID:RB8Fe90n0
>>764
ふたばってもう誰も見てないだろうけどどんな理由で攻撃してくるの?
2021/05/07(金) 15:59:09.92ID:4XrAAqdx0
尖閣諸島を渡せ
2021/05/07(金) 18:28:13.92ID:1BryI6MR0
エラー渡し
2021/05/07(金) 21:30:40.73ID:S8eSOzgY0
エラー呼吸
2021/05/07(金) 21:31:58.32ID:Bgw7HCHL0
さくらタンのエラー画像キボンヌ
2021/05/08(土) 00:36:51.80ID:onVLUDOF0
(*´Д`)ハァハァ
2021/05/08(土) 11:24:07.14ID:Yiqu4oaaa
くだらん
2021/05/08(土) 12:22:03.93ID:oZ/joMMLd
#region って使わない方が良いのですか?
プライベートメソッドがたくさんあるとき隠すのは駄目ですか?
2021/05/08(土) 12:29:25.27ID:Hz73TWc7M
好きにしたらいいよ
長いコードをリージョンで隠すより
短く書いたほうがいいと思うがね
2021/05/08(土) 13:33:49.15ID:IqHZyMf20
ウザい
使うメソッドの周辺に置いておいてよ
publicとかprivateでリージョン切るやついるけどセンスの欠片もないな
2021/05/08(土) 13:41:33.11ID:75Tkj6otd
積極的に使いたいとは思わないな>#region
2021/05/08(土) 14:09:56.67ID:CLNCGw4K0
レガシーコード解読してるときに、コメントがてら一先ずregion使った
2021/05/08(土) 14:14:41.59ID:75Tkj6otd
#region使わんといけないほどになったらクラス分けてほしいな
実際にはなかなかそういう自由はないかもしれないけど
2021/05/08(土) 14:16:26.79ID:HwrhuFxX0
分ける方向がクソなときにウザい
1つのpublicにいくつかのprivateがくっついてるのに
publicやprivateでリージョン切るなや下手クソ
2021/05/08(土) 14:18:11.82ID:ub5A9aINa
>>780
身もふたもないけど使い方次第だね。

#regionディレクティブはコードを分類するのとあまり見る必要がないコードを隠すのに
使えるけど、後者の使い方はあまり必要がない

自分はデカいクラスでMSのドキュメントみたいにメンバーを種類ごとに分類するのに使ったり、
ある程度以上の規模のFormで例えばメニューのイベントハンドラを分類するのに使ってる
2021/05/08(土) 14:21:20.00ID:nusrVvaZ0
拡張のcodemaidで適当に分けてもらう
2021/05/08(土) 14:21:52.55ID:L+qXSIbq0
private隠す#regionは使うけどな。どのへんがダメ?
2021/05/08(土) 14:25:10.15ID:43bBwuymM
隠したくなるということは、隠さないと鬱陶しいぐらい長いコード、ということだから、そのあたりだろうね
2021/05/08(土) 14:28:22.99ID:/jodR7lWF
呼び出し階層を無視して十把一絡げに「private」だけで括ろうとするのはどうかなとは思う
2021/05/08(土) 14:34:26.57ID:L+qXSIbq0
コードスメル的な意味かな?具体的に何が悪いのかよくわからんけど。
2021/05/08(土) 14:34:33.08ID:pDWBcfg30
/// <summary>
/// ・・・
/// </summary>
private int mHoge;

/// <summary>
/// ・・・
/// </summary>
public int Hoge { get => 0 == this.mHoge ? 1 : this.mHoge; }

で、それぞれに同じコメント書くのが非常にだるい。
なにかうまい方法ないですか?
2021/05/08(土) 14:44:03.29ID:75Tkj6otd
>>793
コレどう?

<inheritdoc> - C# プログラミング ガイド | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/xmldoc/inheritdoc
2021/05/08(土) 14:50:55.43ID:pDWBcfg30
>>794
ぉぉ、コメントも継承できるんですね。
ありがとうございます、やってみます。
2021/05/08(土) 15:26:30.05ID:X8Zwq8nja
>>789
privateの意味を誤解してる気が

privateの意味はそのコードを利用する側の人は見る必要がないって意味だよね?
ソースコードを見てる人はその時点で「利用する側」か?
普通は違うよね?書く側の人に対して隠す意味は普通はない。

もちろん「まず見る必要がないから畳んでおきたい」需要が絶対にないとまでは言い切れんとは思うけど。
2021/05/08(土) 15:28:42.58ID:X8Zwq8nja
ちなみに、VSのエディタにはメソッドのシグネチャ以外の部分を畳む機能もあるけど俺はあれは嫌い。
ただの食わず嫌いかもしれないが
2021/05/08(土) 15:42:24.39ID:L+qXSIbq0
>>797
あー、それそれ。併用してCのヘッダみたいにして見てる。
ヘッダ代わりに毎回インターフェースを定義するのも面倒だしね。
799デフォルトの名無しさん (ブーイモ MM97-G81e)
垢版 |
2021/05/08(土) 16:10:59.65ID:0QGgEZ+BM
長大なメソッドの中身をregion使って折りたたんだら短く見えるからいいよね
2021/05/08(土) 16:27:25.48ID:CLNCGw4K0
コンストラクタとかで引数チェックする場合ってDebug.Asset使う?  ifと組み合わせて例外投げる?
801デフォルトの名無しさん (ワッチョイ 3ebb-krZt)
垢版 |
2021/05/08(土) 17:12:49.71ID:6pb9v2QO0
macOSに新しい.NET Core SDK/ .Net 5 SDKを入れ続けていると、何バージョン分もディレクトリが掘られて増えていきます
公式では、いらないものを単純にディレクトリごと削除して良いようなことが指示されていますが、これらのディレクトリのパスをdotnetコマンドに知らせている設定部分はどこにあるのですか?
2021/05/08(土) 17:41:35.40ID:oZ/joMMLd
ありがとうございますm(_ _)m
#region は気を付けます
2021/05/08(土) 18:05:57.33ID:jYvDj1vcd
>>800
コンストラクタで例外投げたくないな
引数はフィールドにセットするだけでそれ以外は基本しない
検証するなら別のメソッドにするかコンストラクタ隠蔽して検証しつつインスタンス返すstaticなメソッド作る
2021/05/08(土) 18:15:04.80ID:+DU/XhxNM
20年前に見たような話で頭がくらくらする
2021/05/08(土) 18:24:03.67ID:jYvDj1vcd
まあまあ
2021/05/08(土) 19:33:57.25ID:6+YQB65FM
>>800
普通にifで調べて、普通に例外を投げてくれ
引数がおかしいならArgumentExceptionとか適当なのあるでしょ
引数が増えるとifを書くのがしんどくなるかもしれないが、そのときは関数化しよう

そもそもDebug.Assertは滅多に使わないものと考えていい
デバッグビルドとリリースビルドで挙動が違うというのは、それだけで本番でしか発生しないバグを生みかねないものなので、可能な限り避けるべきだ

コンストラクタで例外を投げたくないとか言ってる人は、気にしなくていい
昔はそういう流派もあったんだな、とでも考えてくれ
2021/05/08(土) 19:50:29.55ID:opSybYm9r
.net frameworkのコンストラクタでもそうやってた
今のは知らん
2021/05/08(土) 19:57:02.17ID:opSybYm9r
コンストラクタで例外投げろ
それ以外はゆるさない

XXX.Create("test");の戻り値nullチェックみたいのはバグの温床だから許さん
2021/05/08(土) 20:01:04.70ID:Yl7KxUAk0
UnhandledExceptionの処理やるだろうしコンストラクタで例外投げてもいいと思うけどね
2021/05/08(土) 20:22:02.19ID:jYvDj1vcd
最近はそうなのか
自分も認識改めるわ
2021/05/08(土) 20:24:43.64ID:LkrBFLk10
9.0のrecordってデータベースとのやり取りに使うシンプルなクラスには積極的に使っていったほうがええんかね?
812デフォルトの名無しさん (ワッチョイ cb68-dxvU)
垢版 |
2021/05/08(土) 20:46:20.44ID:v+2mVqTb0
単純計算の時間って完全に比例するんですか?
繰り返し処理で
10万回 2桁同士の掛け算を行う。
12万回 2桁同士の掛け算を行う。

これって後者のほうが平均とると必ず時間がかかるんですか?
2021/05/08(土) 20:51:21.18ID:CLNCGw4K0
コンストラクタで例外投げるかどうかは宗教論争感あると思うので棚上げにしてます。質問が悪かったです
自分が聞きたいことはDebugあるいはTraceのAssertメソッドの使い所でした

>>806
使い所ないんですかね
どんな値が渡されるのかわからない関数などは例外処理、その逆(外部に公開しない関数)の値チェックになら使えそうなのかなと思ったんですが
.Net1.1やその前からあるみたいなので、テストフレームワークが流通してないころに使われてた過去の遺産なのかな
2021/05/08(土) 22:58:15.52ID:W+LjP6QJ0
>>812
汎用PCの場合
速度なんか測ったって
その場合はそうだったんだろとしか言いようがない
裏でウィルスバスターや
セキュリティソフトや
会社の監視ソフト
WindowsUpdateなど
色んな複合要素がありすぎてみんな速度なんか測るのやめちまったよ
2021/05/08(土) 23:37:30.49ID:6+YQB65FM
>>813
検証処理が非常に高価な場合はDebug.Assertを使う理由にならんこともないが、そんなことは滅多にないよ
ほとんどの場合、検証は安価であり本番で検証をスルーしてしまうリスクとは比べるまでもない
C言語のようにほんの些細なオーバーヘッドすら嫌うような言語とは考え方が違う
2021/05/08(土) 23:47:06.02ID:+76Iryda0
そもそもアサーションをいつの段階で期待してんだ
まさか実運用環境をデバッグビルドで走らせるのか

コンストラクタでの例外は、やるなっていう言語が存在するのは確かだが、宗教以前に言語の問題
C#では別に問題なかったはず
2021/05/08(土) 23:50:56.30ID:ef0LnTY20
Debug.Assert()はバグってる原因を探る時に、想定通りの値になっているかを確認する時に使うな
確認が終わったらソースから消すけど、万が一消し忘れても影響無いし
Trace.Assert()は使ったことない
2021/05/09(日) 00:29:36.29ID:qLvHom4Y0
803だけど昔「コンストラクタで例外投げたりアカンぞ」みたいなことを本で読んだ記憶があったんだがいま読み返したら完全に自分の記憶違いだった 申し訳ない
2021/05/09(日) 00:51:47.19ID:RBUe6vIe0
職場でExcelVBAとACCESSをある程度動かせるようになったので、ステップアップしてC#を勉強してみたい。
勉強用のサイトやオススメの本などあったら、教えて頂けませんか?
820デフォルトの名無しさん (ワッチョイ cb68-dxvU)
垢版 |
2021/05/09(日) 01:01:53.07ID:6r3obgDk0
2D格闘ゲームって3Dのapiがなくても作成可能ですか?
何か昔っぽいゲームを作りたくなってワクワクしてます。
環境はvisualstudioです。
2021/05/09(日) 02:07:45.79ID:xtmxe3CZ0
誰か助けて。WebView2を使ったプログラムなんだけど
以前動くやつを作ったプロジェクトを今日久しぶりに触ったら
「System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'」
と出てまったく動かなくなってしまってた… 一行も弄ってないのに
本当に何にも触ってないんだけど一体何が悪いのか。
2021/05/09(日) 02:15:39.31ID:KIYocDNB0
>>820
速度イラネってなら別だが、2Dでも細かい事やろうとするとC#の手に余る
せめて描画エンジンはC/C++で書いた方がいい
823821 (ワッチョイ 9f02-dxvU)
垢版 |
2021/05/09(日) 02:55:26.73ID:xtmxe3CZ0
原因が分かった。プロジェクトのディレクトリを移動すると動かなくなるみたい。
でも何故なの?どこを修正したら良くなるか誰かおしえて!
2021/05/09(日) 03:56:24.54ID:SmU3pbXq0
>>823
WebView2ランタイムが見つからないんだとエスパーすると、
ソース内でWebView2ランタイムの場所指定してるとこ要チェック。
2021/05/09(日) 08:16:13.97ID:Bo6dSg5rd
>>819
c#でググるとすぐ出てくる入門サイト。
何故かというと、今後も何か調べるときにすぐ出てくるサイトだから。
2021/05/09(日) 09:32:19.94ID:5OOG3JrHM
>>819
ネットで漁る
独習C#
実戦で役立つ C#プログラミングのイディオム/定石&パターン
2021/05/09(日) 09:44:58.83ID:ip1MRNKD0
例外投げちゃいかんのはデストラクタでは
2021/05/09(日) 12:02:06.30ID:A+xFAhosa
いやコンストラクタで例外投げるな、投げたい時にはファクトリーメソッドを使え、
という議論は確かに見たことある。

自分はコンストラクタで例外投げたいと思ったことがないので興味が持てず
詳細はよく覚えてないけど、それなりに説得力はあったような気がしたけどな
2021/05/09(日) 12:22:22.59ID:SuJMzV5Hr
自分の知らんところでコンストラクタ使われたら例外拾えないとかそんな腐った理由だろう

何があってもインスタンスが帰って来る状態が欲しいんだろうがその後処理を誤ると簡単に詰む
そんな甘いことを言ってるとバグ作るだけ
2021/05/09(日) 12:33:09.11ID:uZxXAkBZ0
>>825-826
アドバイスありがとう!
831デフォルトの名無しさん (ワッチョイ 2a63-jjtP)
垢版 |
2021/05/09(日) 12:44:50.59ID:2oHJe1AX0
コンストラクタで例外投げるとオブジェクトが中途半端に作成されたものがゴミとして残るからだよ
2021/05/09(日) 13:18:38.53ID:6ong4OY90
・コンストラクタで例外おきるとデストラクタが呼ばれない説
 ⇒確認できた
・デストラクタが呼ばれないのでGCされずにメモリリークが起きる説
 ⇒確認できず。list.add(new Hoge())を1000回で、Hogeコンストラクタ内で例外起こすかどうかで確認。
  例外起こさなければ使用メモリ増えるけど、例外ありの方は増えない。やり方が悪い?

メモリリーク云々はC++とかの話が元みたいで、それも例外投げるなではなく投げる場合は適切に参照を削除してから投げろみたいな話だったと思うのだが、
c#の方は問題ないのか?
標準ライブラリにもコンストラクタで例外返すやつあるのでそれの実装が見たい
2021/05/09(日) 13:21:46.98ID:hhBpMcqQp
残って気持ち悪いとしたらDispose持ちのネイティブリソースだろうけど
そのへんクリーン書こうとしたらファクトリメソッドでもやること変わらんでしょ
2021/05/09(日) 13:23:44.08ID:rwsrdF7nd
古いガイドラインだけど
>✔ 必要な場合は、インスタンス コンストラクターから例外をスローします。
だからダメってことはないんだよね

コンストラクターのデザイン - Framework Design Guidelines | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/constructor
2021/05/09(日) 13:33:06.24ID:6ong4OY90
ちょっと大きめのメモリ割り当てたら1回の例外発生時にGC呼び出されてるのも確認できた
2021/05/09(日) 13:38:09.58ID:WHUEfE6G0
>>813
> どんな値が渡されるのかわからない関数などは例外処理、その逆(外部に公開しない関数)の値チェックになら使えそうなのかなと思ったんですが
ざっくりその認識で正しいよ
内部的にはあり得ない状態ならAssert投げる
デバッグ終えたら削除とかアホのやること
注意すべきなのはassertの条件の所に副作用を含む式を書いちゃいけないことぐらい
2021/05/09(日) 13:42:03.78ID:yIvZIEF/0
そもそもなんでもかんでもエラー処理を例外任せにするのが間違ってるような
2021/05/09(日) 13:46:49.04ID:rAnETUQPM
C#ではコンストラクタで例外が出るとファイナライザが呼ばれないことから
コンストラクタでは例外を出すべきでないとする派閥が昔は存在した

しかしこれが問題になるのはコンストラクタでアンマネージドリソースを確保してDisposeで解放するパターンを採用したクラスだけだ
ネイティブライブラリをPInvokeで呼び出すような低レベルの仕事では気を付ける必要があるが
そうでなければ気にしなくてよい

またそのようなアンマネージドリソースを扱う場合でもC#ではSafeHandleを実装して使うことになっている
SafeHandleを使う側はリークをことさら恐れる必要はない
コンストラクタで例外を投げてもよろしい
2021/05/09(日) 13:48:56.57ID:aeEkFGhTM
>>833
例外投げるなら、その前に既にnewしたものを全部綺麗にDisposeしなきゃいけないわけだけど
そこまで考慮して正しく実装されたコンストラクタなんてドカタのコードで見たことないな
自分でthrowしなくても呼び出し先から例外が飛んでくるケースもあるから、本来は常に考慮が必要
あくまで可能性の問題としてだけど、コンストラクタで例外を投げるとDispose漏れが起こりやすいのは事実だと思うよ
漏れを完全に防げなくても、GC任せで問題にならない程度に頻度を抑えることはできる
2021/05/09(日) 13:53:06.35ID:V90kiCWja
>>836-837
ちょっと何いってるのかわからないw

>>838
なるほどね。
コンストラクタで例外投げてもほとんどの場合
問題がないことはよくわかったけど、
それでも個人的にはやっぱり避けるかな。

コンストラクタで例外が飛んでくることを想定してないプログラマが多い気がするから。
あえて違和感を感じさせるためにファクトリーにすると思う。
まあ屁のツッパリ程度の効果しかない気もするが。
2021/05/09(日) 13:53:17.09ID:rAnETUQPM
>>836
プログラマが内部的にありえないと考えている状態が実際に発生するかしないかはプログラマにはわからない
それがバグというものの性質だ
バグはプログラマの意識の外からやってくる
プログラマが間違えるからバグが発生する

なので絶対に起こらないから本番では外しちゃえなどと安易に考えずに
俺の考えではまあまず起こらないと思うけどもし起こったらやばいから念の為に残しておこうと考えたほうがよい
2021/05/09(日) 13:56:13.68ID:aeEkFGhTM
>>838
.NET 5以降ではCERが廃止されたからSafeHandleは意味ないよ
2021/05/09(日) 14:05:22.60ID:aeEkFGhTM
ちなみに.NET Framework(非Core系)でもCriticalFinalizerObjectに意味があるのは複数のAppDomainを使ったアプリケーションの場合だけだよ
あまり理解されてないけど、99.9%の人には無関係な極めてニッチな機能
2021/05/09(日) 14:06:37.90ID:KNQAmpF60
また空中戦やってるな
設計はどうなってるのか?もこだわらず
どう処理したいかばっかり
客がエラー扱いにしたいって言ったら
テメーの例外のこだわりなんかゴミ箱だ
逆もまた然り
2021/05/09(日) 14:12:54.16ID:aeEkFGhTM
いや客ってのがユーザーのことなら例外処理なんて客と無関係な純粋に技術的な問題でしょw
多重下請けならその限りではないかもしれんが
2021/05/09(日) 14:27:16.94ID:rAnETUQPM
>>842
SafeHandleはCERのためのものではなく
アンマネージドリソースハンドルのラッパーを提供するための共通基盤でありCER対応はその部分でしかない
SafeHandleは依然として有用だよ

初心者は参考にするといい
https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/implementing-dispose
2021/05/09(日) 14:30:18.11ID:rAnETUQPM
もちろんオレオレハンドルラッパーをDIYしたいならそれを止める権利は俺にはない
しかし趣味ならともかく仕事ではDIYを避けたほうがいいだろうねとアドバイスだけはさせてもらおう
2021/05/09(日) 15:15:59.96ID:xtmxe3CZ0
>>824
ありがとうチェックしてみるよ
2021/05/09(日) 15:17:59.75ID:E0SRP95CM
>>846
それは眉唾だな
docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandle?view=net-5.0
例えばこのサンプル、SafeHandle派生クラスを実装した上で更にそれを適切に解放するために普通にDisposeパターンを実装してる。
これが典型的な正しいSafeHandleの使い方だ。
CERが無いなら手間とミスしうるポイントが余計に増えるだけにしか俺には思えないね。
2021/05/09(日) 15:32:32.00ID:SuJMzV5Hr
newしたものが綺麗にdisposeされないって馬鹿のコードだろ

そもそもが引数チェックではじいてからnewするだろ馬鹿じゃないかと
2021/05/09(日) 15:40:33.58ID:SuJMzV5Hr
.netの内部でもこんな感じで普通にコンストラクタで例外投げてる
これ以外でどうやって通知すんだよ
馬鹿者が

if (path == null)
throw new ArgumentNullException("path", Environment.GetResourceString("ArgumentNull_Path"));
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
2021/05/09(日) 15:45:00.43ID:E0SRP95CM
>>851
ArgumentExceptionは開発時のバグであり、ソースの修正が必要だ
そのまま実行を継続すべきものではないから、リソースの開放漏れ云々は全く関係ない
2021/05/09(日) 15:49:17.16ID:SuJMzV5Hr
コンストラクタで例外は投げても良い

でもおかしなことをする奴がいるからコンストラクタでは例外投げるなは暴論
2021/05/09(日) 15:51:19.62ID:FUAnWwVaa
>>849
プラットフォーム呼び出し時の参照カウントなどはどうする?
855デフォルトの名無しさん (ワッチョイ ea61-LExt)
垢版 |
2021/05/09(日) 22:04:27.52ID:pySvIkdW0
例外はcatchして握りつぶすのが吉
2021/05/09(日) 23:19:09.95ID:CIQV7Tg10
async voidも多用すべし
2021/05/10(月) 07:43:24.96ID:v9qGjilad
クラスとかメソッドとか分けるときの命名が大変で時間が掛かるお…
適当にそれっぽい英単語繋げてるけど、メソッド名が50文字以上になることがよくあるお…
ForとかByとかFromとかも使うとより長くなるんだお…
どうしたらいいんだお?
2021/05/10(月) 08:00:47.54ID:XZUy8xNJ0
>>857
俺は命名には
https://codic.jp/engine
使ってる

文字数減らすためじゃなくて、英語力不足を補うためだけどw
50文字超えることはあんまりないかなぁ。
2021/05/10(月) 08:05:31.40ID:AtOV5vKAM
>>857
https://www.japan9.com/cgi/rand_num.cgi
2021/05/10(月) 08:26:26.05ID:v9qGjilad
>>800
自分は投げますね
MSが作ったデフォのクラスにも投げてるやつあったと思うのでそれを言い訳にしてます
2021/05/10(月) 08:28:55.47ID:EOKyCo1ad
>>858
>>859
ありがトンブレロ!
2021/05/10(月) 08:51:24.61ID:y0jj8Ah00
引数エラー一個一個出してくわけには行かない場合例外だと処理しにくいな
2021/05/10(月) 09:51:39.48ID:6ezg7cUTd
コメント打つ代わりにフルスペルで命名するっていう手もあるよね。
そうすれば入力する手間は変わらない。
でも英語が見慣れてなくて辛い。
2021/05/10(月) 09:56:18.04ID:AtOV5vKAM
C#は日本語ok
2021/05/10(月) 12:05:19.67ID:OSpjgtmc0
命名に悩んで手が止まるのアホらしいので、一旦日本語で命名して後で英語に変えてる
2021/05/10(月) 12:08:15.82ID:EOKyCo1ad
下手に英語やローマ字使うより日本のプロパティ名を使った方が分かり易いこともありますな
敢えて外人だけに意味を理解しにくくさせたいときなんかにも使えそうですな
2021/05/10(月) 12:21:43.63ID:XZUy8xNJ0
>>866
どんな場面を想定しているのか、すげぇ気になる
2021/05/10(月) 12:34:14.65ID:3Mkz5DyC0
enumの要素が日本語だとコメント要らずではある
本体がアルファベットならインテリセンスも問題ない
2021/05/10(月) 12:37:31.60ID:85dwBuQM0
国民健康保険保険者番号、という単語を変数名にするときは、だいぶ議論した上で、
kokuho_hnoになったな。
national_health_insurance_insurer_numberはとても反発が大きかった。
2021/05/10(月) 12:56:28.88ID:2MQuNC0ra
英語力がボトルネックになってるケースはむしろ少ない気がするね。
命名下手な人は日本語でも意味不明な名前付けそうな気がする
というより、だいたい命名以前の問題で既に失敗してるんだよね

普通のプログラマはそれが何をするメソッドなのか、「何者」なのかを
明確にしてからメソッドを書き始める。

命名で止まっちゃう人はそこがいい加減なんだよね。抽象化が出来てない。
2021/05/10(月) 13:00:52.85ID:y0jj8Ah00
enumって継承できない?
872デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/10(月) 15:31:20.10ID:lCZGOQhNF
>>841
良い心掛けをお持ちですね
大事になすってください
2021/05/10(月) 15:37:52.56ID:DLVUJfkF0
>>869
プロジェクト全体で使えるならnhi_insurer_numberみたいな略語ならありだと思うけどね
2021/05/10(月) 15:58:21.88ID:l/O9+A2Na
グロサリーは作った方がいいけどNHIで辞書に載ってるから(普通何だこれと思ったらググるよね?)
それはNhiIDでいいでしょ
875デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/10(月) 16:21:26.47ID:lCZGOQhNF
>>869
>>873
https://www.youtube.com/watch?v=qQDGX7Lj-RE
2021/05/10(月) 17:51:27.04ID:85dwBuQM0
俺も別に良いと思ったんだけど、とにかく反発がやばかった。
HNI_Insurer_No推しだった。
俺的には番号とついてるものにIDはまずい気がする。
2021/05/10(月) 17:56:24.33ID:giJ6lOgz0
kokuho_hnoだと保険者番号と被保険者番号の区別がつけにくいので
nhi_insurer_numberとnhi_numberくらいがいい気がする
kokuho_insurer_numberでも別にいいかな
2021/05/10(月) 18:24:14.99ID:id38dQYPr
変数名は単体で使ってるのか?
それともPersonクラスなどののメンバーなのかによって扱いが違う
2021/05/10(月) 18:31:34.09ID:Jv8jAyYxd
>>877
被保険者番号はhhnoという悲しいスタイルに。。
2021/05/10(月) 18:37:55.44ID:l/O9+A2Na
>>876
識別のために割り当てる符号は数字だろうがギリシャ文字だろうがID(identifier)でしょうw
ただ、保険者(業者)と被保険者を区別する必要があることに気づかなかった
この場合NhiIDはまずいね

まあスレ違い甚だしいな
2021/05/10(月) 18:42:01.34ID:giJ6lOgz0
hhnoかぁ

nhiもそうだけどhhnoやhnoみたいな普段の会話で使わない略語よりも
kokuho_hokensha_noとkokuho_hihokensha_noみたいに
普段の会話で使う日本語読みに寄せたほうが何かと良さそうだね
2021/05/10(月) 18:42:58.08ID:zy2rFAto0
番号なのにnoとか付けないってセンスなくね?
2021/05/10(月) 18:46:43.73ID:T4WFU4KFH
被保険者番号みたいなのは
コーディング規約をいじる裁量があれば日本語変数名が最強なんだよなあ
入力はちょっと大変だけど、視認性最強でドキュメントコメント不要になるし
英字表記に悩んだり表記ゆれに煩わされることもない、変な英略語覚えるのに頭使わなくて済む
2021/05/10(月) 18:46:58.67ID:id38dQYPr
みんな業務はjavaの人なんだなと
2021/05/10(月) 21:46:48.97ID:y0jj8Ah00
基底クラスでenumのステータス持ってて
継承してそのステータスの種類が増えるとき
enumが継承できないとステータスの種類が増やせなくない?
2021/05/10(月) 21:56:52.64ID:/NuMOBBIM
>>885
enumは決まった値しか取り得ない型
継承して取りうる値が増えたら、それは基底クラスにおける「決まった値のみを取る」という規約を破ってしまうことになる
規約を破らずに値を追加するには、継承せず普通にenumに追加しなければならない
2021/05/10(月) 22:00:17.01ID:y0jj8Ah00
>>886
したらステータス値はどうやって持つべきだと思ってる?
ここでenumが使えないと言うなら一体どこで使えと言うの?

まあ、const intで頑張ってるけど
2021/05/10(月) 22:38:40.75ID:8qfIqwaR0
>>871
出来ぬ、出来ぬのだ
俺も出来たら便利だよなーと思ったけどダメだった
2021/05/11(火) 00:18:16.99ID:lKBWqYLpa
率直に言ってenumを継承するって発想自体が理解不能w

>>885
enum Eを継承してFを作れるとして、Eの型のプロパティHogeを持つクラスAを継承してBを作っても、
Hogeの型をFに変えることはできないよね?

スーパークラスでステート値を増やすって発想に無理がある気がする
2021/05/11(火) 00:47:29.66ID:aDB05LmB0
>>889
継承してステータスの取りうる状態が増えるときはどーするの?
ステータスはenum使えってみんなが言うから使ったらこのザマだよ
所詮、プログラムなんか組んだことないアホの戯言だった
継承して増える可能性のある値はenumなんか使っちゃ駄目だってことだね
俺は一生使わないと思う
2021/05/11(火) 01:06:35.85ID:lKBWqYLpa
>>890
まずそういうケースがあんまりありそうもない気がするけどあるとして、

(1) ベースクラスを書く段階でサブクラスでありうる拡張を織り込んで予約しておく

(2) それが無理なら
enum BorderStyle {None, Single, Double, ExtendedStyle };

みたいにしておいて、BorderStyle == BorderStyle.ExtendedStyle
の時には別のプロパティでスタイルが決まるようにする
2021/05/11(火) 01:27:29.73ID:qWgZ839v0
> Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
> Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.")

上の書き方の場合、文字列部分を定数で宣言できたってメリットあったと思うんだけど、$使う文字列挿入だとできないよね
使い分ければ良いだけだと思うんだけど、他に冴えたやり方あったりする?
2021/05/11(火) 01:28:06.43ID:aDB05LmB0
class作ってメンバでconst intにしようと思ったら
採番が面倒だから結局intになったわ
と思ったらそれもログ出力が面倒で
結局、状態クラス作ったわ
2021/05/11(火) 01:31:27.37ID:m6WVK0Xg0
enumは基本的に定数をならべただけだから不変のものにしか使っちゃだめ

ステータスを表すクラス作れよ
2021/05/11(火) 02:06:49.74ID:aDB05LmB0
>>894
不変よ
少なくともプログラムが実行されてからは
だって状態を表してるんだから
変更が必要になるのは継承で分岐するソースコードの修正作業時だけ

こういう形でenumが使えないなら
今後継承を行う可能性が少しでもあるならそのクラスではenumは一切使えないということ
実際使わないほうがいいと思う

赤青ランプを継承して
赤青黃ランプを作ったときに
状態赤青がenumで作られてたらゴミ箱にブチ込むしか道はない
2021/05/11(火) 02:09:51.01ID:lKBWqYLpa
挿入文字列はコンパイル時に解析される(実行時に解析されるわけじゃない)と思うので(知らんけど)
stringの変数に挿入文字列自体を入れるとかできないと思うけど、そもそも何でそんなことがしたいの?

多言語化のために文字列リソースにしておきたいという動機なら理解できるけど
変数に入れたい動機が思いつかない
2021/05/11(火) 02:10:54.04ID:aDB05LmB0
>>896
ログ出力したいんじゃん?
2021/05/11(火) 02:12:53.21ID:1Lpm83JY0
>>895
enumの定義をclassの外に出して独立させれば
2021/05/11(火) 02:13:54.09ID:aDB05LmB0
>>898
何の解決にもなんなくね?
2021/05/11(火) 02:16:57.22ID:aDB05LmB0
>>898
赤青黄と赤青緑に継承で分岐したとき
どんなenum定義するって言ってる?
2021/05/11(火) 02:38:14.36ID:1Lpm83JY0
>>900
派生元も派生先も関係なく1つのenumで定義すればって意味で書いた
使う時はプロパティやメソッドでそのクラスで利用可能な値かをチェック
2021/05/11(火) 02:41:03.08ID:lKBWqYLpa
だからそもそも根本的に考え方がおかしいと思うよw
集合論的に考えてみて

例えば、

自然数⊂整数

ってことは明らかに「整数 is 自然数」ではないでしょ。
自然数を継承して整数を作る、とう発想がそもそもおかしい。
2021/05/11(火) 03:32:52.71ID:/5H26xT50
>>895
赤青ランプを継承して赤青黄ランプを作るってのがそもそも筋が悪いだろう
N色ランプを作って赤青でも虹色でも好きに作ればいい
2021/05/11(火) 07:38:19.05ID:aDB05LmB0
は?設計書にそう書いてあって
矛盾なく動くのに何がおかしいんだよ
頭いかれてんのか
いいからこの場合どういうenumになるのかさっさと書けよクズ
2021/05/11(火) 08:46:28.86ID:8Zm8z2p2p
普通そう言う場合enum使わんしょ
継承後色がどうなるか確定的じゃないし
stateを普通にintで管理して、それにRGB入りの配列で色を割り当てたら?
2021/05/11(火) 08:55:42.36ID:aDB05LmB0
>>905
それだとプログラムの拡張の際に取りうる値が増える(実行時ではない。ソース修正時)可能性がある項目は全部enum使えないじゃん

まあ、実際使えないけど
2021/05/11(火) 09:52:12.74ID:FCSidwoba
>>904
実装上の都合で赤青ランプに後付けで黄色を取り付けたのだから、色を表す定数として赤青のenumとは別に黄色の定数を定義することになるのは自然だろう。
それをあたかも三色同格のランプだと見せかけてるんだから、定数についても見かけ上同列に扱うためのenumを新たに定義しなければならないのは仕方ない。設計がいびつなのだから、内部処理的にもいびつになる。
2021/05/11(火) 10:10:24.00ID:aDB05LmB0
>>907
何言ってるかわかってる?
基底に20個ぐらいステータスあってさらに増え続けてるとき
継承した分だけenumに同じステータスを追加しまくれっていってんだよ
継承10も20もやったら大変だぞ
もう実際はハードごと20種類以上追加しないといけなくてやってられないから
俺はenumはゴミと切り捨てたけどね
2021/05/11(火) 10:33:16.06ID:aLadY06bM
>>908
だから追加できたところでそのステータスを何に使うんだよ
増やしたところで基底型では扱えない未知の値なんだから継承の意味がないだろ
2021/05/11(火) 10:45:31.24ID:fJhAJw720
♪燃〜〜えろよ燃えろ〜〜よ〜〜
2021/05/11(火) 11:02:46.92ID:aDB05LmB0
>>909
は?
お前、状態遷移組んだこと無さそうだからいいやw
2021/05/11(火) 11:03:10.18ID:8BKOP9bia
>>908
まだ言っとるんだねw
だから根本的に考え方が間違ってるんだってw

特化/汎化って言い方をすると思うけど、継承っていうのは
汎用的なものを特定用途に「特化」するものなんだってw

だから>>902に書いた通り汎用性が小さい自然数を継承して整数にする、って考えは根本的におかしいし、
汎用性が小さい2ステートを継承して3ステートの物にするというのも間違ってる

考え方が逆だ。
多ステートの特殊形が3ステートで、3ステートの特殊形が赤青黄でしょ。
赤青のロジックの一部を赤青黄で使いまわしたいなら継承以外の方法で考えましょう。

例えば、RGB.RをRB.Rに変換する変換関数は書けるんだから、
Color ToColor(RGB rgb){ ... }
というメソッドは、中で
Color ToColor{RB rb){ ...}
と使いまわすことはできる
2021/05/11(火) 11:06:54.31ID:aDB05LmB0
>>912
赤青黄はあくまで例であって実際にはハードの差分管理してんだよ
だから全部定義し直したらものすごい量になっちゃうの
2021/05/11(火) 11:11:17.08ID:aDB05LmB0
はっきり言うけど
べき論は結構だけど
enum型がこの仕様のままなら
なんにも使えない
もしくは使わないほうがいいと思う俺は
2021/05/11(火) 11:14:26.45ID:aDB05LmB0
じゃあ、いっそenumって定義をやめよう
state型が必要です

これでおk?

おそらくこれができたら
enumなんか誰も使わない
それだけの話
916デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/11(火) 11:14:32.61ID:FWZS8iTBF
>enumはゴミ

知ってた
2021/05/11(火) 11:18:15.50ID:m6WVK0Xg0
>>895
不変っていうのは、実行時に変わらないって意味じゃないぞ
修正/機能追加でも変わらないってことだ
結論としては自分で書いてる通り
>今後継承を行う可能性が少しでもあるならそのクラスではenumは一切使えない
だよ。Enum継承したいってことはつまり変更したいってことだから

Color.RedやColor.BlueはEnumじゃないだろ
まあSystem.Drawing.Colorは構造体で継承できなかった気がするけど
そんな感じで作っとけ
2021/05/11(火) 12:02:27.73ID:N41oKzlma
>>915
話が通じない人だなw
問題はenumにあるんじゃない。
>>902にはどこにもenumなんか出てきてないでしょw

汎化するのに継承を使うのがおかしい。
継承は特化するのに使うんだってw
2021/05/11(火) 12:55:03.04ID:9XfnnIxq0
どれの話をしてるのかわからんけど困ったことない

Enumでやる
virtual List<enum> Lamps => 赤、青を返す
override List<enum> Lamps => base.Lampsと黄を返す

Flagでやる
virtual Color Lamp => Color.赤 | Color.青
override Color Lamp => base.Lamp | Color.黄

Flag側で継承
[flag]
enum Color{
赤=1,
青=2,
黄=4,
Hoge=赤 | 青,
Hoge2=Hoge | 黄
}
2021/05/11(火) 13:34:53.46ID:aDB05LmB0
>>917
そんなの未来永劫保証できないじゃん
enum作った人本当にバカなんだね
使えないもん作ってろよって感じ
2021/05/11(火) 13:38:39.20ID:aDB05LmB0
>>919
基底に黒とグレーを追加
2021/05/11(火) 14:03:01.12ID:9XfnnIxq0
>>921
別に俺が作ってる訳じゃないからそんなこと言われても知らんがな
enumでやりたくないならそれでいいと思うし好きにやりなよ
2021/05/11(火) 14:27:53.86ID:7X7kMfyca
>>919
enumの利点はコンパイル時に名前の集合を型として定義できる、
名前の集合が確定していて、だからインテリセンスが使えたり
集合に含まれないはずの名前が使われている間違いをコンパイル時に検出できることなので
それは代用にならんでしょ。

質問している人の問題はたぶん継承に固執してること。

部分集合を再利用して上位集合を定義したいって問題意識は分からんでもないけど、
emumなんてただの名前の集合なんだからそういう場合はコピペ継承するのが多分正解。
2021/05/11(火) 14:31:08.99ID:pmLjbtQdD
適材適所
2021/05/11(火) 14:40:19.26ID:/TD/rkCHM
C#や諸々の言語はそもそも、継承の仕様が出来損ないなんだよね
Java 16みたいにSealed Classを定義できるなら、まだしもねぇ

どんなクラスでも継承できます、なんて言われてもね
全てのサブクラスの面倒を見るなんて、事実上不可能だろ

だからサブクラスを限定する仕組みが必要なのだが…
C#はまだまだ、遅れてるね
2021/05/11(火) 14:45:04.15ID:9XfnnIxq0
>>923
ああ、そういう事ね
Nullとか空とかのEnumを用意しとくべきかみたいな話と似てるな
2021/05/11(火) 15:00:11.95ID:1Lpm83JY0
>>925
Javaのことは知らんけど
C#のsealed classでは駄目なの
2021/05/11(火) 15:07:01.36ID:9XfnnIxq0
自分ならカスタム属性と拡張メソッド作って、集合.Hoge.Colors()で一覧を取れるようにするかな
まあケースバイケース

enum 集合{
[AddColor(Color.赤, Color.青)]
Hoge,
[InheriteColor(集合.Hoge)]
[AddColor(Color.黄)]
Hoge2
}
2021/05/11(火) 15:14:49.86ID:Fjpe2RX80
>>927
そっちじゃなくて継承できる型を限定する機能だね
ShapeインターフェイスをRectangleクラスとCircleクラスのみ実装可能にする
他の奴がTriangleクラスを作ってShapeを実装するのは認めない
2021/05/11(火) 15:43:37.19ID:1Lpm83JY0
>>929
なるほどC#に限定する機能はないね
コンストラクタのアクセス権をinternalにしてアセンブリを分ければ実用上はそんなに困らなそうだけど
2021/05/11(火) 16:04:08.87ID:gVDvfxdk0
>>919
>override List<enum> Lamps => base.Lampsと黄を返す

これはEnumでやってるんじゃなくListでやってるだけのような・・
取りうる状態の範囲をEnumで表現してないしコンパイル時のチェックも無理だよね

>override Color Lamp => base.Lamp | Color.黄

こっちも型としてはColorになるので既存のColor定義が赤と青だけなら
全く別のEnumを新しく定義することか、既存の定義自体を変更して黄を足すかになるので
既存のコードを維持したまま新しいコードを追加することはできないよね?

Enumを使うべきユースケースじゃないからできなくて当たり前なんだけどさ
2021/05/11(火) 16:18:03.82ID:qWgZ839v0
>>896
文字列の雛形をDBに持たせて、パラメータ部分を置換して出力するみたいなことやってたのよ
『置換して出力』部分を$使う挿入文字列で置き換えられたらいいなって夢想した

pythonの似たような機能でキーワード引数による指定が出来るから、似たようなこと出来ないかなって
> print('{first} and {second}'.format(first=a, second=b))

string.format使えばいいだけなんだけどね
2021/05/11(火) 20:06:26.01ID:7D4cBYXWM
>>932のやりたいことが挿入文字列を共通化したいってことならおとなしくメソッド化して
string ToHelloText(string name, DateTime date) => $"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.";

Console.WriteLine(ToHelloText(name, date));
みたいな使い方するほうがいいんじゃ
934デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/12(水) 09:24:40.12ID:HCx7UYF5F
プラごみを減らすためにレジ袋有料化するって話と似てるな
そもそもピントがずれてるし前提も可笑しい
2021/05/12(水) 14:46:53.00ID:kcMRoKH40
リソースで他言語対応すると考えると欲しい気持ちは分かる
"Hello, I'm {givenName} {surname}."
"こんにちは、私は {surname}{givenName} です。"
みたいに書きたい
2021/05/12(水) 14:52:52.50ID:KOpdkLhcM
All your base are belong to us
2021/05/12(水) 18:25:12.05ID:l5b/FJ1ur
evalをやりたいと言うことだな

テスト不可になるからいらんけど
2021/05/12(水) 22:11:27.01ID:rLfxFtSp0
c#ってvisual studioインストールしたときに入ってるコンパイラじゃなくて
.Net 5に移行するのが良いでしょうか?
Microsoftも.Net 5移行を推進していきますかね?
2021/05/12(水) 22:18:36.03ID:ApiPrDZMM
同じもの
2021/05/12(水) 23:16:35.91ID:rLfxFtSp0
そうだったんですね!
2021/05/13(木) 01:52:12.91ID:Q5JRmth30
コンパイラは同じ
実行環境やフレームワークは違う
2021/05/14(金) 12:23:19.63ID:4kCY9pobM
まさかC#でメンバ変数名のprefixにアンダーバー付けてないやつおる?
https://anond.hatelabo.jp/20210513215649
2021/05/14(金) 12:27:21.06ID:hPLmdAiv0
なんで今更感が半端ない
アンダースコアつけて怒られた記憶あるわ
944デフォルトの名無しさん (ブーイモ MM5b-M3SR)
垢版 |
2021/05/14(金) 12:32:54.76ID:o+OksdyUM
アンスコあかんの?
2021/05/14(金) 12:45:33.90ID:4kCY9pobM
今まで記載がずっとなくて、同じMicrosoftの子会社が出してるStylecopっていうコード解析ツールの言ってることなら正しいだろうって風潮だったんだけど逆転敗訴した感じ
2021/05/14(金) 12:49:56.23ID:idb/Si4k0
前までただのキャメルだったよな? 何かしっくりこないなあと思いつつあわせてたのに
というか>>942はちゃんとprivateのメンバ変数って書いてくれ
2021/05/14(金) 12:59:44.72ID:ty8DhYlQ0
俺は今まで通り m_ + PascalCase でいく
2021/05/14(金) 13:15:24.24ID:fGdsMbaSD
キャメルケースの事をキャメルって略すのはどうも抵抗がある
2021/05/14(金) 13:52:15.03ID:xt/CNvYd0
スコープで付けると便利だけどね

gグローバルgUnko
mメンバmUnko
in引数入力inUnko
out引数出力outUnko
valローカルvalUnko
2021/05/14(金) 14:00:51.83ID:E7dr4uiDa
>>942
さすがにアホなガイドラインでほとんど同意は得られない気がする。
バッキングフィールド限定なら少なくとも俺は賛成するけど。

まあ、普通のフィルドもバッキングフィールドも出番減ってるから
どうでもいいと言えばどうでもいいかも
2021/05/14(金) 14:04:32.36ID:vWTxavwv0
アンダースコアはライブラリと被った記憶
C言語時代だが
2021/05/14(金) 14:10:10.14ID:xt/CNvYd0
ぶっちゃけ客先のカスタマイズできない環境で文字ちっちゃくて見にくいときあるからイラネ
2021/05/14(金) 14:16:07.40ID:E7dr4uiDa
しかし、_でプリフィクスしとくとインテリセンスでフィールドが一覧できて便利だよ、
ってコメントは泣けてくるねw

普通逆じゃないかw
インテリセンスの候補に登場して欲しくない奴を_でプリフィクスするのが普通のセンスだと思うけど。
2021/05/14(金) 14:36:58.65ID:idb/Si4k0
>>953
そのコメントどこに書いてある?


ところで別の話なんだけど、
とあるデータの集計や加工をメソッドチェーンで書きたい考えと、その集計や加工をデータとは別のクラスかつステートレスで書きたい考えって両立できるのかな?
拡張メソッド使うくらい?
2021/05/14(金) 16:32:10.35ID:0kdm8qdh0
>>954
コンテナ(データ).加工(…).集計(…)

インスタンスメソッドは暗黙的にthisを使ってるのでステートレスじゃないってことなら拡張メソッドも同じじゃない?
956デフォルトの名無しさん (ワッチョイ cb68-gSvD)
垢版 |
2021/05/14(金) 19:49:54.05ID:xeRYEvYS0
オセロのプログラム作っています。
オセロが盤面にの上にくると影を描きたいのですが
これはフォームアプリでできますか?
2021/05/14(金) 20:01:11.64ID:7GBYwo1U0
>>946
publicなメンバ変数って一般的か?
2021/05/14(金) 20:03:38.54ID:7vyBBBSUM
>>956
半透明の影を書き込んだ画像と影なしの画像の2種類を用意しといて切り替えたらいい
それ以上を求めるならFormsなんか捨ててちゃんとゲーム作りとしてUnityとかに再入門した方がいいよ
2021/05/14(金) 20:38:27.45ID:8fzMB91td
>>956
あくまでもWinFormでやるならGDI+っていう機能を調べて、
円をキャンバスに描けばオセロ程度のアプリケーションを作るのは楽かもね。
そりゃあ本気でゲーム作るならUnityだろうけど、
オセロの内容にこだわるなら、コンソールで十分なんだけど。
2021/05/14(金) 20:41:16.98ID:95pD/4XI0
WPFならDropShadowEffectで一発
2021/05/14(金) 21:13:06.87ID:VM2FDDZI0
>>946
いや、そもそもそんなコーディングガイドラインは存在しなかった。各ツールやライブラリごとに好き勝手やってる
あと、privateだけじゃなくてinternalもな
2021/05/14(金) 21:29:52.56ID:d3AihMu6a
>>956
「オセロが盤面にの上にくる」っていうのがどういう状況かよく分からんのだけど、
プレーヤーが置いた位置まで石が移動するアニメーション的な演出をしたいってこと?
2021/05/14(金) 21:45:19.42ID:Hk5V+gvwr
m_とかアンダースコアつけるとかは原始人に見えてしまう
2021/05/14(金) 21:49:55.96ID:d3AihMu6a
フィールドにmつけるのは割とそんな悪い習慣じゃないと思うけどアンダースコアは要らんね
mFooでいい。m_Fooにする意味が分からん
2021/05/14(金) 21:50:54.76ID:Hk5V+gvwr
そっちの方が原始人度が高いとおもうがw
2021/05/14(金) 21:51:52.40ID:Hk5V+gvwr
フィールドにメンバーのmをつけるのもどうなのかとw
2021/05/14(金) 21:54:28.98ID:2Onmey4o0
プロジェクトで統一されてりゃなんでもええよ
センスだのなんだのは個人の信仰でしかあらへんのじゃ
2021/05/14(金) 21:56:28.53ID:et+gRElJM
一般的な流儀はキャメルmFooかスネークm_fooのどちらか
2021/05/14(金) 22:00:45.23ID:krSfg/SG0
てめぇの流儀を勝手に一般化するな
2021/05/14(金) 22:05:44.68ID:d3AihMu6a
>>968
キャメルとスネークの差異は単語の区切り方にあると思うけど、フィールド(メンバー)にmつけるのは
ハンガリアンだと思うので本来はちょっと別物だよね。

>>967
確かに人間には適応能力があるので基本的にはその通りだけど、
それでも優劣の差がないというのも欺瞞だとは思う
あるとしてもどうでもいい程度の差だろ?はいその通りですw
2021/05/14(金) 22:20:25.04ID:Hk5V+gvwr
>>957
Xamlで
2021/05/14(金) 23:16:17.86ID:ijV+D4Iw0
>>969
そういうゴタクはキャメルとスネークより一般的な流儀出してから言いなよ
2021/05/15(土) 10:06:46.25ID:DyddzWuxM
>>954>>953が書いてるコメントって
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/coding-conventions
のヒントのことか・・・・・公式ドキュメントでお墨付きつけてるのはちょっと酷いような

VS2019標準のLintでアンダースコア始まり変数名って許容されてたっけ?
最近VSCodeでしか書いてないから分からん
2021/05/15(土) 10:11:49.42ID:I4FgZZwl0
作ってるやつがゴミカスなんだな
昔のインド人は頭が良かったということで
2021/05/15(土) 13:01:38.70ID:K7/xaqOQ0
複数ルール混在するのが一番面倒なので、mでもm_でも_でもいいから統一してくれればいいかなあ
そんで_に統一しませんかって事か
2021/05/15(土) 13:35:41.44ID:u3bkv4kna
クラス内で揃ってればどうでもいい
2021/05/15(土) 13:39:10.32ID:X2M8i/YMD
>>976
これ
978デフォルトの名無しさん (ラクッペペ MM17-JFKK)
垢版 |
2021/05/15(土) 13:45:45.41ID:Q8PHpDoBM
すまん
2021/05/15(土) 16:04:03.86ID:k7UiOGH90
ほんまそれなんやが
アホな中華は1クラス1万ステップとか作ってくるからめちゃくちゃになるんや
2021/05/15(土) 16:17:10.56ID:/1WA0n4U0
パフォーマンスどうなんそれ
2021/05/15(土) 18:21:31.59ID:aVMlO2Jw0
c#のprivateメンバー変数にアンダースコア付けろだと…
これが今後のルールになるのかな?
2021/05/15(土) 19:22:05.87ID:En4kpP4hr
ゴミみたいなルールで泣けてくる
2021/05/15(土) 19:28:07.03ID:I4FgZZwl0
ゴミカスが普段組んでもいないのにいいと思って考えちゃったクソルール
2021/05/15(土) 19:53:08.40ID:En4kpP4hr
これはひどい…

https://www.sejuku.net/blog/102559
2021/05/15(土) 20:00:50.49ID:x5z5lzlG0
一般的にって根拠を示しにくいけど、Microsoft公認のコーディングルールって言うとStylecopが示しているキャメルケースしかありえないんだよな
mHogeやm_Hogeは論外で今回の更新によって_Hogeが台頭したけど
2021/05/15(土) 20:14:20.26ID:tihXB0Cj0
hogの意味を辞書で引く
2021/05/15(土) 21:11:59.64ID:EZTpChRKM
>>985
_Hogeじゃなくて_hogeな
MS自身が書くコードでは昔から一般的に使われてるルールなんで、そんなに驚くほどのことでもない
意識高いとこだとわりと採用されてるよ
988デフォルトの名無しさん (ワッチョイ 6dda-gSvD)
垢版 |
2021/05/15(土) 21:55:57.08ID:P/ScDIg90
いま入門書で勉強中の初心者です
コードは基本的に上から下に処理されていくと理解しているのですが
本に出てくるサンプルコードは呼び出す側のあとに呼び出される側のコードが書かれていることが多くてしっくりきません
何か理由があるのでしょうか?
2021/05/15(土) 21:57:54.60ID:Cs9vHg9X0
ないよ
2021/05/15(土) 22:00:38.14ID:18pqJB1E0
そんなん言うたら、呼び出すメソッドが別ファイルの別クラスにあるのはいいんか?っちゅう話だよな。
2021/05/15(土) 22:03:52.54ID:t/RrGLho0
>>987
さすがにs_を標準にしちゃうのはかなり疑問だけどね
2021/05/15(土) 22:23:45.04ID:kOi9a7N70
>>988
多くの場合「全体 -> 部分」の順で理解したほうが
「部分 -> 全体」の順で理解するよりも圧倒的に脳にやさしいので
コードの構造もそれに合わせることで読みやすくしてる
2021/05/15(土) 22:39:14.46ID:Tm9lZ4XLa
>>988
呼び出し元を上から下に進んで
呼び出し先に亜空間ワープして
呼び出し先を上から下に進んで
呼び出し先が終わったらまた亜空間ワープで呼び出し元に戻って
呼び出し元をまた上から下に進む
2021/05/15(土) 23:03:58.43ID:tihXB0Cj0
関数など邪道
2021/05/15(土) 23:08:38.70ID:Cs9vHg9X0
全てasyncとlinqで実装
2021/05/16(日) 01:12:40.73ID:cPyU4P820
>>988
昔のC言語は呼び出す前に関数宣言しておくか関数を定義しないとエラーだったから考え方は正しいよ
単にプログラム言語としての利便性が上がっただけ
2021/05/16(日) 02:38:29.44ID:sFLeX0L5a
前方参照が不可でプロトタイプ宣言が必要だったのは単に当時の技術的な制約に過ぎず
本質的な物じゃないと思うよw

メソッドのソースコード上の位置(どのファイルの何行目にあるか?)は
「技術的には」何の意味も持たない、と言うのが正しい。

一か所からしか呼ばれないメソッドがあるとき、呼ばれる側のメソッドを呼ぶ側より上の行に
書きたがる人がいるし気持ちは分からんでもないけど、そんなのあくまで好みの問題。どーでもいいよそんなの、が正解。
2021/05/16(日) 05:34:08.17ID:fcFZ09AZ0
最近の言語だとどこでも関数宣言できるし、かと言って関数内だと一番下で宣言した関数を上で使えるって訳でもない場合もあるからね
トップレベルの処理は言語仕様によって分けられていることを理解するのは最初は結構大変なもんだ
2021/05/16(日) 09:15:56.70ID:RjyUN9Py0
>>988
呼び出される側のあとに呼び出す側のコードが書かれていても
> コードは基本的に上から下に処理されていくと理解しているのですが
ならしっくり来なくね?
Pythonみたいに動的に関数定義したいということかな?
2021/05/16(日) 09:16:15.77ID:RjyUN9Py0
>>996
それ逆やぞ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 53日 20時間 17分 52秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況