X



ふらっと C#,C♯,C#(初心者用) Part150
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 2b02-+i0H)
垢版 |
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
0003デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/23(火) 21:59:18.80ID:EIK7uDnA0
コンソールでRPGみたいなゲーム作ろうとしてるけど
クラスの作り方がいまいち思い浮かばない
例えば
レベルアップした時にHPとかMPとかのクラスのフィールドをいじりたいけど、レベルクラスに入れるとステータス取るときに毎回status.level.hpみたいにレベルを通らないといけないのが厄介
かといってステータスクラスの中にレベルクラスとHPクラスを内包してしまうとレベルクラスのメソッドが呼び出された時にhpクラスのメソッドが呼び出せない…(staticはなしとして)

どうすれば良いのだ
0005デフォルトの名無しさん (アウアウウー Sa5d-7TK3)
垢版 |
2021/03/23(火) 23:04:14.83ID:zRupaTqla
>>3
単純に、ステータス、レベル、HP、MPをメンバ変数に持つクラスにすりゃええんちゃう?
レベルアップメソッドを呼ばれたら、それぞれを更新するだけ

最初は難しく考えないで、ありのまま設計して実装してみる
で、破綻しそうなら設計を変えて再実装
そういう試行錯誤も楽しいかもよ
0006デフォルトの名無しさん (ワッチョイ 51a7-FMtt)
垢版 |
2021/03/23(火) 23:32:37.84ID:3AlrkluQ0
ゲームはすべてのリアルタイムデータをエクセルに並べるつもりでプログラムを組め
物体同士の相互作用処理が一番多くてかつそれが7つも8つも同時に関わるので
オブジェクト指向言語の機能が役に立たないどころか悪影響すら及ぼす
絶対に使わないほうが楽に組めるぞ
まあ、まずやってみろ
0008デフォルトの名無しさん (ワッチョイ b102-+i0H)
垢版 |
2021/03/23(火) 23:59:45.77ID:ACoFzk2L0
でもまあ、とにかくやってみるってのには賛成。
根気よく続けて、それにちょっとした向上心があるなら、そのうちそれなりにはなる。

>>3 の人は、直接的なアドバイスを求めてるんだろうけど、ちょっとアドバイスしたくらいでどうにかなるようなもんでもないなぁって感じ。
0009デフォルトの名無しさん (ワッチョイ 5168-u+xM)
垢版 |
2021/03/24(水) 03:06:14.87ID:hZzg7ROH0
>>3
オブジェクト指向言語だからクラスは物、オブジェクトであって、
RPGのキャラはそれぞれステータスを持つオブジェクト=クラス。
キャラにはステータスがあるなら、それぞれのキャラクラスにはステータスクラスが保有されるべき。
・・・などと自分なりに整理して、設計してみてはどうか。
その設計で厄介なことがあっても、設計に納得出来るなら、それは通るしかない厄介事なのかもしれない。
それを回避したり厄介を軽減する手段はいろいろ有ると思う。
やってれば身についてくる。その過程がまた楽しい。
設計が正しいかどうか、それは自分が決めればいいが、想像が付かないなら書籍を漁る。
0010デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 06:37:38.52ID:k6isLik00
3だけど
一応4回くらい違う設計で同じ処理のコードを作ってみたんだが、やりたいことは
親クラスに子クラス1,2がいて
子クラス1のフィールドが更新されたとき、子クラス2のフィールドを更新したい

一応現状はref使ってインスタンスされてる子クラス2のアドレスを保存して子クラス1で間接的に更新してるけど
子クラス3,4,…って増えた時に毎回コンストラクタの引数変えて処理追加させるのは冗長的だなぁと思って違うやり方したいと考えてるけど思いつかない…
0011デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 06:43:09.14ID:k6isLik00
>>4
パラメータクラスに最大値、最小値、現在値をプロパティで持つようにして
HP、MP、LV、EXP、クラスをパラメータクラスを継承して作ろうとしてる
さいごにステータスクラスとしてHPからEXPをフィールドに持つようにしてコンストラクタでインスタンス化させるようにしてる
0012デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 07:00:45.85ID:k6isLik00
class Prameter{
private int _Max;
public int Max{
set MaxUpdate(value);
get return _Max;
}

protected virtual
void MaxUpdate(int val){
_Max=val;
}

最小値も上と同様
現在値も上と同様※
}

※少し実装とは違うけどざっくりとしたらこんな感じのクラスを現状HP,MP,Level,exp全クラスにそれぞれ継承してる
レベルアップとかは現在値の更新時処理のoverrideで処理変えたりして実装してるんだ
0013デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 07:19:03.14ID:k6isLik00
>>6
やっぱりそうか。Cのような関数での設計なら単純で作りやすいんだがオブジェクト指向の練習と思ってやってると意外と難しかった。
ちょうど7つも8つもパラメータが増えてきていちいち引数変えたりするの面倒やしクラスにするメリットがあまりないな…
0015デフォルトの名無しさん (ワッチョイ 9301-lXNI)
垢版 |
2021/03/24(水) 12:54:19.52ID:C9/npL5e0
>>11
ステータスクラスがHP, MP, LV, EXPの最大値、最小値、現在値をそれぞれ直接int等で持つ構成と
ステータスクラスがHP, MP, LV, EXPの各クラスのインスタンスを保持する構成とを比較して
後者にどういうメリットがあるのか、もしくはないのかを考えればいいんでないのかな?

>>10
>親クラスに子クラス1,2がいて
親クラス・子クラスという表現は一般的に継承関係を指すので
あるクラスが別のクラスのインスタンスを保持してる場合は親クラス・子クラスという表現は使わないほうがいい

>子クラス1のフィールドが更新されたとき、子クラス2のフィールドを更新したい
今回のケースで使うべきかどうかは微妙だけど
フィールドが更新されたときにそれをイベントとして通知するようなパターンを使えば
クラス1のコードでクラス2を参照する必要がなくなって通知先が増えてもクラス1を変更しなくてよい
0018デフォルトの名無しさん (スププ Sd33-PDCb)
垢版 |
2021/03/24(水) 17:52:37.32ID:JXkKcrLid
なるほど、
皆様、様々なアドバイスありがとうございます。
特に親、子クラスとかのニュアンスや使い方の指摘はありがたい。

ちなみにゲームの再現はしてないけど、イメージはCUIのドラクエのイメージ。それをオブジェクト指向の練習としてクラスで作ってみようとして一番最初で詰んだという経緯っす。

メリットデメリットは正直オブジェクト指向が初めてだからよくわからないってのが本音。ただ知識として幅は広がってる気がする。MVCモデルとかで実現するのかなーとか考えたりイベントをリストで管理するのかなーとか色々模索はしたけど結局いい感じにならず苦難中。
0019デフォルトの名無しさん (ワッチョイ 937c-4Ddi)
垢版 |
2021/03/24(水) 17:59:16.27ID:HEdEJwPg0
最初はあんまり沢山クラス作らない方がいいかと思う
段々とここは分離した方がいいとか継承した方がいいとか分かってくるので
とにかく動くものを作れるかどうかで勉強するにしても先に進めるかどうかの分岐点になるからな
0020デフォルトの名無しさん (ワッチョイ 0b33-zgiT)
垢版 |
2021/03/24(水) 18:09:40.53ID:spck33He0
オブジェクト指向の学習が目的なら、ポケモンで学ぶオブジェクト指向みたいなのがいくつかあるから
そういったPOSTを眺めるとなんとなく雰囲気がつかめるかもしれない
0021デフォルトの名無しさん (アウアウウー Sa5d-oXDN)
垢版 |
2021/03/24(水) 18:29:08.45ID:c5QGfFFqa
ゲーム自体があんまりOOP向きの題材じゃないかもしれないよ。

モデル化する必要があるのはゲームの世界を成立させている「舞台装置」
であってプレーヤーの目に見える表層的なキャラじゃなかったりすると思うんだけど
前者は得てして抽象的な存在になるし、どうしても後者に引きずられてしまう。

知らんけど。

大昔シューティングゲームとかボードゲームがいかにOOP向きじゃないかって
論争があったねw
0022デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 18:34:43.36ID:7kvkVNgG0
そうか…
既にOOPに対して嫌悪感を抱き始めるこの始末。
とはいえ継承ができたりオーバーライドして変更したりできるのは良いね
〇〇/××って形の表示するのもは全部同じパラメータクラスで扱えるし、ちょこっと変えたいとなるとオーバーライドで消したりオーバーロードで処理増やしたりできるもんね。

うーん、やっぱC#はよーわからんw
0023デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 18:43:27.34ID:1tcqqVj20
ちなみに、C#(プログラミング)初心者が理解しやすそうな題材ってあります?
まだhelloworldから変数作って弄るよりかはゲームのほうが楽しめるんかなと思ってそれで始めたらドツボ入ったんだよね。
難易度も低めが良いけど…(マルチスレッドやGUIでないようなもの)
0024デフォルトの名無しさん (ワッチョイ 937c-4Ddi)
垢版 |
2021/03/24(水) 18:57:55.30ID:HEdEJwPg0
どういうものを最終的に作りたいかによるけどゲームが目標なら
最初からUnityで勉強するのもアリかなと思う

勉強ならコンソールアプリの方が文字だけの世界だから分かりやすいけど
最初からWinFormsのプロジェクト作ってボタンやテキストボックスなど配置して
GUIのアプリのつくり方を勉強するのも良いかも知れない
GUIだとButtonにはClickイベントが、TextBoxにはTextChangedイベントがあるとか
(デザイン画面のボタンなどをダブルクリックすれば、上記の説明した一番使うであろうイベントの
実装が追加されるようになっている)
そういうイベントにより処理を行うみたいな形になるので、リアルタイムのゲームとは違った感じになるかと

どっちにしてもプログラムしてみて動かしてを繰り返し出来る方が望ましいかな
0025デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 19:03:33.84ID:1tcqqVj20
なるほどなー
よく考えたら最終的にはGUIのアプリケーションプログラムが作りたいと思ってた。ゲームは特に好きじゃないけど好きな人が多そうだから説明する時にも役立つかなとは思ってゲームにしてた具合。
先にFormやるのもありかも
0027デフォルトの名無しさん (ワッチョイ 9301-lXNI)
垢版 |
2021/03/24(水) 21:41:45.26ID:C9/npL5e0
いろんな種類のキャラを動かす系のゲームはOOPに向いてると思うけどな
実際そういうゲームのほとんどがオブジェクト指向で作られてるわけで

プログラミングを学ぶ目的に適してるかと言われると微妙だが
0028デフォルトの名無しさん (ワッチョイ 51a7-FMtt)
垢版 |
2021/03/24(水) 21:51:54.97ID:IIHDBzfT0
>>27
向いてない
オブジェクト指向って
オブジェクト同士の処理を綺麗に書く
ように作られてない

全オブジェクトが存在するシーンにほぼすべての処理を記述することになる
マップ情報がないとキャラは移動すらできないことがすぐにわかる
ではマップとキャラのデータが混在した処理をどこに記述するべきか?
シーンに決まってる
なのでゲームシステムに関わるほぼすべての処理をシーンに記述することになる
もう仮にオブジェクト個別の処理が2〜3個見つかった程度で個別のクラスなんかに書くのはバカってぐらい
全部シーンに書くことになる
0029デフォルトの名無しさん (ワッチョイ 5168-4Ddi)
垢版 |
2021/03/25(木) 06:17:54.99ID:PnLvSLd80
言語そのものよりライブラリに何があるのか把握しきれなくて辛い。
自分でクラスを作ったら、もう既に.Netにあったりするし。
辞書を熟読するような事前の勉強が必要なのかな。
0032デフォルトの名無しさん (ワッチョイ 5924-FrbH)
垢版 |
2021/03/25(木) 08:39:46.38ID:qKMPIZcm0
ゲームって普通にOOP学習にはもってこいじゃね?
一見全く種類の違う自キャラや敵やNPCなどを一つのベースクラスから派生させたりとかオブジェクト指向の有難みを享受しやすいジャンルだと思うけどな
まぁそういうことせずとも一度C言語を使ってみればC#を使ってる時点でデフォでめちゃくちゃオブジェクト指向の恩恵に授かってるというのを認識できるけど
0037デフォルトの名無しさん (ワッチョイ 8bbb-Q5Cn)
垢版 |
2021/03/25(木) 15:14:45.90ID:mlbm7rgK0
Unityはやめといたほうがいいんじゃん?
ゲーム特有の定石が多い上にあまり公開されていないので、なかなかOOPを活かせるようなコードが書けるもんじゃない
0038デフォルトの名無しさん (ワッチョイ f568-UUyU)
垢版 |
2021/03/26(金) 06:50:34.94ID:M+ibeJ+i0
なんか作るとき、ついつい無駄にインターフェース作ったり、クラスを継承させたりしたくなる。
後で使うかもって置いといても、結局、役立たずで無駄になったり。
0040デフォルトの名無しさん (ワッチョイ b1b5-lMfL)
垢版 |
2021/03/26(金) 14:55:15.51ID:OgsXGrRW0
質問です。
'string[][]'と'string[*,*]の違いは何ですか?

List<string[]> lists = new List<string[]>();

string[,] = lists.ToArray();
で二次元配列にしようとすると、

CS0029: Cannot implicitly convert type 'string[][]' to 'string[*,*]'

とエラーが出て困っています。
0042デフォルトの名無しさん (ワッチョイ b1b5-lMfL)
垢版 |
2021/03/26(金) 15:04:21.89ID:OgsXGrRW0
>>41
なるほど、理解出来ました。
ありがとうございました。
0045デフォルトの名無しさん (ワッチョイ 6502-12p/)
垢版 |
2021/03/28(日) 10:40:20.81ID:i/QSKAGe0
でも、ついでだし作っとくか、で作ったやつがその後のバグ対に効果大なこともあったな。結構。

「起こる可能性のあることはいつか必ず起こる」ってのはマーフィーの法則だっけ。
アタマの片隅にでも置いておくと、後で助かることがままある。
0046デフォルトの名無しさん (ワッチョイ b662-GHqT)
垢版 |
2021/03/28(日) 11:33:59.11ID:wZjOpvsr0
一人で作ってるならいいんだけど別の人が対応する時に混乱させるだけなことが多いからな
チーム開発では起こらないことを無駄に考えてしまうのはよくないって場面の方が多い
0049デフォルトの名無しさん (アウアウウー Sacd-1mGO)
垢版 |
2021/03/28(日) 14:10:23.36ID:maSv/WgVa
必要になると思って書いておいたプロパティやメソッドが結局まったく使われなかった、
っていうのはないことはないと思う。

YAGNIって普通はこういう話じゃないの?

>>38が言ってるような要らんInterfaceや要らん継承関係を作ってしまうって
YAGNIとちょっと違う気がするし、そもそも普通はあんまりやらん気がするなあ。
0050デフォルトの名無しさん (ワントンキン MM46-e9+l)
垢版 |
2021/03/28(日) 14:18:03.89ID:YWsxET0EM
コードレベルで呼び出されないのと運用上使用されないのは別問題だよ
前者はほぼ例外なく無駄無価値無意味なんで、俺がコードレビューするなら基本的には消させる
0052デフォルトの名無しさん (ワッチョイ b1b5-lMfL)
垢版 |
2021/03/28(日) 20:15:57.09ID:AfIP7Kkq0
>>44-50
横から便乗で質問ですけど、
「いつか使うだろう」とインターフェースや継承関係を作っておく自体は推奨されることですか?

例えば、インターフェースや継承関係が無くても、直付けで作れてしまう訳じゃないですか。
むしろ、そっちの方が楽(というか、直付けでしか作れない人もいますし)。
ただし、物事が複雑化してきたときに、インターフェースや継承関係があると拡張しやすい。

これって上級者なら、(どんなに小さいプログラムだろうが)常にインターフェースや継承関係を作った方がいいのか、
それとも、ケースバイケースで「このぐらい複雑ならインターフェースや継承関係が要る」という判断基準に則って作った方がいいんですか?
0056デフォルトの名無しさん (ワッチョイ 328b-UUyU)
垢版 |
2021/03/29(月) 18:41:48.60ID:dJ0caBH40
というのもなぜか、最近アップデートされたChromeドライバーのバグなのか
driver.close();を実行するとやたらと時間が掛かる様になり、ストレスを感じています。
0057デフォルトの名無しさん (スププ Sdb2-uiCP)
垢版 |
2021/03/31(水) 11:53:07.69ID:/skdgMDzd
演算子のオーバーロードを定義したクラスを継承してそのクラスのオブジェクト同士を足したりしたいんだけど、
継承した子クラス同士足し算してもオーバーロードしてるのが親クラス返してエラー出る…
なんとかなりませんか…
0060デフォルトの名無しさん (スププ Sdb2-uiCP)
垢版 |
2021/03/31(水) 17:43:40.43ID:/skdgMDzd
>>59
その当たり前の事がわからないのですが…
子クラスのクラス変数に親クラスのインスタンスを入れれないのはわかりますが、それに対してどうすれば良いのですかと質問しています。
0062デフォルトの名無しさん (ワッチョイ d573-XUMB)
垢版 |
2021/04/02(金) 02:49:16.07ID:4F6/LV520
いやいやゲームはメチャクチャOOPに向いてる。
ゲームエンジンがプロパティペインで物を制作管理していくのが中心になってるってことは
全体としてOOPと相性がいい。

そらそうよ、鋳型と各オブジェクト、その相互作用、隠蔽やインターフェース、
まさにオブジェクト指向言語の基礎サンプルやエクササイズが綺麗にヒットしやすいのがゲームよ。
0063デフォルトの名無しさん (ワッチョイ 4ba7-WZCG)
垢版 |
2021/04/02(金) 03:35:33.76ID:p2YnI9xf0
>>62
エアプ乙
ゲームはオブジェクト同士の関連処理が一番多い
それを綺麗に書く処理はオブジェクト指向言語には無い
これを議論するといっつも言語機能に用意されてないもんだから色んなワンダーランドがご披露されるだけのクソ展開になる
いいか
そんなもんないんだ
お前がどう書くかなんて俺は興味ない
ただ言語の機能にない
それだけだ
0066デフォルトの名無しさん (ワッチョイ 0d68-0pr0)
垢版 |
2021/04/02(金) 21:13:27.05ID:qd7mj8LF0
議論スレに行った方が良いのか判らないけど、
俺も初心者なんだけどC#の機能を試したくってさ。
基本キャラからキャラ種類別にクラス継承させたりして楽しんでたよ。

でもゴリゴリにスペックを切り詰めるようなゲームだと、そんな余裕はないのかもな。
0068デフォルトの名無しさん (ワッチョイ a3e6-JnQU)
垢版 |
2021/04/02(金) 21:33:37.08ID:iQ+JaQcP0
日本産のスマホゲーと大陸産のスマホゲーぐらいの速度差は出るだろうな
0073デフォルトの名無しさん (アウアウウー Sae9-p1/t)
垢版 |
2021/04/03(土) 01:51:35.91ID:2NRf1R7da
>>69
まあ言語機能云々は意味不明に聞こえるねw

前も書いたけど、ゲームの場合Mediator的な装置を用意すべき場面でも
目に見えるオブジェクトに引きずられて変な設計してしまいがちだと
いう意味なら分からんでもない。

バブルボブル(おっさんにしか分からんかも)で泡の相互作用を
Bubbleクラスに無理に実装したらたぶんハマるよね。
0076デフォルトの名無しさん (スフッ Sd43-+5Lz)
垢版 |
2021/04/03(土) 10:48:17.75ID:UQC8gxiad
>>75
でもLinqって古くから有る技術の延長にある気がする。
SelectしてWhereで選んでSortしてっていうのは、コマンドプロンプトでパイプリダイレクションとかいう手法に似てる。
ラムダ式とかは新しいのかな。数学の世界とかそういう所では古いのか。
0084デフォルトの名無しさん (ワッチョイ 2d02-xz58)
垢版 |
2021/04/04(日) 13:52:07.93ID:U9Ytphde0
>>73
純粋に、自分が知らない有用な書き方があるなら知りたいとは思うんだよな。
別スレの LINQ がらみの話題もやるかどうかは置いておいて勉強にはなったし。
もしくだんの人が出てきてくれて講釈してくれるなら専用のスレぐらいは立てる。
0085デフォルトの名無しさん (ワッチョイ 2b02-kjVL)
垢版 |
2021/04/04(日) 17:58:30.84ID:a8juFvNn0
初歩的な事かもしれませんが教えて下さい。

以下のような独自クラス「Group」のリストがあります。
このリストをクラスのAgeListをキーにGroupByしたいのですが上手くグループ化できません。
どうすれば良いでしょうか。

public class Group{
/// グループID
public int Id {get; set;}
/// グループ名
public int GroupName {get; set;}
/// グループ所属の年齢一覧
public List<int> AgeList {get; set;}

public Member()
{
List = new List();
}
}
0086デフォルトの名無しさん (ワントンキン MMa3-7UwS)
垢版 |
2021/04/04(日) 19:15:49.58ID:LnRN74zvM
>>85
どうすればいいじゃなくてどうしたいのかをお前が決めろ
平均年齢なのか最大年齢なのかそれともまた別の基準なのか
グループ化に使うキーが一意に定まらないならグループ化のしようがない
0088デフォルトの名無しさん (ワッチョイ b501-5QI3)
垢版 |
2021/04/04(日) 19:59:05.44ID:gm8Ka2TU0
そもそもの設計ヤバない?AgeはMemberに持つのでは?
0095デフォルトの名無しさん (ワッチョイ 1bda-UCZ0)
垢版 |
2021/04/04(日) 21:13:12.33ID:xvT8M2vo0
俺はこういう場合、独自解釈して好きなように作る。
今回ならAgeListをソートしてカンマ区切りの文字列にして、をれをキーにする。
でGroupByだな。

過去この独自解釈が5割くらいそのまま仕様になってる
0096デフォルトの名無しさん (アウアウウー Sae9-yx92)
垢版 |
2021/04/04(日) 21:16:41.13ID:jr3tMa1na
>>93
>独自クラス「Group」のリスト
>このリストをクラスのAgeListをキーにGroupByしたい

List<Group> list = new List<Group>();
// なんか処理
list.Groupby(x => x.AgeList)
ってしたいって理解したんだけど違うんかな

宣言でそもそも間違ってるのは知らん
0104デフォルトの名無しさん (スップ Sd03-nQQ9)
垢版 |
2021/04/07(水) 14:11:22.94ID:/xOeegWId
C++とJavaを業務でやっていてc#始めた初心者です。
Xamarin.Mac でmacOSのアプリを作りながら学んでるけど
恐ろしく情報が少ない…。Macでc#使う人って少ないんでしょうか?
0105デフォルトの名無しさん (ワッチョイ a37c-0pr0)
垢版 |
2021/04/07(水) 20:43:30.57ID:keBvs1o20
そもそもXamarinで作る必要あるのかという感じがする
正直流行ってないからね
Java出来るならJavaでいいんじゃね?
もっと新しい技術ということならelectronをお勧めしておくわ
Windows限定アプリならVisualStudioでC#は楽でいいけどね
0108デフォルトの名無しさん (ワッチョイ e501-nQQ9)
垢版 |
2021/04/08(木) 03:06:33.38ID:AfyS2Eek0
>>105-107
回答ありがとうございます。
マジですか。。。C#以外をお勧めされて複雑ですが
その言語も調べておきます。
まだC#学習して1ヶ月程度ですが機能が盛り沢山で面白いので
Macでも普及して欲しいですね(´・ω・`)
0114デフォルトの名無しさん (ワッチョイ e384-bVUD)
垢版 |
2021/04/08(木) 17:10:27.78ID:eSL736QZ0
>>113
MSが共通Wrapper作りましたってことでDLL importは必要なくなるし、アンマネージ
部分についてもお約束を守ればよくなるみたいだけど、サンプル見ると色々手続きが
面倒臭そうで使い勝手は良くなさそう
0117デフォルトの名無しさん (ワッチョイ a3e6-JnQU)
垢版 |
2021/04/08(木) 19:11:09.64ID:7Q+Xoj4V0
apiで使う構造体とかの面倒くささが無くなるならいいんじゃない?
0127デフォルトの名無しさん (ワッチョイ 86bb-eWep)
垢版 |
2021/04/09(金) 15:11:32.43ID:Sg2n4mcl0
AI関連は、何を使えるかよりどこの博士号を持ってるかの方が重要なんだろ?
0130デフォルトの名無しさん (ワッチョイ 1724-uCSv)
垢版 |
2021/04/10(土) 09:05:48.65ID:Zw7mVk6D0
win32って一々ラッパー挟まずとも実はC#側で結構調節してくれるんだよな
GetProcAddressみたいなANSI版しかないような関数でもstringそのまま放り込んでもちゃんと機能してびっくりした
0132デフォルトの名無しさん (ワッチョイ bb2d-ksEv)
垢版 |
2021/04/10(土) 21:24:18.51ID:mb0ile8c0
a={1, 2, 3, 4}という配列が与えられて
更に10進数x=5が与えられた時、5を2進数にして101なので
(最下位ビットがa[0]になります)
配列の要素1と3の和を出力せよという課題が出ました

var r = 0;
for (int i = 0; i < a.Length; i++)
if ((x & i << 1) == 0)
r += a[i];
で求める答えが出そうだと思ったのですが
4ではなく3が出ます。どこが間違っているんでしょうか
0134デフォルトの名無しさん (ワッチョイ bb2d-ksEv)
垢版 |
2021/04/10(土) 22:33:06.71ID:mb0ile8c0
>>133
その書き方だと通るんですよね..
下のように解説してるサイトがあったのでそう書いてみたのですが
なんかおかしいんです

ビット bit に i 番目のフラグが立っているかどうか if (bit & (1<<i))
0137デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/11(日) 00:18:38.88ID:gSPWaQTLa
>>134
それはたぶんC#ではなくてCのコード
「bit & (1<<i)」この式の型は何?
Cと違ってC#のifの()の中の式はboolでなければダメ

まあこれは初心者が知らずに混乱しても仕方ないかもしれない。
でも>>132のコードの何が間違ってるかは初心者でも自分で考えれば分かるでしょ。

とりあえず問題を小さい問題に分けて分割統治することから始めましょう。
>>133はそういう意味で書きました。
0143デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/11(日) 17:06:24.47ID:LOxmuPpta
プリフィクスのIは字面からインターフェイスだと分かるようにしたい、という強迫神経症的な動機というより、
単純に名前のバッティングを機械的に回避できる点が大きいんじゃないの?
0144デフォルトの名無しさん (ワッチョイ df01-slfm)
垢版 |
2021/04/11(日) 17:51:20.56ID:v+npbxj+0
どうせインターフェースにIを付けなくなっても、実装クラスのいい名前が思いつかずになんとかImplってサフィックスつけるんだろ?
0145デフォルトの名無しさん (ワッチョイ 7b68-CoCA)
垢版 |
2021/04/11(日) 19:02:53.13ID:jqn7J9El0
Delphiだと、クラスにはTypeのT、パラメータにはFieldのFを付けるんだよね。
InterfaceのIはその名残なのかな、とか思ったんだよ。
そして、そういうのは無くしていく傾向なのかな、と。
0147デフォルトの名無しさん (ワッチョイ e290-nwb8)
垢版 |
2021/04/11(日) 21:55:51.16ID:XlCnUXyn0
命名規則で一番上手くいってるのはC#と思う
インターフェースにプリフィックスIをつけるから命名で困った時にImplとかやらなくてすむし
プロパティ名は大文字で始めるから小文字で始めるローカル変数とぶつかりにくいし
0155デフォルトの名無しさん (ワッチョイ 7b68-CoCA)
垢版 |
2021/04/12(月) 04:43:49.73ID:FczQKoXE0
>>152
Microsoftの推奨する命名規則を参考にすれば良いんじゃない?
つまり、I付きPascal形式でスペル省略不可のフルネームで名詞を表せば良いのかな。
自由に付けても良いけど、.Net Frameworkと調子を合わせると違和感が無いと思う。
0165デフォルトの名無しさん (ワッチョイ cb5f-wtuO)
垢版 |
2021/04/13(火) 11:05:10.28ID:fFoE8jgx0
バージョン管理ツール使ってるのに旧コード残すやつにはイラッとする!
特に不具合のコードをコメントアウトして残されてると、当てつけなのかと思ってしまう
0170デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/13(火) 16:02:36.93ID:ct/xqAfva
>>159
コメントは基本的には必要悪なので必要がない限り書かないのが正しいけど、
少なくともパブリックメンバーについては単純に「必要」かもしれんね。

ないと書いた人の意図を変に誤解してないか不安になって
結局中のコードを覗きたくなるかもしれない。
そんなことしなくて済むためのカプセル化のはずなのに
0172デフォルトの名無しさん (エアペラ SD7a-I7Om)
垢版 |
2021/04/13(火) 18:24:41.93ID:arsZDomXD
>>171
何をやってるかなんてコード読めば解るんだから、
そんなことのためにコメントは不要
「なぜ」そんなメソッドが必要か、
「なぜ」そのデータ構造やアルゴリズムを選択したか
なんていう、コードから見えない情報を記すのがコメント
0173デフォルトの名無しさん (ワントンキン MM92-qfGw)
垢版 |
2021/04/13(火) 18:31:59.11ID:KJ4k5XjpM
MS含めアメリカ製の高品質なコードって「なぜ」のコメントが無茶苦茶充実してるよな
日本だとだいたい // 〇〇処理 みたいな無意味なコメントか、ほとんど無いかのどちらか
SaaSとか一般的にレベル高いと思われてるはずの現場では、だいたい後者のパターンでほぼコメントが無い
根本的に論理的な言語能力に差があるんだろうなと思わざるを得ないわ
0177デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/13(火) 18:55:44.96ID:ufUQjDoVa
>>172
言いたいことは分かるけど「何をやってるかなんてコード読めば解る」というのは
あくまで理想であって常にそうできるわけじゃない。

何をやっているか書いてくれた方がありがたい場合もあるよ。

>>176
そんなことをルールで強制する理由はないと思うよ。
0179デフォルトの名無しさん (ワントンキン MM92-qfGw)
垢版 |
2021/04/13(火) 19:08:03.49ID:KJ4k5XjpM
>>178
逆に、コメントを書かせることでコメントを書きやすいコードになるという面はあると思うよ
クラスやメンバの責務が十分に明確ならコメントと実態の乖離なんてそう起きるものではない
0180デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/13(火) 19:14:53.40ID:ufUQjDoVa
>>178
コメントはバグる可能性があるからコメント書くな、
なんて言ったらバグる可能性があるのはコードも同じなんだから
コードも書くなってことになっちゃうよw

「不必要なコメントは有害無益」は正しいけど、それは
必要なコメントを否定する根拠にはなりえない。
0181デフォルトの名無しさん (エアペラ SD7a-I7Om)
垢版 |
2021/04/13(火) 19:40:32.77ID:arsZDomXD
>>180
コメントがバグるって話じゃなく、
書いた人の「つもり」がコメントとして残るのが危うい
実行時にどう動くかを決めるのは、コメントではなくコードなのだから、
コメントを読んでコードを読んだつもりになれるのも危うい
0184デフォルトの名無しさん (ワッチョイ cb02-+YuK)
垢版 |
2021/04/13(火) 19:48:22.85ID:DZHUx02Q0
「コードを読めば何してるか分かる」のだから、メンテ忘れで誤ったコメントが残ったとしても問題ないとも言える。
・・・たまにブチ切れたくなることがあるけどな。
0190デフォルトの名無しさん (ワッチョイ 8e62-2UTP)
垢版 |
2021/04/14(水) 05:43:13.79ID:C2CdPm+G0
>>186
だから要らないって話だろ
var hoge = items.First();
で最初の要素を取得するなんてコメントは要らん
記載するならwhy何故取得するのかだけ書けばいい

もし動作について記載したくなったなら、それはメソッド化するとかを検討した方がいい
0195デフォルトの名無しさん (ワッチョイ 6fb5-KVJ7)
垢版 |
2021/04/14(水) 10:31:27.70ID:GNdqlmcr0
なんだよ、せっかく議論スレに移ったのについてきてねーじゃん
正直者が馬鹿を見る世界
もう移らん、絶対移らん(笑)

俺はコメント入れてほしい派

読めば判るっつってもさ、
コード書いてる本人ですら
何やってるか分かってない場合もあるからな(笑)
せめてコメントで
「ここではこんなことをしてる(つもり)」
って書いてくれら「全然そうなってないだろ!」と突っ込める
0202デフォルトの名無しさん (アウアウウー Sabb-ksEv)
垢版 |
2021/04/14(水) 14:23:38.27ID:IGhCcGj6a
ついでに、これも何度も言ってるが、そんなくだらない「交通整理」に誰も従わないのは
「交通整理」の欺瞞性とそれを主張している人間の卑しい動機に普通は気が付くから。
0206デフォルトの名無しさん (ワッチョイ cb02-+YuK)
垢版 |
2021/04/14(水) 19:48:09.33ID:5dAhuQZZ0
>>193
その 184 だけど。w
「コードを読めば何してるか分かる」な人は、そもそもコメントがなくてもいいんだから、書かれていても無視すればいい。
コメントが欲しい人は、コメントの弊害(メンテ忘れとか)の現状を承知の上でそう言ってるんだから、そもそも問題ない。

つまり、コメントがいる/いらないの論争は無意味だからやめとけってことなんだよ。
その上で「コードを読めば何してるか分かる」ように丁寧な書き方を目指せば済むことじゃん。

まあ自分はブロックと言うか処理単位でのコメントは出来るだけ書くけど。
0208デフォルトの名無しさん (ブーイモ MM3e-PnGn)
垢版 |
2021/04/14(水) 20:17:08.74ID:22Gnyx3vM
・コメントがあるとノイズになり視認性が落ちる
・コメントには嘘が混ざっていたり情報が欠落していることがあるので常にコードとコメントの整合性を確認しながら読まなくてはならない
・コメントに嘘を混ぜたり情報を欠落させないために細心の注意を払わないとコードを更新できなくなる
0213デフォルトの名無しさん (ブーイモ MM3e-VRFv)
垢版 |
2021/04/15(木) 08:01:46.43ID:PPG2Aw5dM
改修履歴をコメントで残すとかいうのさえなけりゃ
他のコメントはコード読むのに邪魔になりはしない
0226デフォルトの名無しさん (ワッチョイ ffa7-zL3N)
垢版 |
2021/04/16(金) 21:41:25.62ID:UPAcC/fc0
デーモンコアと
マイナスドライバーを設定
try{
while(米が勝つまで回す){
@測る
Aマイナスドライバーを動かす
}
}
finally
{
Bデーモンコアを離す
Cif(青い光りが見えた){
Dみんなを退避
E逃げる
F救急車を呼ぶ
G遺書を書く
}
}

大体こんな処理なんだけど
B〜Gは途中で例外起きても
最後までやってほしいらしい
っていう一連の処理なんだ
どのエラーや例外も全部保存したい

>>224
なんかサンプルないですかね?
0232デフォルトの名無しさん (アウアウウー Sa1b-B9Cj)
垢版 |
2021/04/17(土) 01:02:22.39ID:v4ZcCEOKa
class DaemonSequenceException:Exception
{
  public Exception FooResult { get; set; }
  public Exception BarResult { get; set; }
....
}
とかみたいに他の部分の成否と無関係に実行できる各部分に名前をつけて、
その部分の例外をプロパティーで持つとかするのかね知らんけど
0241デフォルトの名無しさん (ワッチョイ 777b-B9Cj)
垢版 |
2021/04/17(土) 21:15:57.36ID:PG7156wz0
>>240
受け側って何を指すのかわからないけどエラーをcatchしておいて投げなおしているだけじゃね
>>230の考え方でエラー起こるたびに「〜の処理中に〜のエラーが起きました」って全部記録する形から作っていけば?
エラー発生しても続行させる処理の方が大変になると思うしとりあえず一通り作ってみた方がいい
0245デフォルトの名無しさん (アウアウウー Sa1b-B9Cj)
垢版 |
2021/04/17(土) 21:24:17.27ID:3+8Yd0vAa
たぶん欲しいのはエラーのログなんだろうね。
あるいはPOSTでやるようなチェックリスト?

例外オブジェクトをエラーを表す目的で使ってもいいとは思うけど、
何がしたいのか目的をはっきりさせずに「例外をストックできるか?」とか質問するから
みんな混乱する。
0255デフォルトの名無しさん (ワッチョイ d768-B9Cj)
垢版 |
2021/04/18(日) 00:46:37.58ID:hpbx6fns0
C#の話と関係無いかもしれませんが、パッケージの開発環境って今の時代何がありますか?
完全にオフラインで使える開発環境とかって無いんでしょうか?コマンドプロンプトしか無いんでしょうか?
0258デフォルトの名無しさん (ワッチョイ 3754-n3xY)
垢版 |
2021/04/18(日) 18:43:20.44ID:H0K908230
なんとなくエスパーすると、開発ソフトをインストールさえすれば、その後はネット非接続で何でも開発出来る環境が理想ってこと?
なら、たぶん無い。

.net sdk使って、標準ライブラリだけ使うなら出来るんかな?
結局必要なライブラリやらランタイムをDLするか、他のPCでDLして開発PCに入れる事になりそうだけど。
0259デフォルトの名無しさん (ワッチョイ 97b5-Ct9k)
垢版 |
2021/04/18(日) 18:52:54.76ID:qPyS0oex0
>>258
待て待て、標準ライブラリだけでもオフラインで開発できるなら、回答しては「Yes」じゃないか?
特に、その「他のPCでDLして開発PCに入れる事になりそうだけど」が出来るんだしさ

>>255
目的を話せ
俺のエスパー能力をフル発揮すると、
セキュリティ上、スタンドアローンで動かさんといかんPCがあって、そこで開発したいだよな?
0260デフォルトの名無しさん (ワッチョイ d768-B9Cj)
垢版 |
2021/04/18(日) 21:38:47.12ID:hpbx6fns0
>>258
ありがとうございます!!!
環境を自分で作る以外ないんですかね。無謀すぎますね。
コンパイラ作るわけじゃないですからね統合環境は。
>>259
そうそう単にセキュリティの心配です。
オフラインだと全く外部に漏れる心配ないわけじゃないですか。
めちゃくちゃ安心するじゃないですか。

何でインターネットに繋いでないとプログラミング環境が整わないような
状況なんでしょうか?どう考えたってオフラインのほうがよくないですか?
0262デフォルトの名無しさん (テテンテンテン MM8f-LzhE)
垢版 |
2021/04/18(日) 23:42:54.47ID:4BU0O/MkM
そういうセキュリティの気にし方をするのであれば、普段使いのPCとは別に
個人情報を一切入れないPCを1台用意して開発勉強専用にするのが一番安心できると思うよ
外に漏れて困るようなレベルのコードを書くならダメだけどさ

というかMicrosoftDocsやGitHubやStackOverflow/Qiitaとか一切閲覧できない環境で
NuGetやNPMに登録されてる出来合いのライブラリもまったく利用しない縛りを入れて
自分の能力だけで1から100までコードを書けるなんてすごいなあ
俺にはそんな縛りプレイしてたらとてもじゃないけど開発にならないや
0264デフォルトの名無しさん (ワッチョイ bf68-tdH6)
垢版 |
2021/04/19(月) 01:49:10.86ID:c6NDAp6p0
構造体(値型)を関数の参照渡し以外で、参照する方法ってありますでしょうか?
配列の構造体にアクセスするコードを書いているのですが、
逐一配列の添字計算が入るのも嫌なので避けたいと思っています。
添字の数は関数の中では変わりません。
今は関数の参照渡しで使っていますが、他に方法は無いのかなと思いまして。
0269デフォルトの名無しさん (ワッチョイ bf68-tdH6)
垢版 |
2021/04/19(月) 02:14:43.49ID:c6NDAp6p0
>>265
ref ってローカル変数に使えるんですね!
前に軽く試した時には右辺値にしかrefを記載してなかったので、
左辺の定義にもrefを記載すれば行けました。
有難うございました!
0270デフォルトの名無しさん (ワッチョイ fff2-9WMT)
垢版 |
2021/04/19(月) 03:18:25.46ID:RtpbkBzw0
オフライン環境での開発だけど、
VS Community2019のオフラインインストーラをダウンロードして
オフライン環境に持ち込んで使ってる
c#でフォームのデスクトップアプリしか作らんので特に困ってない
0275デフォルトの名無しさん (ワッチョイ 9736-pvza)
垢版 |
2021/04/19(月) 09:01:07.98ID:qHBf6kdf0
getsetプロパティをFuncで呼び出せるようにしたいのですが可能でしょうか?
メソッドで括って呼び出せば良いのだろうけど直接Funcに入れる方法があるならそうしたいです
0276デフォルトの名無しさん (ワッチョイ 7f7c-xwMB)
垢版 |
2021/04/19(月) 09:10:46.59ID:a1UfxEQG0
よく分からん
Func<string> func = () => person.Name;

Func<string> func = person.Name;
みたいに書きたいってことか? 無理だけど
func = person.Name.Surname;
のときperson.Nameがいつ解決されるのか判断つかないし
0277デフォルトの名無しさん (ワッチョイ 9736-pvza)
垢版 |
2021/04/19(月) 09:26:07.33ID:qHBf6kdf0
>>276
返信ありがとうございます

イメージとしては複数のクラスで
public bool hoge {set => test = value; }
が複数あって
List<Func<bool, bool>> func;
に追加していってキャンセルとか何らかの処理後に一括して戻したい、と言うような処理です

やはりプロパティってメソッドみたくできないFuncに入れる事ができないんでしょうか
他の方法ですっきりする方法はないですかね?
0280デフォルトの名無しさん (ワントンキン MM4f-Ct+I)
垢版 |
2021/04/19(月) 10:21:06.38ID:8YZTYag9M
まあ気持ちはわかる
(Webでなく)GUIアプリで独学した初心者って、エンティティオブジェクトをアプリ全体で生存させるような設計をしちゃうんだよな
オブジェクト指向を普通に解釈すりゃそれが自然なんだけど、実際そういう設計はしないんだよ
ドメインモデルだろうとトランザクションスクリプトだろうと、エンティティはトランザクション毎に作る
0282デフォルトの名無しさん (ベーイモ MM4f-XYuH)
垢版 |
2021/04/19(月) 10:44:42.24ID:7XobiDdgM
>>278破棄と生成できれば良いのですがちょっと難しい。ユーザーコントロールでバインドしていて各コントロールは値を参照しあってます
今回は画面が切り替わったときに表示非表示を変える戻す、なので直接は関係ないのですが影響度を減らしたい
>>279
>>276見直してプロパティを直接でなくてもラムダ式でいけそうなことに気付き>>279さんの形を思い浮かびました、今出掛けてるので確認は後ですが多分解決できそうです

皆様ありがとうございます
解決しなければまた聞くかもです
ありがとうございます
0286デフォルトの名無しさん (アウアウウー Sa1b-B9Cj)
垢版 |
2021/04/19(月) 12:41:53.53ID:/vkKNniZa
何がしたいのかよく分からないね。

キャンセル要求が発生したら初期状態に戻したいなら
素直に初期状態をまるごとキャッシュしておく方が分かりやすいんじゃないかと思うけど

もっと素直なのはそもそもApplyするまでUIの値をモデルに反映しないことだよね。

まあたぶん要件を説明しきれてないんだろうけど
0291デフォルトの名無しさん (ワッチョイ ffa7-zL3N)
垢版 |
2021/04/19(月) 14:13:33.61ID:lMV2Jqgd0
>>290
影響する値でエラーが出てもそれとは関係ない表示はできる限り続けて欲しい(プレビューが見えないから)
エラーが出てるときは値の変更で表示は変わっても最後の反映はできないようにしてほしい
でも値を変更してる最中のundo,redoは効くようにして欲しい

って割とありがち要求だよね

モードレスやった時点で地獄を覚悟しろって感じ
0292デフォルトの名無しさん (ラクッペペ MM8f-ZP9E)
垢版 |
2021/04/19(月) 14:17:30.66ID:5/g8GOz6M
そのためのMVVMですから!
0294デフォルトの名無しさん (ワッチョイ 57ad-IUyB)
垢版 |
2021/04/19(月) 16:13:54.25ID:LEIxqEAm0
うちにも本当にしてる端末はあるぞ。
むしろ自動で上げたくないしな。
既知の問題でワークアラウンドがあるならそれで良いというケースもあるし。
リリースノートめちゃくちゃ読む。
0295デフォルトの名無しさん (テテンテンテン MM8f-wT4Z)
垢版 |
2021/04/19(月) 16:51:10.44ID:qG+FkDTLM
>>293
ネットに繋げないならそうするしかないし言うほど面倒でもないだろ
そもそもネットに繋いでる場合でもアップデートがある度に適用なんてしないよ
>>294が書いてるように修正内容見て影響ないとかワークアラウンドがあるなら適用しない
0297デフォルトの名無しさん (ワントンキン MM4b-Ct+I)
垢版 |
2021/04/19(月) 17:17:52.34ID:ssZtrIutM
今のVSって最新メジャーバージョンは完全に人柱向けだからなあ
アップデートをすぐに入れられないような環境だと詰む可能性があるからむしろリスクが大きい
最新版を追えない環境なら2017使ったほうがいいよ
0306デフォルトの名無しさん (ワッチョイ b72d-GJAZ)
垢版 |
2021/04/20(火) 03:07:10.55ID:hE4KV5oa0
>>303
機能の解説だけでどのようなときに使うかは書いてなかったです

Delegate型の説明と作り方の後に例としてConsole.WriteLineでHelloと表示するメソッドを
新たに作ったDelegate型のaという変数に突っ込んでa()を実行して
ほら表示できたでしょという感じだったのだけれど
だからどうしたとしか思わなかったです
0310デフォルトの名無しさん (ワッチョイ b768-tdH6)
垢版 |
2021/04/20(火) 04:41:05.35ID:IRlXB/YU0
デリゲートは自分で使うもんじゃないと思ってた。
Buttonをクリックしたら、このメソッド実行してねってのを、IDEが作ってくれる奴だから。

だから、「こんなときどうしよう」って悩んだときに、
そうだ!デレゲートってのがあるんだよ!っていう、よっぽどの場合に、入門書を読めば良いと思う。
初めてのC#みたいな本がお薦めなんだけどね。
0313デフォルトの名無しさん (ラクッペペ MM8f-ZP9E)
垢版 |
2021/04/20(火) 08:29:39.05ID:2x6gxMkWM
デリケートに好きして
0317デフォルトの名無しさん (ワッチョイ 972c-KAGY)
垢版 |
2021/04/20(火) 12:07:45.54ID:7xfghfsY0
例えば、Ruby では、Forwardable でインスタンス変数に委譲できる

自分で配列クラスから、Stack を作って、その内のpush, pop だけを使いたい場合、
もし配列を継承・is-a すると、余計なメソッドまで継承してしまうので、それらを使いたくない。
そういう場合に、委譲・has-a で、インスタンス変数に委譲して、使うメソッドも限定できる

Go, Elixir も継承がない、委譲だけ。
継承は大掛かり。
使わないメソッドを呼ばれてしまう可能性があるから

また、誰でも使うような、String クラスなどを継承して、メソッドを追加されるのも嫌。
そういう継承は想定外だから

素人は、よくそういう事をする。
継承用のクラスじゃないのに継承したりする

require 'forwardable'

class Stack
extend Forwardable

def initialize( ) @ary = [ ] end
def_delegators( :@ary, :push, :pop )
end

stack = Stack.new
stack.push 1
stack.push 2
stack.pop

p stack #=> #<Stack: @ary=[1]>
0318デフォルトの名無しさん (ワッチョイ 972c-KAGY)
垢版 |
2021/04/20(火) 12:25:42.67ID:7xfghfsY0
>>307
shadowing とは、内外の変数は、別々の扱いで、
内側のスコープに入ると、内側が優先されて、
外側の同じ変数名が隠されること。
その際、外側の変数には影響を与えない。

Ruby では、外側のa は10で、内側のブロックスコープでは、
同名の変数aを使っても、外側の変数には影響を与えない。
ブロックスコープを抜けると、aは10のまま

a = 10
ary = [ 1, 2 ]

ary.each do |a|
puts "ブロック内: #{ a }"
end

p a

出力
ブロック内: 1
ブロック内: 2
10
0321デフォルトの名無しさん (ワッチョイ b7b0-tdH6)
垢版 |
2021/04/20(火) 21:04:57.15ID:HBCxLvi90
なにかのネタというかエンジニアジョークなのかな? わからないや

シャドーイングがどんな機能なのかは単純だからわかってるつもりだけど、一見同じ変数名を扱えることで何が嬉しいの?って話です
コード読んでて混乱しそうなので無い方が綺麗だと思うのだが、自分の脳みそが貧弱なだけかな?
0322デフォルトの名無しさん (ワッチョイ bf68-Zgro)
垢版 |
2021/04/20(火) 21:05:35.48ID:3ANNQsEU0
c から来た人なんだけど、デリゲートって関数ポインターの認識
0323デフォルトの名無しさん (ワッチョイ bf68-Zgro)
垢版 |
2021/04/20(火) 21:08:17.98ID:3ANNQsEU0
半角の++が書き込めない。なんだこれ。
0326デフォルトの名無しさん (アウアウウー Sa1b-B9Cj)
垢版 |
2021/04/20(火) 23:13:15.40ID:oW++joyya
>>321
嬉しいでしょ。
まあぶっちゃけフィールドをローカル変数で隠蔽することはあまりないと思うけどね。

>>322
Cより機械語レベルで考えた方が分かりやすいね。
要はcall命令のオペランドだよね
厳密にはthisポインタの情報を含むから違うんだろうけど概念的には
0332デフォルトの名無しさん (ワッチョイ bf62-rOyz)
垢版 |
2021/04/21(水) 09:15:40.20ID:hAG7zCyL0
>>327
コンストラクタにはそのオブェクトを生成するために必要なものを渡してる
初期化子は特に生成には関係ないない項目にも初期値を設定してるイメージ
使う側はあまり気にしなくていいけど用意する側は意識しといた方がいいよ
0333デフォルトの名無しさん (スッップ Sdbf-QJa2)
垢版 |
2021/04/21(水) 09:18:16.78ID:zaNQ2p2Bd
>>327
初期化子はフィールド単体に対しての初期化で、コンストラクタはクラス全体に対しての初期化って考えたらイメージしやすいかも
まあ、初期化子を指定しない場合でも、def aultで初期化されるんだけどね
0334デフォルトの名無しさん (アウアウウー Sa1b-B9Cj)
垢版 |
2021/04/21(水) 11:04:40.00ID:9tzd621Ta
>>327
そもそも問題設定が間違っていると思うよ。
正しい問題設定は「オブジェクト初期化子って何?」

オブジェクト初期化子とは、コンストラクタ呼び出しと、複数の任意のプロパティーやフィールドへの
値の設定をインラインで書けるようにした糖衣構文。
0336デフォルトの名無しさん (ワッチョイ d790-EWF6)
垢版 |
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なローカル変数に代入で、ローカル変数に適当な名前が思い付かないのでフィールド名と同じ名前で隠蔽
0337デフォルトの名無しさん (ワッチョイ d790-EWF6)
垢版 |
2021/04/21(水) 17:04:17.58ID:yCZSrEkI0
メソッド内で1,2回とか参照しないのであればわざわざnon nullableなローカル変数に代入しないが

特にkotlinとかスコープ演算子とかもあるがkotlinは「!!」と二重だからこれがいっぱい現れるとソースが見苦しい...
0341デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 10:42:48.70ID:XvsGXOnj0
linuxとwindowsで動くguiソフト作りたいんですが、共通の開発環境と言語ってあるでしょうか?
openglを扱ってみたいのですが、c++とqtが多いんでしょうか?
c++を扱うと思うので、erectronやwxpythonなどは除外されるんでしょうかね。
0344デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 11:16:13.25ID:XvsGXOnj0
opengl関係無いアプリも作りたいので(´・ω・`)
c#は恐らくlinuxでは動かないものですよね
0349デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 14:05:53.62ID:XvsGXOnj0
>>347
unityをguiアプリ開発に使いませんよね 普通
0352デフォルトの名無しさん (ワッチョイ d76e-vWSz)
垢版 |
2021/04/22(木) 15:44:38.28ID:XvsGXOnj0
>>350
monoやxamarinはc#ですよね。
c#製アプリはlinuxで動かないと効かされていましたが。
あと、openglなので、c++ではないですか?
0354デフォルトの名無しさん (ワッチョイ 778e-u7Bp)
垢版 |
2021/04/22(木) 17:02:51.26ID:RDEPc8rd0
釣りだろ
0359デフォルトの名無しさん (スププ Sd70-F6Jh)
垢版 |
2021/04/23(金) 21:53:03.64ID:e/IHU4YJd
c#でPCがアイドル状態か否か判定したくて
マウスの動きが一定時間なしで判定するのは出来たんだけど
マウスを動かさずブラウザで動画再生しているときにもアイドル状態ではない判定にしたいんだけど
どうすれば判定取れるでしょうか
0363デフォルトの名無しさん (ワッチョイ 1c79-BShP)
垢版 |
2021/04/23(金) 23:45:20.80ID:tWGuVFO60
その他の案
スクリーンセーバーのプロセスをトリガに利用にする
例えば「ブランク」のスクリーンセーバーが起動してたら、
「scrnsave.scr」がプロセス一覧から取得できる(はず)
つまり*.scrが動いてたら確実にアイドル状態と判断できる
この方法はスクリーンセーバーを無効にしてたら意味ないけど、それはレジストリから判断できるはず
問題はアイドル+スクリーンセーバーの起動時間まで待つ必要がある事
0366デフォルトの名無しさん (アウアウエー Sa6a-Nexr)
垢版 |
2021/04/24(土) 01:30:28.39ID:+FP4d2caa
>>359
率直に言って無理がある気が。

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

スリープを抑止するプログラムが起動しているかどうかで
判定できないかとも思ったけど、ブラウザの動画再生は
たぶんスリープ抑止しないよね知らんけど
0375デフォルトの名無しさん (ワッチョイ f0ad-Wjwq)
垢版 |
2021/04/24(土) 15:27:27.20ID:h2P4AVL30
>>370
雑にやるなら、StringInfo.ParseCombiningCharacters2倍して、半角文字の文字数引いたら良いんじゃないの?
アクセント付き文字も半角文字に入れればそれなりに並ぶんでは?

タイ語とかアラビア語まで考える?
0379デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/24(土) 17:00:48.70ID:TFlZREhta
Markdownのテーブルっていうのが何かよく分からないけど、
細かいこと言えば等幅フォントであってもどの文字がどの幅で
描画されるかはフォントに依存するはずだと思うので、(一般的に半角の文字だと
されているものが半分の幅で描画される保証なんて実はないんじゃないか?)
グラフィック関係なら>>371みたいに実測するのが一番確実だよね
0380デフォルトの名無しさん (ワッチョイ e27d-2xWT)
垢版 |
2021/04/24(土) 18:10:11.92ID:EfI17DN20
同じ文字で同じ等幅フォントで表示しても、アプリによって全角/半角相違することもあるよ
MS製品間でもVisualStudio/Officeで幅が一致しなくて以前困った記憶がある
0384デフォルトの名無しさん (アークセー Sxd7-On6t)
垢版 |
2021/04/25(日) 15:07:37.80ID:hcyifmDsx
パネルに貼り付けているlabelの数を数えることってできませんか?

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

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

数が多くなるとコードが長くなって修正等に時間がかかると思うんですよ。
そこでラベルの数が数えられるなら繰り返し文を使えばコードがスッキリするんじゃないかと思ったんです。
良い案のある方いらっしゃいましたらレスをお願いします。
0391デフォルトの名無しさん (ワッチョイ 412f-42zS)
垢版 |
2021/04/25(日) 17:17:41.16ID:FaKFDW610
>>390
(デザイナーでの)登録順ってのは「保障」されているのか?って話なんだが
ディクショナリとか一見登録順に見えても、それは条件が良いだけか実装依存な場合がほとんどだぞ

まあデザイナの定義もVSでいじるとどう変わるかわからんけどな
0394デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/25(日) 18:22:24.73ID:Jq50cbcAa
>>384
なんかやりたいことと質問の内容が噛み合ってないような気がw

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

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

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

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


とりあえずやりたいことはできたので、皆様本当にありがとうございました。
0401デフォルトの名無しさん (スッップ Sd70-miHF)
垢版 |
2021/04/26(月) 17:43:14.20ID:1JVi9H1ud
>>400
Nameじゃなきゃいいわけじゃないよ
じゃあTextで″削除″だった時にって分岐をすると、後にダイアログを出すから″削除...″に修正しなきゃってなって動かなくなる
派生してカスタムコントロールを作るとかTagを利用するとかが一般的かな
0402デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/26(月) 17:43:28.37ID:+MtLiehda
>>400
どのプロパティーを使おうが、そのコードを書いた時と違う値が設定されてしまったら
識別子として使えないのは同じじゃないの?w

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

そもそもボタン自身のイベントを使えば何がクリックされたか識別するコードを書く必要がない
0403400 (ワッチョイ fb54-C+b/)
垢版 |
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を参照するようになりました・・・
0404デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
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;
    }
  }
}
0408デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/26(月) 21:00:37.58ID:zRuX+7dna
>>405
本来はToolStrip自身じゃなくて、ToolStripやMenuStripを持った
Formを継承した方がいいような気もするけどね。
まあそれじゃ満たせない要件なのかもしれないけど。

でもToolStripやMenuStripってFormの継承と相性悪いんだよな確か。
修正されずに放置されてるバグがてんこ盛りだった気がする
0410デフォルトの名無しさん (ワッチョイ fb54-C+b/)
垢版 |
2021/04/26(月) 23:28:26.99ID:fsnGR4b00
>>409
よくないかどうかは状況次第だと思う。
自分や他人がコントロールのNameを変更した時に、判定する側もきちんと変更すれば問題ないはず。
そもそも変更しないなら問題になることもないし。
0411デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/27(火) 00:39:04.06ID:H7ElJCU2a
>>410
「〇〇を変更した時には××も変更すべし」みたいな自明じゃないルールが存在すると、
そのルールをコードを保守する人が忘れているか知らない場合には
正常に動作しなくなるリスクが発生していることになる。

プログラミングの目的は要件を満たすことなので、他に手段がなければ
あえてそういうリスクのある方法を採用することはあってもいいけど、
今の話は明らかにそうじゃない
0418デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 09:09:39.16ID:+C/fTs2P0
インターフェースや抽象クラスのメリットとは?

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

そもそもvirtual指定するのであればデフォルト処理というものを書いておけば必要に応じてオーバーライドすればよいと思うのですが。
0420デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 10:13:30.82ID:+C/fTs2P0
>>419
ありがと、
めちゃわかりやすかった。
0423デフォルトの名無しさん (ワントンキン MMb8-XmRv)
垢版 |
2021/04/27(火) 15:29:38.21ID:5DBHgWrVM
そういうのは大抵、いざ要件が増えたときには、今の引数だけでは〇〇の情報が足りないとか、拡張を想定していなかった部分を拡張しなければならなくなったとかで破綻するんだよ
要件にないなら後で実際に拡張が必要になってからリファクタリングした方がよい
0425デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/27(火) 17:44:39.71ID:+C/fTs2P0
もしかして抽象クラスとインターフェースって使う必要ない?
メリットはスパゲティコードにしない制約を追加するだけで有れば設計ミスの方じゃないか?
0426デフォルトの名無しさん (ワッチョイ 8ea7-BCeV)
垢版 |
2021/04/27(火) 17:54:44.27ID:MoRpu0yA0
>>425
まあでも知ってると他の誰かが使ったときに欠点がわかるよ
下地がそうやってできてるのにそれに逆らって作ってもしゃーないし
合わせるのは大事

ただメリットはよくわからん
List<object>やobject型の悪用とあんま変わらん気がする
落ちてもどこで落ちたかわからんのもいっしょ
0428デフォルトの名無しさん (ワッチョイ a27c-On6t)
垢版 |
2021/04/27(火) 18:04:24.32ID:pi+NfSuo0
interfaceはこのクラスにはこのメソッドがありますよと言う事を約束するだけで
実装が共通化しようもないようなものに使うものだし
(例としてforeachで回せるようにする為のIEnumerable)
抽象クラスは良くある例はFruitクラスの子クラスがAppleやら関連性のあるものに対して使うものだろうし
そもそも用途が違うような
0431デフォルトの名無しさん (スッップ Sd70-I7vP)
垢版 |
2021/04/27(火) 18:14:04.55ID:RVxlIcyJd
クラスを他の人に使わせてまうとあとで変えれなくなってのっぴきならなくなることがあるからやがな。

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

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

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

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

もっとマシなことに時間使った方がいいよ
0442デフォルトの名無しさん (ワッチョイ a27c-On6t)
垢版 |
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() {何らかの終了処理}
}
みたいに実装を用意しないとそもそもエラーになる
0445デフォルトの名無しさん (ラクッペペ MM34-/WW/)
垢版 |
2021/04/27(火) 19:53:09.03ID:zk58yDApM
>>440
単一継承しか許されないクラスと違い多重継承が許されるインタフェースでは、実体を実装するとC++同様に基底メンバの衝突の問題が発生する
この問題を回避するために実装を派生先に委ねてしまうことにしてインタフェース内では実装は禁止されている
0446デフォルトの名無しさん (ワッチョイ 56bd-n2H/)
垢版 |
2021/04/27(火) 20:06:45.34ID:3YkNPMA00
教えて下さい。VBから書き換えて勉強してます。
フォーム1と2があり、それぞれTextBoxが無数にあります。フォーム1→2まで入力をして最後入力した情報を保存したいのですが、どういった形式、方法で保存するのが望ましいですか?
VBは区切り文字を入れ、datファイル1つに2行で書き込んでます。再度呼び出す際にsplitでそれぞれのTextBoxに入れてます。
が、何かのタイミングでTextBoxが増減したとか面倒そうなんですが一般的にはどんな感じでしてるんですかね?
0453デフォルトの名無しさん (ワッチョイ 66ad-KKaU)
垢版 |
2021/04/28(水) 03:00:12.55ID:C+xRRq0o0
あるdll(A)にインターフェイスが定義されており、別のdll(B)にその実装があった場合、Aを修正してもBに影響がなければバイナリ互換性があると言う。
たとえばAのインターフェイスに実装を持たないメンバーを追加するとBはコンパイルエラーになってしまうので互換性が崩れる。
Aにメンバーを足す際にデフォルトの実装を書いてあげれば、Bはコンパイルエラーにならない。

破壊的変更にならないようにフレームワークやライブラリを改修したいってのがインターフェイスのデフォルト実装の動機。
0455デフォルトの名無しさん (ワッチョイ 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を押すという時どう入力したらいいの?
0458デフォルトの名無しさん (ワッチョイ b701-J6CO)
垢版 |
2021/04/28(水) 12:01:20.73ID:k6d6iGQO0
アップキャストを行うと何が嬉しいのでしょう?
インスタンス化は普通
クラスA a = new クラスA();
なのに
クラスB b = new クラスA();
ってする意味です。入れれるのと使えるメソッドはイメージ通りですが、使うタイミングが不明です。
0459デフォルトの名無しさん (ワッチョイ f82d-T6Cp)
垢版 |
2021/04/28(水) 12:12:07.08ID:CT/VgEdf0
>>458
親クラスがクラスBで、クラスBを継承したのがクラスAってことなんだろうけど、
クラスBを継承したクラスCを追加して時に、クラスAとクラスCを同じように扱いたい時に使う。
0461デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/28(水) 16:32:07.21ID:snAX0stPa
>>458
あえて言えばサブクラスで隠蔽(new)を使ってるメソッドやプロパティがあると、
サブクラスのインスタンスをスーパークラスの変数に入れた場合に
動作が変わってくるんだけど、恐らくそういう目的でそれをやるケースは
ほとんどないんじゃないかな。

ほとんどの場合、それは積極的な意味を持たないと思う。
0463デフォルトの名無しさん (アウアウウー 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);
0465デフォルトの名無しさん (ワッチョイ 0662-miHF)
垢版 |
2021/04/28(水) 19:54:14.62ID:MNdo4yxk0
>>463
それ暗黙的にアップキャストをしてるから不要ではないよね?
質問が、アップキャストの嬉しさについてだから例としては適切だと思うけど

アップキャストとしての嬉しさではなく、
クラスB b = new クラスA();という変数を作る意味があるのかって話なら、大抵は暗黙的なキャストてどうにかなるからやる意味はない
0471デフォルトの名無しさん (ワッチョイ 38e6-4uvq)
垢版 |
2021/04/28(水) 21:38:57.70ID:ohiKXwgS0
ToLinkedListを実装するのが絶対的正義
0477デフォルトの名無しさん (ワッチョイ c0b5-8KU9)
垢版 |
2021/04/28(水) 22:43:14.57ID:2iApvDDg0
>>473-476
ありがとうございます
なるほど、XMLでも階層構造は持たせられるけど仰々しいですよね
ああ、あれをシリアライザって呼ぶんですね
昔、一回JavaだかでJSON読んでみて満足した記憶があります
GW明けの使い捨てのスクリプトではJSONで書いて読んでみます
0487デフォルトの名無しさん (ワッチョイ 6cac-Tv8Z)
垢版 |
2021/04/29(木) 10:28:53.11ID:qu9Hv39D0
jsonはそのままクラスに持たせられるから便利
あとパースできない読めないってことが少ない
xmlもcsvと比較するとjsonに近い

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

Excelでもよみたいとか要件があるならcsvかな
0489デフォルトの名無しさん (ワッチョイ 9b02-wQF1)
垢版 |
2021/04/29(木) 10:49:23.57ID:PVZP3gNe0
目的の違うデータ形式を個々人で違う基準で評価してあーだこーだ言っても仕方ないのと違うか。

ただ。
json 形式の意味があるのか分からない深い階層を持つデータに対応するクラス作ってたときは本気でイヤになったけど。w
きちんと正規化して意味のない階層だとかを排除してくれるなら扱いやすい方式だとは思う。 < json
0495デフォルトの名無しさん (アウアウウー Sa83-Im0W)
垢版 |
2021/04/29(木) 13:06:57.09ID:C0wDcO7Sa
シリアル化方法(CSVをシリアル化とは普通は呼ばない気がするけど便宜上)を選択する上での
評価基準としては、

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

こんなとこかね。
CSVで評価できるのは(1)ぐらいなので積極的に使う理由はないね当たり前だけど
0506デフォルトの名無しさん (ワッチョイ bcb0-On6t)
垢版 |
2021/04/29(木) 16:48:57.18ID:t8Qsv63f0
>>500
もう言われてたけどjson型サポートされてるRDBMSもある。触ったことないのでパフォーマンスは知らぬ
mysql,PostgreSQLはカラムの型としてサポート済で、oracleとsqlserverは文字列型で格納して制約や関数でjsonとして扱う感じなのかな?
PostgreSQLだとjsonのキーに対してもインデックス作れるんだね。便利そう
0507デフォルトの名無しさん (ワッチョイ 8ea7-BCeV)
垢版 |
2021/04/29(木) 17:02:11.90ID:IBkpf/CX0
激レアケースを例にあげて自分の失策を正当化するのは良くないぞ
今の時代にデータベースに入れにくいデータ構造にしたのは明らかにバカ
それがわからないならお前らも結局時代に対応できないんじゃんwぷw
0509デフォルトの名無しさん (ワッチョイ bf87-/Q2x)
垢版 |
2021/04/29(木) 18:44:26.59ID:pn1fVmji0
>>507
rdbに突っ込むの前提ならcsvでも正規化されたテーブルが対象なんだから入れやすさなんかだけでは語れない。csvのデータは概ね正規化されたデータの結合と見れるので。
正規化·データの関連性を考えればjson·xmlの方が有利まである。
結局用途次第だと思うよ
0523デフォルトの名無しさん (ワッチョイ bf87-/Q2x)
垢版 |
2021/04/29(木) 19:53:32.90ID:pn1fVmji0
まぁすれ違いなんで最後で
>>513
そのままなんか入れないよ。
csvも正規化されたテーブルに分解·展開して入れる
jsonも正規化されたテーブルに分解·展開して入れる
データ構造の形で関連性が分かるのでこの点ではjsonのほうが有利
これはわかるでしょ?
まぁxml·jsonは言われている通りにdbmsがサポートしている場合があるから、その場合はそのまま入れればいいけども
0527デフォルトの名無しさん (ワッチョイ 8ea7-BCeV)
垢版 |
2021/04/29(木) 20:01:40.70ID:IBkpf/CX0
じゃあ、jsonぶん投げて入れてみろよ
どこのテーブルのどのフィールドにどうやって入るかもわからんけどw
階層になってるデータをなw

なんでできないこと言っちゃうかなw
0535デフォルトの名無しさん (テテンテンテン MM34-veNy)
垢版 |
2021/04/29(木) 20:51:47.22ID:nwdNubv1M
>>527
> どこのテーブルのどのフィールドにどうやって入るかもわからんけどw
> 階層になってるデータをなw
マジで知らないなら黙ってなよ…
1つのフィールドにjson形式でそのまま(内部的にはデシリアライズしてるだろうけど)入るんだよ
jsonをサポートしてるrdbmsはjsonの階層も含めて検索などができる
ただ、rdbmsによるだろうけど制約かけられないとかインデックス効かないとか色々制限あるので使い所はよく考えた方がいい
0538デフォルトの名無しさん (ワッチョイ ef24-On6t)
垢版 |
2021/04/29(木) 21:10:59.33ID:JLw8VMIz0
流れあんま見てないけど何MBにもなるjson扱うって結構あり得る事なの?
GTA5も数十MBのjsonからのデータ読み込みがパフォーマンスのボトルネックになっててクラッカーが改善Mod作ったいうニュース見たけど、普通はそんな膨れ上がるならsqliteとか利用するもんじゃないのか?
0540デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:20:12.08ID:QUExeogh0
プログラミングでファイル入出力を早くするにはやっぱり
良いGPUが必要なんでしょうか?
C#とGPUの関係を教えてください。
0541デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:21:16.85ID:QUExeogh0
ちなみにGPUは欲しいですが3Dのゲームはしません(ゲーミングPCを購入予定ですが…)
プログラミングの良い環境を整えたいのでお勧めのがあれば教えてほしい
言語はもちろんC#です。
0543デフォルトの名無しさん (ワッチョイ 9b5f-On6t)
垢版 |
2021/04/29(木) 23:30:51.76ID:PtPwSG5y0
ファイル入出力はGPU関係ない
ストレージに左右される
HDDよりもSSDの方が速い

何のプログラム作るか知らないけど
WinFormsでアプリを作るならGPUは関係ない
WPFで作るならアプリの描画にGPUが使われる
0546デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:59:30.38ID:QUExeogh0
>>543
大学の課題でテキストを読み込んで文字列を探すプログラムを作ってます。
文字列を読み込むスピードをほぼ0秒にすると実行時間が短くてすむので
良いGPUはないかと思ってるんですがね。。。
0547デフォルトの名無しさん (ワッチョイ 0e68-6Fjd)
垢版 |
2021/04/29(木) 23:59:59.65ID:QUExeogh0
ちな読み込むファイルの容量は100MB程度です。
0550デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/04/30(金) 00:19:41.24ID:f4OC/lzG0
ありがとうございます。
どんな高性能なPCでも時間は0秒にはならないってことですね?
俄かに信じがたいですが、早くなる方法ないでしょうか。
0554デフォルトの名無しさん (ワッチョイ 87b0-OedE)
垢版 |
2021/04/30(金) 00:35:48.48ID:ZjT67Y+80
> どんな高性能なPCでも時間は0秒にはならないってことですね?
C#全く関係ないスレチ

あと元の質問自体が「サッカーで速く走るにはいいスパイクが必要なんでしょうか。シュートとスパイクの関係を教えてください」みたいな謎文脈なので、
こちらはそっちの脳内でどんな解釈されてるのか、まるで見当が付かない
0555デフォルトの名無しさん (ワッチョイ df52-FRJu)
垢版 |
2021/04/30(金) 00:45:47.98ID:FVXE5M810
>>550
そういう根拠のない思い込みでこうなるはずなんて思考をしてたらプログラミングなんて理解できなくて詰むから、早いうちに矯正しろよ
まあ根っから性分だろうからもう手遅れだろうけど
0558デフォルトの名無しさん (スププ Sdff-FvP6)
垢版 |
2021/04/30(金) 06:01:15.69ID:6G/EU7oZd
大学の課題でスペックの条件が必要なの?
無駄のないロジックを書くとか、そういうのが目標だったりしないのかな。
なんだったかな。C#だったらライブラリのメソッド一発で終わってしまう話だよ。
スペックが必要ならハードディスクじゃなくてSDとかの電子メモリにするだけ。
0566デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/04/30(金) 12:37:03.29ID:clFaH4DRM
>>561
中2ぐらいなら許される?
0567デフォルトの名無しさん (ワッチョイ 0702-7a8P)
垢版 |
2021/04/30(金) 13:53:37.33ID:IafryiiR0
真面目な話、設問の但し書きの部分を真に受けただけなんでは、とか思うのだけど。
「ただしファイルI/O などの処理時間は無視できる物とする」とかの。

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

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

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

後者はどうなんだろう。
自分なら、値型の方が代入比較が簡単で早そうだから、ギリギリまで何でも値型で。
でも、参照型の方がクラス継承とか参照渡しとか出来るから、その時の都合で使う。
機能と性能、仕様と規約、自分の主義で決めたらいいかと。
0576デフォルトの名無しさん (ワッチョイ 87b0-OedE)
垢版 |
2021/05/01(土) 00:37:52.50ID:GAZiMPha0
C#関係ないやね
折角なので答えると正解はない問いだと思う。みんながベストを探してる
つくるソフトや環境で適切なモノを周りと相談して作り上げるしかない

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

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

どのクラスにどの処理をもたせるのがいいのかは用途次第でケースバイケース
one size fits allな答えはないのでやる前からそれを求めていても進歩しない
0579デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/01(土) 00:54:13.87ID:CrHqAudLa
>>573
そういうのはやる前からいろいろ考えるより
「失敗したらやり直せばいい」と考えてとにかくいろいろコードを
書いてみることが大事。

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

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

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

様々な意見感謝です☺
参考させて頂きます。
0581デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 10:59:09.68ID:BCm84eaD0
この前質問したバカですが(一応国公立)
何故レースゲームは膨大な建物や道路データをリアルタイムに
読み込めているんでしょうか?どういう仕組みなんですか?
例えば1Gのテキストファイルを読み込もうとすると実験しましたが、10秒かかってしまいます。
テキストファイルではなく、グラフィックデータを瞬時に読み込めるのはなぜですか?
C#より速い言語なんでしょうか?
0583デフォルトの名無しさん (スププ Sdff-FvP6)
垢版 |
2021/05/01(土) 11:10:22.30ID:Bazlrq4sd
>>581
そのレースゲームがどんなんだか判らないけど、
ゲーム中じゃなくて起動するときに10Gでも100Gでも、
あらかじめ10分かけて読んでおけば良いんじゃないかな。
圧倒的に問題に対する条件が乏しくて、どう考えればいいのかこちらも判らないよ。
0584デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 11:22:20.62ID:BCm84eaD0
>>583
市販のゲームは10分もかかりませんが、何故でしょうか?
0586デフォルトの名無しさん (ワッチョイ a724-OedE)
垢版 |
2021/05/01(土) 11:35:09.71ID:nO6fZcYL0
>>584
583は分かりやすく極端な例を出しただけで常識的に考えて10Gのデータ読み込みなんてしないっしょ
大体重めのゲームでも起動時やマップ入場時のロードは500MBくらいじゃね?
つまりそのレースマップ入場時にそこで必要なグラフィックデータを数十秒かけて読み込ませればいい
0587デフォルトの名無しさん (ワッチョイ a724-OedE)
垢版 |
2021/05/01(土) 11:52:19.99ID:nO6fZcYL0
>>584
君のレス追ってみたけどゲームじゃなくて目的はテキストファイル?
ファイルI/Oにボトルネックがあると思ってるようだけど、テキストファイルだとしたらボトルネックはエンコードにあるんじゃない?
File.ReadAllTextは割とオーバーヘッド大きいから、.NetCore3以上でSpanを利用したエンコードを構築すればいくらか早くなるかもしれない
0588デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/01(土) 12:02:16.59ID:79IzxePJa
>>581
自分もゲームまったく知らないので偉そうなことは言えないけど、
いきなりそんな高度な話より、例えば40年前のゲームのスーパーマリオは
たった30kBの中にどうやって32面分オーバーのマップデータを詰め込んだかを
考える方が有益だと思う。

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

えーっと500MBでしたっけ?ウフフ
0594デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:39:40.13ID:GvoaCTGBM
>>593
円盤システムの話なので
0596デフォルトの名無しさん (ラクッペペ MM8f-HlUj)
垢版 |
2021/05/01(土) 13:47:26.99ID:GvoaCTGBM

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

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

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

あったら困るんですかね?
0602デフォルトの名無しさん (ワッチョイ 0702-7a8P)
垢版 |
2021/05/01(土) 16:29:01.53ID:5BASMYuN0
高度どころか怠慢な素人丸出しなんだが。

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

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

一人でやるんだったら全部自分で制御しなきゃいけないんだし
0607デフォルトの名無しさん (エアペラ SD9b-R7/G)
垢版 |
2021/05/01(土) 17:23:02.96ID:v2ArV8E8D
597には応えてくれなかったな
質問を変えよう
母に呼ばれてリビングからダイニングに行ったら食事の用意がされていました
これはリビングから呼ばれた者がダイニングに行くまでの一瞬に、
母が食事を用意したと思うか?
0608デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/01(土) 17:36:18.28ID:h1NN14xsa
>>600
ストレージの「革新」については15年ぐらい前にこんなのがちょっと話題になった。
だけど、自分が知らないだけかもしれないけどその後の進展を聞かないね。
https://gigazine.net/news/20060710_mram/

NVRAM的な物のコストが下がれば記憶デバイスのカーストの中にある
メモリーとストレージの間の分厚い壁が崩壊するわけで、かなり革命的な
ことなはずなんだけど。
0612デフォルトの名無しさん (ワッチョイ 6768-TNk6)
垢版 |
2021/05/01(土) 18:53:13.69ID:BCm84eaD0
>>607
いやわかりますよ。料理を調理する時間が
HDDアクセスってことですよね?ただ料理と違う部分は、煮えるまで待つとかなくて
目的のものをとってくるだけでいいから、一瞬でその場所にいけたら、
基本的には0秒なんですよね。HDDのシークバーがその場所から動く必要がなければ最速ってことですよね。

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

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

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

あおりでもなんでもなくあなたには向いていません
0620デフォルトの名無しさん (スププ Sdff-FvP6)
垢版 |
2021/05/01(土) 20:30:35.88ID:Bazlrq4sd
いわゆる「ロード中」っていう処理待ちをさせずマップ切り替えが可能なゲームがあったけど、そういう話かな。
古い時代の話だから、今じゃ大したこと無いかもね。
0623デフォルトの名無しさん (ワッチョイ 7fa7-wijr)
垢版 |
2021/05/01(土) 22:04:23.51ID:u8jqB+2A0
そもそもPCのマザボに
CPU、メモリ、HDD、グラボ乗ってんだから
それぞれに行き来するのに時間かかるってわかるやろ

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

とりあえず物理的にどうやってくっついてるのか調べるべきだと思う
0624デフォルトの名無しさん (スッップ Sdff-EcTW)
垢版 |
2021/05/02(日) 00:05:56.42ID:Jc9e5ibud
まぁ自作したことすらない子も多い。
うちの会社もゲームやゲームハードも作ってるとこなのに開発メンバーなのにスカジーケーブルすら知らん子が入ってきてる。
抽象化や隠蔽化が進んで上のレイヤーばかり意識するようになってるから地盤が無い。
0626デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/02(日) 00:23:00.38ID:BrJlALbya
>>624
SCSIなんか知らなくて当然だし別に何も問題ないと思うよ
むしろ「お前らこんなの知らないだろう」オジサンの方が問題だw
0628デフォルトの名無しさん (スッップ Sdff-EcTW)
垢版 |
2021/05/02(日) 00:29:06.70ID:Jc9e5ibud
その辺の事務や営業じゃなくて、コンピュータハード作ろうという子がバリバリ現役のスカジー知らんとか相当不勉強なんだけとw

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

要するにそれ自分中心主義なんだよ
そういうおじさんみっともないよマジで
0631デフォルトの名無しさん (ワッチョイ 075f-Mxzp)
垢版 |
2021/05/02(日) 01:03:34.73ID:WAC22cE20
コンシューマゲーム機だとSCSI使ってたのは、ドリームキャストとかGBAの世代までだったなー
SCSIは相性があるから結構厳密に型番指定されてたっけ
そしてそれら以降のハードはみんなUSBだった気がする
0632デフォルトの名無しさん (ワッチョイ 0702-7a8P)
垢版 |
2021/05/02(日) 11:04:21.93ID:9GC+BpRR0
「SCSIを知ってる」ってどのレベルでのことを言ってるんだろう。
名前を知っていればいいレベルなら、必要になったときに調べれば済むんじゃ。
昔に流行ったの技術を知らないのは不勉強、って言われても困るような気がする。
0633デフォルトの名無しさん (ワッチョイ 6793-R7/G)
垢版 |
2021/05/02(日) 11:34:55.65ID:kVgm1y330
SCSIは抽象化されて残ってるじゃん
物理インターフェースだけの存在じゃない
iSCSIなら当たり前に見かけるだろ
そもそも0と0を超えた時間とを同一視し、
0にならないことをにわかには信じられないと宣う国公立大学生って嘘くさい
国公立中学生っぽいからまずは基本情報技術者の勉強でもして、
言語とハードウェアの関係から学ぶのがよさそうだね
0637デフォルトの名無しさん (テテンテンテン MM8f-m/Zw)
垢版 |
2021/05/02(日) 13:16:44.85ID:bVQBnZjhM
> C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
> C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください

大事なことなので…
0638デフォルトの名無しさん (ワッチョイ 2701-SFYt)
垢版 |
2021/05/02(日) 13:26:41.16ID:6VPLrRfP0
インターフェースって継承以外でインスタンス化してフィールドに持たせるように使う場合があるけど、それって違う場所に定義している関数を呼び出して使うような感じ?
いまいちインターフェースの使い方がわからぬ
0641デフォルトの名無しさん (ブーイモ MMcf-XmiE)
垢版 |
2021/05/02(日) 13:51:59.04ID:gOHPQIPOM
それぐらいなら別にinterface要らんけどな
自社DLLの指し替えOKならメソッドの中身変えるのはできる
TypeScriptのinterfaceぐらいになったら便利だけどC#やJavaのinterfaceはそこまで重要じゃない
0642デフォルトの名無しさん (ワッチョイ df01-i6Oo)
垢版 |
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クラスは変更する必要がない
単一責任の原則や依存性逆転の原則というオブジェクト指向設計の基本原則に従ってる
0643デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/02(日) 14:53:27.70ID:vJ/g4PX7a
>>638
全然違うものを透過的に扱いたい場合ってあるでしょ?
例えばビデオゲームで入力デバイスとしてゲームコントローラーだけでなく、
キーボードやタッチパネルも使えるようにしたいとか。

とりあえずはInterfaceはそういう要求を満たすためのものだと
理解しておけばいいよ。それ「だけ」ではないけどね
0644デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/02(日) 15:09:58.26ID:vJ/g4PX7a
汎用性を高めるためって考えた方が分かりやすいかもね。

昔テレビデオってあったけど、世の中にHDMIみたいなインターフェイスが存在せずに
ああいうモノリシック構造の機械しか存在しなかったらどんだけ不便か考えれば
インターフェイスの意味なんてイチコロだと思うけどな
0646デフォルトの名無しさん (スププ Sdff-BL7Q)
垢版 |
2021/05/02(日) 17:53:29.91ID:two2wwYId
関数を渡すとしても、引数なり戻り値なりの型を定義しないとならんしな。
実装を含まない定義を切り出しておかないと、容易に循環参照になってクリーンビルド出来なくなるぞ。
0648デフォルトの名無しさん (ワッチョイ df61-Lr3t)
垢版 |
2021/05/02(日) 18:14:35.65ID:KSgMbN0G0
インターフェイスつかってるとVisualStudioで定義に飛んでもメソッドの実装見れないから腹立つんでやめてください。
0650デフォルトの名無しさん (ワッチョイ df61-Lr3t)
垢版 |
2021/05/02(日) 18:24:40.27ID:KSgMbN0G0
>>649
見られたくない恥ずかしい実装してるってことですねわかりました
0651デフォルトの名無しさん (ブーイモ MMcf-XmiE)
垢版 |
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
まあそうだね
そしてデリケートで済まない用途なんてのは、ないんだなこれが
0652デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/02(日) 18:48:49.12ID:sTlH4cY7a
OKでは

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

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

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

>>653
Funcはシステム定義だが?
TやUは架空のコードでよくあるただのプレースホルダであって特に意味はない
どこかで定義されていると考えていいよ
0661デフォルトの名無しさん (ワッチョイ 87b0-OedE)
垢版 |
2021/05/02(日) 23:12:46.37ID:OnfmzaV30
>>657
クラスに実装するのなら、ドメインに焦点を当てたクラスにその実装も凝集されるけど、
外部からデリゲートで渡す場合はそのデリゲートをどこに定義すんのって事じゃない?

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

抽象的な話してると自分の頭じゃ理解しきれないな
こういう設計の場合こうすればよくね/こういう問題があるやんっていう具体例が欲しい
0662デフォルトの名無しさん (ワッチョイ e7ad-BL7Q)
垢版 |
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)と遠回りになってもそう。
0663デフォルトの名無しさん (ブーイモ MMcf-XmiE)
垢版 |
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
相変わらずなにが言いたいかわからん
0666デフォルトの名無しさん (アウアウウー Saab-TNk6)
垢版 |
2021/05/03(月) 01:42:30.76ID:FYXS8pYUa
>>665
>できるできないの話ならアセンブラなら何でも実現できるよw
意外にこれが本質だろうね。

一昔前のOOP批判にも「構造体でも同じことが実現できる」ってのがあった。
そりゃできるに決まってるが、そういう批判には無理してそうやって
書いたコードが果たして人に理解しやすいのか、
人間の認知能力に親和的なのか、という視点が欠けていた。
0669デフォルトの名無しさん (ワッチョイ 87b0-OedE)
垢版 |
2021/05/03(月) 01:46:57.30ID:el9v2bCt0
>>663
構文レベルでは引っかかるところは無いので、設計レベルの質問した感じ
自分の理解があやしいのは自覚してるので質問しつつ補おうとしてる ※自分は半人前くらいなので

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

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

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

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

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

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

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


率直に言って、このおじいちゃんは
Rubyガイジ並みorそれ以上の害悪だからもうこのスレで書きこまないでほしい
0676デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 11:36:41.28ID:8gAH2GR/M
昨日は触れなかったけど、関数のメリットの中でも特に大きいのは、テストのしやすさね

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

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

これを知ってしまうとOOPなんてやってられんくなるよ
0678デフォルトの名無しさん (スププ Sdff-BL7Q)
垢版 |
2021/05/03(月) 11:42:45.35ID:KphYKkJEd
都合の良いラムダを渡すだけ。
そのラムダの引数の型は?

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

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

>>678
意味不明
0682デフォルトの名無しさん (スププ Sdff-BL7Q)
垢版 |
2021/05/03(月) 12:43:57.15ID:KphYKkJEd
どう意味不明なのかマジでわからん。
OOを捨てて関数型推したいのはわかるけど。

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

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

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

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

Goのdefer文は破棄の遅延実行ではない。その関数を抜けるときに必ず実行する、だけ。
破棄以外にも使えるんよ。
finally節だと思えば妥当でしょ。
0688デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/03(月) 13:44:29.08ID:57hGL+DgM
>>686
データベース接続も関数でいいよ
同じシグニチャの関数セットを異なるモジュールに定義して必要なものを必要な時にインポートするだけ
0689デフォルトの名無しさん (スププ Sdff-BL7Q)
垢版 |
2021/05/03(月) 14:15:02.88ID:KphYKkJEd
>>688
シグニチャが同じなら、引数も戻り値も同じなんよね。
DBごとに違うコネクションをどう表現するの?
GoでもDriverインターフェイスでさばくよね。DB。
具象クラスのメソッドが呼びたい時はアサーションするよね、
0692デフォルトの名無しさん (スププ Sdff-BL7Q)
垢版 |
2021/05/03(月) 14:43:05.66ID:KphYKkJEd
そう。結局インターフェイスのこと言ってるの。基底になるオブジェクトとかそういう話になるだろうけど。
定義場所の問題。
そんで、それを定義だけ外に出せないのが問題だと俺は思う。
0693デフォルトの名無しさん (ワッチョイ bfde-wijr)
垢版 |
2021/05/03(月) 15:09:53.18ID:JDQ36HZh0
>>682
それを許すならコールバックのがいいなー
結局、実装見てみないとそいつらってわかんなくない?

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

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

確かにまぁ、開放したはずが開放できてなくて再起動するはめになったりしたし、わからんでもないけど、それこそIDisposableなんかでハンドリングした方が良いんじゃないかな。
0696デフォルトの名無しさん (ワッチョイ ff02-OuAg)
垢版 |
2021/05/03(月) 16:10:09.16ID:bSPfVkbS0
デリゲートvsインターフェースの戦いはつまるところ気軽に使いたい派vs丁寧に型付けしたい派の宗教戦争なのだろうな
JavaのFunctional Interface、TypeScriptのStructural Subtyping、オブジェクトリテラルがあれば両陣営とも納得すると思われる
0698デフォルトの名無しさん (ワッチョイ e7ad-BL7Q)
垢版 |
2021/05/03(月) 18:11:29.08ID:MrRb6D/k0
単純に、7割位のケースで有効な方法が、銀の弾丸な気がする時期じゃない?

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

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

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

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

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

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

比較関数を毎回渡してソートする方式とIComparableを使ってソートする方式の違い
どういう種類の仕様変更に対してどこまで影響が波及するかを比較して考えるといいかも
0702デフォルトの名無しさん (ワッチョイ e7ad-BL7Q)
垢版 |
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の方が楽だと思う。
0703デフォルトの名無しさん (ワッチョイ e7ad-BL7Q)
垢版 |
2021/05/04(火) 08:02:02.52ID:9VBk1Szv0
なんか「こうすると後始末が楽」ってのと、「これてもできる」ってのは違うと思うんだが。
Action<string>とかAction<int,string,string>みたいなものでログ出力関数をロガーとして関数に突っ込むのは「これでもできる」側としか思えんのだ。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

属性は単なるラベルであり、クライアントによって様々な利用形態が考えられることは、俺が先に説明した通り
0741デフォルトの名無しさん (ワッチョイ e7ad-BL7Q)
垢版 |
2021/05/04(火) 14:46:49.09ID:9VBk1Szv0
>>739
属性の有用性はそれ以前の問題。
アスペクト指向に属性は実際問題必須ではない。
インターフェイスは要るがなw

単なるラベルであり様々な利用形態が、ってのは、わかってる相手に説明する方法であって、全く知らない人間に対しては何の説明でもない。せめてググるためのワードを出せよ。
0744デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 15:04:03.10ID:p57xGa3RM
>>741
属性はAOPに必須ではないが、ないと非常に大雑把な実装になり、挙動のコントロールが難しくなるため、実用上はほぼ必須だよ
太平洋横断に船は必須ではない、と言うようなものだ、最後の旅にならないといいね

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

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

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

「ただのラベル」こそ「うやむやにはぐらかしてる」でしょ。
0750デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 15:43:52.50ID:/UxZFiSCM
>>746
>属性はただのラベルではない。
>誰かが読み取るためのラベル。
それをただのラベルっていうんだよ
読み取る側がそのラベルを見て何らかの作用を起こすまではなにもしない
まさにただのラベルだな
0752デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 16:04:50.31ID:/UxZFiSCM
>>751
ええと
ブーメランってご存知?
0754デフォルトの名無しさん (ブーイモ MMcf-QYFT)
垢版 |
2021/05/04(火) 16:10:37.11ID:B/7UzgrKM
というブーメランなのでした
ちゃんちゃん
0757デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:21:29.88ID:Oi9dh/iA0
WebClient使ってWebサイトのhtmlを文字列として取得したいんですが、
読み込みに数十秒かかるような重いページだと、途中でエラーします。
そんなページでもエラー無く読み取る方法有りますか?
0758デフォルトの名無しさん (ワッチョイ 2ae6-YEtS)
垢版 |
2021/05/07(金) 00:26:59.06ID:xGNvq5Jp0
Irvine
0759デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:34:48.56ID:Oi9dh/iA0
>>758
それはC#から呼び出して使えますか?
0761デフォルトの名無しさん (ワッチョイ eaba-dxvU)
垢版 |
2021/05/07(金) 00:43:50.02ID:Oi9dh/iA0
>>760
ありがとうございます。
>GetWebRequest()をオーバライド
は既に試したんですが、相変わらずエラーで中断します。
>HttpClientクラス使った方が良いと思うけど
それは何故でしょうか?
0787デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/08(土) 14:18:11.82ID:ub5A9aINa
>>780
身もふたもないけど使い方次第だね。

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

自分はデカいクラスでMSのドキュメントみたいにメンバーを種類ごとに分類するのに使ったり、
ある程度以上の規模のFormで例えばメニューのイベントハンドラを分類するのに使ってる
0793デフォルトの名無しさん (ワッチョイ a6da-XZlr)
垢版 |
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; }

で、それぞれに同じコメント書くのが非常にだるい。
なにかうまい方法ないですか?
0796デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/08(土) 15:26:30.05ID:X8Zwq8nja
>>789
privateの意味を誤解してる気が

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

もちろん「まず見る必要がないから畳んでおきたい」需要が絶対にないとまでは言い切れんとは思うけど。
0799デフォルトの名無しさん (ブーイモ MM97-G81e)
垢版 |
2021/05/08(土) 16:10:59.65ID:0QGgEZ+BM
長大なメソッドの中身をregion使って折りたたんだら短く見えるからいいよね
0801デフォルトの名無しさん (ワッチョイ 3ebb-krZt)
垢版 |
2021/05/08(土) 17:12:49.71ID:6pb9v2QO0
macOSに新しい.NET Core SDK/ .Net 5 SDKを入れ続けていると、何バージョン分もディレクトリが掘られて増えていきます
公式では、いらないものを単純にディレクトリごと削除して良いようなことが指示されていますが、これらのディレクトリのパスをdotnetコマンドに知らせている設定部分はどこにあるのですか?
0803デフォルトの名無しさん (スッップ Sd8a-6gku)
垢版 |
2021/05/08(土) 18:05:57.33ID:jYvDj1vcd
>>800
コンストラクタで例外投げたくないな
引数はフィールドにセットするだけでそれ以外は基本しない
検証するなら別のメソッドにするかコンストラクタ隠蔽して検証しつつインスタンス返すstaticなメソッド作る
0806デフォルトの名無しさん (ブーイモ MMd6-D3Lk)
垢版 |
2021/05/08(土) 19:33:57.25ID:6+YQB65FM
>>800
普通にifで調べて、普通に例外を投げてくれ
引数がおかしいならArgumentExceptionとか適当なのあるでしょ
引数が増えるとifを書くのがしんどくなるかもしれないが、そのときは関数化しよう

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

コンストラクタで例外を投げたくないとか言ってる人は、気にしなくていい
昔はそういう流派もあったんだな、とでも考えてくれ
0812デフォルトの名無しさん (ワッチョイ cb68-dxvU)
垢版 |
2021/05/08(土) 20:46:20.44ID:v+2mVqTb0
単純計算の時間って完全に比例するんですか?
繰り返し処理で
10万回 2桁同士の掛け算を行う。
12万回 2桁同士の掛け算を行う。

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

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

コンストラクタでの例外は、やるなっていう言語が存在するのは確かだが、宗教以前に言語の問題
C#では別に問題なかったはず
0817デフォルトの名無しさん (ワッチョイ da2d-gUNg)
垢版 |
2021/05/08(土) 23:50:56.30ID:ef0LnTY20
Debug.Assert()はバグってる原因を探る時に、想定通りの値になっているかを確認する時に使うな
確認が終わったらソースから消すけど、万が一消し忘れても影響無いし
Trace.Assert()は使ったことない
0818デフォルトの名無しさん (ワッチョイ dabd-6gku)
垢版 |
2021/05/09(日) 00:29:36.29ID:qLvHom4Y0
803だけど昔「コンストラクタで例外投げたりアカンぞ」みたいなことを本で読んだ記憶があったんだがいま読み返したら完全に自分の記憶違いだった 申し訳ない
0819デフォルトの名無しさん (ワッチョイ b7e4-vR7S)
垢版 |
2021/05/09(日) 00:51:47.19ID:RBUe6vIe0
職場でExcelVBAとACCESSをある程度動かせるようになったので、ステップアップしてC#を勉強してみたい。
勉強用のサイトやオススメの本などあったら、教えて頂けませんか?
0820デフォルトの名無しさん (ワッチョイ cb68-dxvU)
垢版 |
2021/05/09(日) 01:01:53.07ID:6r3obgDk0
2D格闘ゲームって3Dのapiがなくても作成可能ですか?
何か昔っぽいゲームを作りたくなってワクワクしてます。
環境はvisualstudioです。
0821デフォルトの名無しさん (ワッチョイ 9f02-dxvU)
垢版 |
2021/05/09(日) 02:07:45.79ID:xtmxe3CZ0
誰か助けて。WebView2を使ったプログラムなんだけど
以前動くやつを作ったプロジェクトを今日久しぶりに触ったら
「System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'」
と出てまったく動かなくなってしまってた… 一行も弄ってないのに
本当に何にも触ってないんだけど一体何が悪いのか。
0823821 (ワッチョイ 9f02-dxvU)
垢版 |
2021/05/09(日) 02:55:26.73ID:xtmxe3CZ0
原因が分かった。プロジェクトのディレクトリを移動すると動かなくなるみたい。
でも何故なの?どこを修正したら良くなるか誰かおしえて!
0828デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/09(日) 12:02:06.30ID:A+xFAhosa
いやコンストラクタで例外投げるな、投げたい時にはファクトリーメソッドを使え、
という議論は確かに見たことある。

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

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

メモリリーク云々はC++とかの話が元みたいで、それも例外投げるなではなく投げる場合は適切に参照を削除してから投げろみたいな話だったと思うのだが、
c#の方は問題ないのか?
標準ライブラリにもコンストラクタで例外返すやつあるのでそれの実装が見たい
0836デフォルトの名無しさん (ワッチョイ 6a01-wt3T)
垢版 |
2021/05/09(日) 13:38:09.58ID:WHUEfE6G0
>>813
> どんな値が渡されるのかわからない関数などは例外処理、その逆(外部に公開しない関数)の値チェックになら使えそうなのかなと思ったんですが
ざっくりその認識で正しいよ
内部的にはあり得ない状態ならAssert投げる
デバッグ終えたら削除とかアホのやること
注意すべきなのはassertの条件の所に副作用を含む式を書いちゃいけないことぐらい
0838デフォルトの名無しさん (ブーイモ MMd6-D3Lk)
垢版 |
2021/05/09(日) 13:46:49.04ID:rAnETUQPM
C#ではコンストラクタで例外が出るとファイナライザが呼ばれないことから
コンストラクタでは例外を出すべきでないとする派閥が昔は存在した

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

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

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

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

なので絶対に起こらないから本番では外しちゃえなどと安易に考えずに
俺の考えではまあまず起こらないと思うけどもし起こったらやばいから念の為に残しておこうと考えたほうがよい
0843デフォルトの名無しさん (ワントンキン MMda-rYak)
垢版 |
2021/05/09(日) 14:05:22.60ID:aeEkFGhTM
ちなみに.NET Framework(非Core系)でもCriticalFinalizerObjectに意味があるのは複数のAppDomainを使ったアプリケーションの場合だけだよ
あまり理解されてないけど、99.9%の人には無関係な極めてニッチな機能
0844デフォルトの名無しさん (ワッチョイ bea7-wGCM)
垢版 |
2021/05/09(日) 14:06:37.90ID:KNQAmpF60
また空中戦やってるな
設計はどうなってるのか?もこだわらず
どう処理したいかばっかり
客がエラー扱いにしたいって言ったら
テメーの例外のこだわりなんかゴミ箱だ
逆もまた然り
0847デフォルトの名無しさん (ブーイモ MMd6-D3Lk)
垢版 |
2021/05/09(日) 14:30:18.11ID:rAnETUQPM
もちろんオレオレハンドルラッパーをDIYしたいならそれを止める権利は俺にはない
しかし趣味ならともかく仕事ではDIYを避けたほうがいいだろうねとアドバイスだけはさせてもらおう
0849デフォルトの名無しさん (ワンミングク MMda-rYak)
垢版 |
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が無いなら手間とミスしうるポイントが余計に増えるだけにしか俺には思えないね。
0851デフォルトの名無しさん (オッペケ Sr33-7fsT)
垢版 |
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"));
0855デフォルトの名無しさん (ワッチョイ ea61-LExt)
垢版 |
2021/05/09(日) 22:04:27.52ID:pySvIkdW0
例外はcatchして握りつぶすのが吉
0857デフォルトの名無しさん (スップ Sd2a-5xeF)
垢版 |
2021/05/10(月) 07:43:24.96ID:v9qGjilad
クラスとかメソッドとか分けるときの命名が大変で時間が掛かるお…
適当にそれっぽい英単語繋げてるけど、メソッド名が50文字以上になることがよくあるお…
ForとかByとかFromとかも使うとより長くなるんだお…
どうしたらいいんだお?
0866デフォルトの名無しさん (スプッッ Sd2a-5xeF)
垢版 |
2021/05/10(月) 12:08:15.82ID:EOKyCo1ad
下手に英語やローマ字使うより日本のプロパティ名を使った方が分かり易いこともありますな
敢えて外人だけに意味を理解しにくくさせたいときなんかにも使えそうですな
0869デフォルトの名無しさん (ワッチョイ fbad-t4JP)
垢版 |
2021/05/10(月) 12:37:31.60ID:85dwBuQM0
国民健康保険保険者番号、という単語を変数名にするときは、だいぶ議論した上で、
kokuho_hnoになったな。
national_health_insurance_insurer_numberはとても反発が大きかった。
0870デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/10(月) 12:56:28.88ID:2MQuNC0ra
英語力がボトルネックになってるケースはむしろ少ない気がするね。
命名下手な人は日本語でも意味不明な名前付けそうな気がする
というより、だいたい命名以前の問題で既に失敗してるんだよね

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

命名で止まっちゃう人はそこがいい加減なんだよね。抽象化が出来てない。
0872デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/10(月) 15:31:20.10ID:lCZGOQhNF
>>841
良い心掛けをお持ちですね
大事になすってください
0880デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/10(月) 18:37:55.44ID:l/O9+A2Na
>>876
識別のために割り当てる符号は数字だろうがギリシャ文字だろうがID(identifier)でしょうw
ただ、保険者(業者)と被保険者を区別する必要があることに気づかなかった
この場合NhiIDはまずいね

まあスレ違い甚だしいな
0881デフォルトの名無しさん (ワッチョイ 2a01-Yqly)
垢版 |
2021/05/10(月) 18:42:01.34ID:giJ6lOgz0
hhnoかぁ

nhiもそうだけどhhnoやhnoみたいな普段の会話で使わない略語よりも
kokuho_hokensha_noとkokuho_hihokensha_noみたいに
普段の会話で使う日本語読みに寄せたほうが何かと良さそうだね
0883デフォルトの名無しさん (JP 0H0a-aC2w)
垢版 |
2021/05/10(月) 18:46:43.73ID:T4WFU4KFH
被保険者番号みたいなのは
コーディング規約をいじる裁量があれば日本語変数名が最強なんだよなあ
入力はちょっと大変だけど、視認性最強でドキュメントコメント不要になるし
英字表記に悩んだり表記ゆれに煩わされることもない、変な英略語覚えるのに頭使わなくて済む
0886デフォルトの名無しさん (ワンミングク MMda-rYak)
垢版 |
2021/05/10(月) 21:56:52.64ID:/NuMOBBIM
>>885
enumは決まった値しか取り得ない型
継承して取りうる値が増えたら、それは基底クラスにおける「決まった値のみを取る」という規約を破ってしまうことになる
規約を破らずに値を追加するには、継承せず普通にenumに追加しなければならない
0889デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/11(火) 00:18:16.99ID:lKBWqYLpa
率直に言ってenumを継承するって発想自体が理解不能w

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

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

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

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

みたいにしておいて、BorderStyle == BorderStyle.ExtendedStyle
の時には別のプロパティでスタイルが決まるようにする
0892デフォルトの名無しさん (ワッチョイ 2fb0-DjaX)
垢版 |
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.")

上の書き方の場合、文字列部分を定数で宣言できたってメリットあったと思うんだけど、$使う文字列挿入だとできないよね
使い分ければ良いだけだと思うんだけど、他に冴えたやり方あったりする?
0895デフォルトの名無しさん (ワッチョイ bea7-wGCM)
垢版 |
2021/05/11(火) 02:06:49.74ID:aDB05LmB0
>>894
不変よ
少なくともプログラムが実行されてからは
だって状態を表してるんだから
変更が必要になるのは継承で分岐するソースコードの修正作業時だけ

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

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

多言語化のために文字列リソースにしておきたいという動機なら理解できるけど
変数に入れたい動機が思いつかない
0902デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/11(火) 02:41:03.08ID:lKBWqYLpa
だからそもそも根本的に考え方がおかしいと思うよw
集合論的に考えてみて

例えば、

自然数⊂整数

ってことは明らかに「整数 is 自然数」ではないでしょ。
自然数を継承して整数を作る、とう発想がそもそもおかしい。
0907デフォルトの名無しさん (アウアウカー Sa7b-KFFl)
垢版 |
2021/05/11(火) 09:52:12.74ID:FCSidwoba
>>904
実装上の都合で赤青ランプに後付けで黄色を取り付けたのだから、色を表す定数として赤青のenumとは別に黄色の定数を定義することになるのは自然だろう。
それをあたかも三色同格のランプだと見せかけてるんだから、定数についても見かけ上同列に扱うためのenumを新たに定義しなければならないのは仕方ない。設計がいびつなのだから、内部処理的にもいびつになる。
0908デフォルトの名無しさん (ワッチョイ bea7-wGCM)
垢版 |
2021/05/11(火) 10:10:24.00ID:aDB05LmB0
>>907
何言ってるかわかってる?
基底に20個ぐらいステータスあってさらに増え続けてるとき
継承した分だけenumに同じステータスを追加しまくれっていってんだよ
継承10も20もやったら大変だぞ
もう実際はハードごと20種類以上追加しないといけなくてやってられないから
俺はenumはゴミと切り捨てたけどね
0912デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
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){ ...}
と使いまわすことはできる
0916デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/11(火) 11:14:32.61ID:FWZS8iTBF
>enumはゴミ

知ってた
0917デフォルトの名無しさん (ワッチョイ 0b2f-C7Xb)
垢版 |
2021/05/11(火) 11:18:15.50ID:m6WVK0Xg0
>>895
不変っていうのは、実行時に変わらないって意味じゃないぞ
修正/機能追加でも変わらないってことだ
結論としては自分で書いてる通り
>今後継承を行う可能性が少しでもあるならそのクラスではenumは一切使えない
だよ。Enum継承したいってことはつまり変更したいってことだから

Color.RedやColor.BlueはEnumじゃないだろ
まあSystem.Drawing.Colorは構造体で継承できなかった気がするけど
そんな感じで作っとけ
0919デフォルトの名無しさん (ワッチョイ a662-W8a5)
垢版 |
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 | 黄
}
0923デフォルトの名無しさん (アウアウウー Sa1f-dxvU)
垢版 |
2021/05/11(火) 14:27:53.86ID:7X7kMfyca
>>919
enumの利点はコンパイル時に名前の集合を型として定義できる、
名前の集合が確定していて、だからインテリセンスが使えたり
集合に含まれないはずの名前が使われている間違いをコンパイル時に検出できることなので
それは代用にならんでしょ。

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

部分集合を再利用して上位集合を定義したいって問題意識は分からんでもないけど、
emumなんてただの名前の集合なんだからそういう場合はコピペ継承するのが多分正解。
0925デフォルトの名無しさん (ブーイモ MMd6-D3Lk)
垢版 |
2021/05/11(火) 14:40:19.26ID:/TD/rkCHM
C#や諸々の言語はそもそも、継承の仕様が出来損ないなんだよね
Java 16みたいにSealed Classを定義できるなら、まだしもねぇ

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

だからサブクラスを限定する仕組みが必要なのだが…
C#はまだまだ、遅れてるね
0928デフォルトの名無しさん (ワッチョイ a662-W8a5)
垢版 |
2021/05/11(火) 15:07:01.36ID:9XfnnIxq0
自分ならカスタム属性と拡張メソッド作って、集合.Hoge.Colors()で一覧を取れるようにするかな
まあケースバイケース

enum 集合{
[AddColor(Color.赤, Color.青)]
Hoge,
[InheriteColor(集合.Hoge)]
[AddColor(Color.黄)]
Hoge2
}
0929デフォルトの名無しさん (ワッチョイ be2c-5KFm)
垢版 |
2021/05/11(火) 15:14:49.86ID:Fjpe2RX80
>>927
そっちじゃなくて継承できる型を限定する機能だね
ShapeインターフェイスをRectangleクラスとCircleクラスのみ実装可能にする
他の奴がTriangleクラスを作ってShapeを実装するのは認めない
0931デフォルトの名無しさん (ワッチョイ 2a01-Yqly)
垢版 |
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を使うべきユースケースじゃないからできなくて当たり前なんだけどさ
0932デフォルトの名無しさん (ワッチョイ 2fb0-DjaX)
垢版 |
2021/05/11(火) 16:18:03.82ID:qWgZ839v0
>>896
文字列の雛形をDBに持たせて、パラメータ部分を置換して出力するみたいなことやってたのよ
『置換して出力』部分を$使う挿入文字列で置き換えられたらいいなって夢想した

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

string.format使えばいいだけなんだけどね
0933デフォルトの名無しさん (テテンテンテン MMe6-I8iA)
垢版 |
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));
みたいな使い方するほうがいいんじゃ
0934デフォルトの名無しさん (エムゾネ FF8a-dxvU)
垢版 |
2021/05/12(水) 09:24:40.12ID:HCx7UYF5F
プラごみを減らすためにレジ袋有料化するって話と似てるな
そもそもピントがずれてるし前提も可笑しい
0944デフォルトの名無しさん (ブーイモ MM5b-M3SR)
垢版 |
2021/05/14(金) 12:32:54.76ID:o+OksdyUM
アンスコあかんの?
0945デフォルトの名無しさん (アウアウクー MM23-Wdz7)
垢版 |
2021/05/14(金) 12:45:33.90ID:4kCY9pobM
今まで記載がずっとなくて、同じMicrosoftの子会社が出してるStylecopっていうコード解析ツールの言ってることなら正しいだろうって風潮だったんだけど逆転敗訴した感じ
0950デフォルトの名無しさん (アウアウウー Sa1d-JrGs)
垢版 |
2021/05/14(金) 14:00:51.83ID:E7dr4uiDa
>>942
さすがにアホなガイドラインでほとんど同意は得られない気がする。
バッキングフィールド限定なら少なくとも俺は賛成するけど。

まあ、普通のフィルドもバッキングフィールドも出番減ってるから
どうでもいいと言えばどうでもいいかも
0953デフォルトの名無しさん (アウアウウー Sa1d-JrGs)
垢版 |
2021/05/14(金) 14:16:07.40ID:E7dr4uiDa
しかし、_でプリフィクスしとくとインテリセンスでフィールドが一覧できて便利だよ、
ってコメントは泣けてくるねw

普通逆じゃないかw
インテリセンスの候補に登場して欲しくない奴を_でプリフィクスするのが普通のセンスだと思うけど。
0954デフォルトの名無しさん (ワッチョイ 1fb0-sort)
垢版 |
2021/05/14(金) 14:36:58.65ID:idb/Si4k0
>>953
そのコメントどこに書いてある?


ところで別の話なんだけど、
とあるデータの集計や加工をメソッドチェーンで書きたい考えと、その集計や加工をデータとは別のクラスかつステートレスで書きたい考えって両立できるのかな?
拡張メソッド使うくらい?
0956デフォルトの名無しさん (ワッチョイ cb68-gSvD)
垢版 |
2021/05/14(金) 19:49:54.05ID:xeRYEvYS0
オセロのプログラム作っています。
オセロが盤面にの上にくると影を描きたいのですが
これはフォームアプリでできますか?
0958デフォルトの名無しさん (ブーイモ MMe1-6eZC)
垢版 |
2021/05/14(金) 20:03:38.54ID:7vyBBBSUM
>>956
半透明の影を書き込んだ画像と影なしの画像の2種類を用意しといて切り替えたらいい
それ以上を求めるならFormsなんか捨ててちゃんとゲーム作りとしてUnityとかに再入門した方がいいよ
0959デフォルトの名無しさん (スププ Sdd7-Ratl)
垢版 |
2021/05/14(金) 20:38:27.45ID:8fzMB91td
>>956
あくまでもWinFormでやるならGDI+っていう機能を調べて、
円をキャンバスに描けばオセロ程度のアプリケーションを作るのは楽かもね。
そりゃあ本気でゲーム作るならUnityだろうけど、
オセロの内容にこだわるなら、コンソールで十分なんだけど。
0970デフォルトの名無しさん (アウアウウー Sa1d-JrGs)
垢版 |
2021/05/14(金) 22:05:44.68ID:d3AihMu6a
>>968
キャメルとスネークの差異は単語の区切り方にあると思うけど、フィールド(メンバー)にmつけるのは
ハンガリアンだと思うので本来はちょっと別物だよね。

>>967
確かに人間には適応能力があるので基本的にはその通りだけど、
それでも優劣の差がないというのも欺瞞だとは思う
あるとしてもどうでもいい程度の差だろ?はいその通りですw
0973デフォルトの名無しさん (テテンテンテン MM17-Wcp/)
垢版 |
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でしか書いてないから分からん
0978デフォルトの名無しさん (ラクッペペ MM17-JFKK)
垢版 |
2021/05/15(土) 13:45:45.41ID:Q8PHpDoBM
すまん
0985デフォルトの名無しさん (ワッチョイ f1da-Wdz7)
垢版 |
2021/05/15(土) 20:00:50.49ID:x5z5lzlG0
一般的にって根拠を示しにくいけど、Microsoft公認のコーディングルールって言うとStylecopが示しているキャメルケースしかありえないんだよな
mHogeやm_Hogeは論外で今回の更新によって_Hogeが台頭したけど
0988デフォルトの名無しさん (ワッチョイ 6dda-gSvD)
垢版 |
2021/05/15(土) 21:55:57.08ID:P/ScDIg90
いま入門書で勉強中の初心者です
コードは基本的に上から下に処理されていくと理解しているのですが
本に出てくるサンプルコードは呼び出す側のあとに呼び出される側のコードが書かれていることが多くてしっくりきません
何か理由があるのでしょうか?
0993デフォルトの名無しさん (アウアウエー Sa93-PbQN)
垢版 |
2021/05/15(土) 22:39:14.46ID:Tm9lZ4XLa
>>988
呼び出し元を上から下に進んで
呼び出し先に亜空間ワープして
呼び出し先を上から下に進んで
呼び出し先が終わったらまた亜空間ワープで呼び出し元に戻って
呼び出し元をまた上から下に進む
0997デフォルトの名無しさん (アウアウウー Sa1d-gSvD)
垢版 |
2021/05/16(日) 02:38:29.44ID:sFLeX0L5a
前方参照が不可でプロトタイプ宣言が必要だったのは単に当時の技術的な制約に過ぎず
本質的な物じゃないと思うよw

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

一か所からしか呼ばれないメソッドがあるとき、呼ばれる側のメソッドを呼ぶ側より上の行に
書きたがる人がいるし気持ちは分からんでもないけど、そんなのあくまで好みの問題。どーでもいいよそんなの、が正解。
0998デフォルトの名無しさん (ワッチョイ 8925-fy9k)
垢版 |
2021/05/16(日) 05:34:08.17ID:fcFZ09AZ0
最近の言語だとどこでも関数宣言できるし、かと言って関数内だと一番下で宣言した関数を上で使えるって訳でもない場合もあるからね
トップレベルの処理は言語仕様によって分けられていることを理解するのは最初は結構大変なもんだ
0999デフォルトの名無しさん (ワッチョイ 1301-tI/9)
垢版 |
2021/05/16(日) 09:15:56.70ID:RjyUN9Py0
>>988
呼び出される側のあとに呼び出す側のコードが書かれていても
> コードは基本的に上から下に処理されていくと理解しているのですが
ならしっくり来なくね?
Pythonみたいに動的に関数定義したいということかな?
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を超えています。これ以上書き込みはできません。

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