[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2ch.scのread.cgiへ]
Update time : 12/26 14:53 / Filesize : 130 KB / Number-of Response : 563
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

C#, C♯, C#相談室 Part98



1 名前:デフォルトの名無しさん mailto:sage [2024/06/29(土) 19:18:41.95 ID:NohAfdfx0.net]
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

■Visual Studio 2022 Community(無償の統合開発環境)等はこちら
www.visualstudio.com/downloads/

■コードを貼る場合はこちら
ideone.com/

■前スレ
C#, C♯, C#相談室 Part97
https://mevius.5ch.net/test/read.cgi/tech/1671585518/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

122 名前:デフォルトの名無しさん mailto:sage [2024/10/04(金) 23:53:09.57 ID:qaeIDBN+0.net]
こんなのじゃあかんのん?

C#で自分だけのメモ帳を作成してみよう!手順・方法を徹底解説します
https://www.sejuku.net/blog/102177

ググったら一分も掛からないで出たけど

123 名前:デフォルトの名無しさん mailto:sage [2024/10/05(土) 13:21:11.69 ID:AAO+SKFS0.net]
>>122
サンクスです、丁寧に書いてあってわかりやすいのですが
設定項目を変更した時の設定反映のタイミングとか
form2からform1にデータ持っていく場合とか
やり直し機能とか
うまい人はどうやって全体まとめてるのかなって

124 名前:デフォルトの名無しさん mailto:sage [2024/10/05(土) 16:55:01.99 ID:WPvPgesDM.net]
必要な部分だけ他人のコードを読むか自分でひたすら考えて実装してトライアンドエラー

どちらも地力が格段に上がるけど中級者は避けがち

125 名前:デフォルトの名無しさん mailto:sage [2024/10/05(土) 17:35:53.95 ID:iTplU71b0.net]
それメモ帳というかエディタで大変な箇所を全部端折った記事だから
適当な公開されてるソース読んだ方がいいね

126 名前:デフォルトの名無しさん (ワッチョイ 7fd1-mKKC) mailto:sage [2024/10/05(土) 20:37:56.54 ID:fkWv7ZOM0.net]
その適当なのほしいって事やろな

ここの連中は冷たいから教えないんだよね

127 名前:デフォルトの名無しさん mailto:sage [2024/10/05(土) 22:47:10.24 ID:AAO+SKFS0.net]
メモ帳とかの作者さんでソース公開されてる人もC++が多かったり

128 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 08:44:42.11 ID:6ToZA1R70.net]
長大なテキストファイルの先頭から文字数を数えたり
一行の長さを測定して画面右端の折返し位置を決定したり
そういうのって現実的に可能なのか?

129 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 09:02:55.59 ID:efCavYAy0.net]
>>128
発想がズレてる

130 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 12:41:06.92 ID:RTiROZJD0.net]
>>128
逆になんで不可能だと思うの?



131 名前:デフォルトの名無しさん (ワッチョイ 9bfe-ecvX) mailto:sage [2024/10/06(日) 13:11:45.32 ID:k/Za2WiE0.net]
普通は穴あきバッファを使う
EZ/VZはlessに編集機能を付けるってユニークな設計をしている
設計自体を知りたいなら 「The Craft of Text Editing: Emacs for the Modern World」が参考になるかと

FINALはdumpすると、MIFESとREDの悪口が書いてある:-p

132 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 14:14:27.86 ID:onWt8ZIM0.net]
「穴あきバッファ」なんて初見なんだけどもしかして誤訳じゃない?

133 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 14:18:43.02 ID:vkebIpm90.net]
エディタのバッファ管理用のデータ構造は効率的な編集をサポートするためで
文字数カウントや行の折り返しの話はどういうデータ構造を使うかとはほとんど関係ないよね

今はGap Bufferもあまり主流じゃなくてPiece TableかRopeが使われることが多くなってる

134 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 14:21:17.70 ID:vkebIpm90.net]
興味があれば↓この辺読んでみるといい
TypeScriptだしC++に比べるとわかりやすいはず
https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation

この辺の話はエディタのコアな部分ではあるけど
>>123の知りたいこととはほぼ関係ない

135 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 15:19:51.19 ID:6ToZA1R70.net]
なにかの文書を画面に表示したい
← 表示したい部分が何行目に当たるか計算する
← 一行に含まれる文字数を知りたい
← プロポーショナルフォントのときはどうするん?
← 行の長さを測定する関数使え
← 一文字ずつ足したり引いたりしながら測定を繰り返す
← 全部の行についてこれやんなきゃかよ?
← やってられない

136 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 18:49:45.21 ID:TXz4j2F10.net]
azukiのソースコード見れば?

137 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 18:57:38.47 ID:I3D2t/Zs0.net]
>>135
>← 表示したい部分が何行目に当たるか計算する
テキストファイルなら頭から読み込むしかなく改行でカウントアップするだけ

>← 一行に含まれる文字数を知りたい
>← プロポーショナルフォントのときはどうするん?
文字数によって折り返し位置が決まるか
表示幅によって折り返し位置が決まるかのどちらか
両方のルールを同時に適用するというのは一般的ではない
プロポーショナルフォントが関係してくるのは後者の場合のみ

表示幅で折り返す場合は指定したRectangleにフィットするよう
よろしくやってくれる表OS提供のAPIがあるので基本的にはそれを使う
APIの内部的では各文字の表示幅を足し算してるが
とりあえずは画面表示部分だけを計算すればいいので
思ってるほど大した計算量ではない

>← やってられない
んなことたぁない

138 名前:デフォルトの名無しさん mailto:sage [2024/10/06(日) 20:12:16.90 ID:MCn4L0pH0.net]
そもそも公開されてるソースがC++多いからなんだというのか

139 名前:デフォルトの名無しさん mailto:sage [2024/10/07(月) 02:48:29.36 ID:x7sAaviV0.net]
>←
それより矢印の使い方おかしくね?と思った

140 名前:デフォルトの名無しさん mailto:sage [2024/10/07(月) 06:41:02.52 ID:5XNBqMZ+0.net]
→えっ



141 名前:デフォルトの名無しさん mailto:sage [2024/10/07(月) 07:51:22.02 ID:W61JLdXH0.net]
矢印 Unicode(ユニコード)一覧 文字 0g0.org
https://0g0.org/topic/arrows/

142 名前:デフォルトの名無しさん mailto:sage [2024/10/07(月) 08:50:05.33 ID:D9AWyaeE0.net]
↑↑↓↓→→←←

143 名前:デフォルトの名無しさん mailto:sage [2024/10/07(月) 20:30:46.78 ID:0ozgkte7M.net]
個人レベルで作るなら別にベストな方法じゃなくても良い
とりあえず作ってみたらいい
そして徐々にブラッシュアップしていけばいい

144 名前:デフォルトの名無しさん mailto:sage [2024/10/08(火) 02:42:19.62 ID:xQWM8K5Vd.net]
どうせTextBoxかRichTextBox使うから
いちいち行の文字数数えて改行とかという発想がでてこなかったわ
毒されてるんだろうか

145 名前:デフォルトの名無しさん [2024/10/08(火) 09:46:02.12 ID:5xpr1xvYF.net]
質問者の作りたい物に行番号やカーソル位置座標とか要らなさそうだから
テキストボックスで十分だと思う

146 名前:デフォルトの名無しさん mailto:sage [2024/10/09(水) 03:08:11.25 ID:w53uZCE9d.net]
行列番号、文字数、ファイルサイズ、ドラッグ移動、カラー絵文字、正規表現検索&置換、折り返し
これぐらい欲しい

147 名前:デフォルトの名無しさん (ワッチョイ 5af9-7zav) mailto:sage [2024/10/09(水) 05:37:10.40 ID:u99M/+800.net]
こりゃ確かにいろいろと発想がズレてるな

148 名前:デフォルトの名無しさん mailto:sage [2024/10/10(木) 01:43:13.48 ID:9oubSm9f0.net]
カラー絵文字ってどうやるんだろう

149 名前:デフォルトの名無しさん [2024/10/10(木) 01:45:48.53 ID:l5e/OliZ0.net]
どうとは?
もしかしてわざわざ白黒にしてるのか?

150 名前:デフォルトの名無しさん [2024/10/10(木) 02:14:45.51 ID:To6qDb1x0.net]
くるみぽんちおの刑だ!!



151 名前:デフォルトの名無しさん mailto:sage [2024/10/10(木) 14:48:43.23 ID:9oubSm9f0.net]
まじかテキストボックスがカラー絵文字に対応したのか
週末試してみるわありがと

152 名前:デフォルトの名無しさん mailto:sage [2024/10/11(金) 00:26:48.51 ID:zClzE2L70.net]
win11で作ったformアプリがwin10で盛大にズレてて頭抱えてる

153 名前:デフォルトの名無しさん mailto:sage [2024/10/11(金) 01:05:53.43 ID:bny4Xk3b0.net]
>>152
何をもってOSに起因する症状だと判断したの?

154 名前:デフォルトの名無しさん mailto:sage [2024/10/11(金) 06:58:29.47 ID:tH3T8XD80.net]
OSバージョン毎のフレームサイズの差異とか気にもせずに処理でも書いたか?

155 名前:デフォルトの名無しさん [2024/10/11(金) 08:01:38.38 ID:v/PLCR+10.net]
OS関係なく単にディスプレイのスケーリングの違いでは

156 名前:デフォルトの名無しさん mailto:sage [2024/10/11(金) 09:18:43.20 ID:izME7MQN0.net]
それだな

157 名前:デフォルトの名無しさん mailto:sage [2024/10/11(金) 09:50:54.30 ID:wAOvgD780.net]
フォントとか配置とかやり直しはMacOSのあるあるだと思ってた

158 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 02:25:35.38 ID:SQ8zGBXh0.net]
ライブラリを使用するために下みたいなコード書いた
ライブラリ内でIHoge.Method();の機能を上書きしたいのとHogeで設定されるさまざまな機能を使いたいがためにIHogeを実装したHogeクラスを継承してMethod();を隠蔽、そのうえでライブラリから呼び出されるようにIHogeをさらに継承?実装させてる

ちょっと無理矢理感強いけどこれはアリですか?

ライブラリの中

IHOGE.Method();


public interface IHoge
{
public void Method();
}
public class Hoge : IHoge
{
public void Method()
{
元の処理
}
}

自前で作ったクラス
public class NewHage : Hoge,IHoge
{
public new void Method()
{
上書き処理←やりたいこと
}
}

159 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 02:45:34.93 ID:SQ8zGBXh0.net]
>>121
亀レスだけどすごいのあったぞ
中身見てないけど多分お前が望んでるやつだと思う
https://sumiox.com/cs-windowsorm-mynote/

160 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 08:25:43.38 ID:451kbP4c0.net]
>>158
Hoge.Methodにvirtual
NewHage.Methodでoverride



161 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 12:38:44.14 ID:1/IbrF450.net]
>>158
それがやりたいことなら別にいいんじゃね?

Hogeの他のメソッドがMethod()を呼ぶとか
Method()がHogeの他のメソッドを呼ぶとかの関係が出てくると
newを使わない場合に比べるとバグるリスクが高くなるような気はする

インターフェース+コンポジションにしておけばバグるリスクは低くなる
その代わりに多少書く手間がかかる

162 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 12:53:33.54 ID:bUjh45Ks0.net]
>>160
Hogeはライブラリの中の実装だからvirtualにできないのつらみ
>>161
なるほどありがとう

163 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 12:35:56.21 ID:SqPRTKfI0.net]
newで上書きしたことないな

164 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 19:02:31.64 ID:4SydPJoD0.net]
>>163
なんかchatGPTが教えてくれた

165 名前:デフォルトの名無しさん mailto:sage [2024/10/22(火) 19:03:43.61 ID:4SydPJoD0.net]
てかVisualStudioが教えてくれた
緑波線でnewしてくださいって
public new 戻り値の型 メソッド名

166 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 20:43:06.26 ID:laRxPcH30.net]
ML.NETを試してみたら思いの外お手軽で面白いな
アプリにさくっと組み込めそうだ

167 名前:デフォルトの名無しさん mailto:sage [2024/10/23(水) 21:09:39.51 ID:KLvEEO4T0.net]
>>166
薄い本があるので入手お勧め

168 名前:デフォルトの名無しさん mailto:sage [2024/10/24(木) 06:52:54.39 ID:OBQWEe3S0.net]
.NET MAUIで試したことあるけどWindowsはいけたがAndroidではトレーニングでエラーはいた記憶

169 名前:デフォルトの名無しさん mailto:sage [2024/10/27(日) 08:19:05.51 ID:9uOX0V+f0.net]
>>159
サンクスです、これはすごいな
解説がおおくてわかりやすい
これのソースコードがダウンロードできたらよかったのに

170 名前:デフォルトの名無しさん mailto:sage [2024/11/01(金) 19:03:45.14 ID:lJMjrugG0.net]
CookieってSystem.Text.Jsonでシリアライズ・デシリアラズするとDomainKey変わっちゃってSet-Cookieで同じ名前のクッキー来ても違う奴判定されてダブるんだな
正確に言うと先頭ドット有りだと変わらないのと、BinaryFormatterやNewtonsoft.Jsonで非パブリックフィールド含む全フィールドをそっくりそのままストア・ロードさせれば変わらないんだけど



171 名前:デフォルトの名無しさん mailto:sage [2024/11/14(木) 09:50:27.66 ID:2GoXPHL10.net]
ZipPlaってファイル管理ソフトのソース持ってる人いる?
居たらアップして欲しい

172 名前:デフォルトの名無しさん mailto:sage [2024/11/14(木) 10:20:27.81 ID:WaFHXOHg0.net]
>>171
ぐぐったらGitHubにForkされたのがあるようだぞ
オリジナルからどの程度手が入ってるか知らんけど

173 名前:デフォルトの名無しさん mailto:sage [2024/11/16(土) 02:07:13.59 ID:h+Fv95x40.net]
>>172
自分もそれは見つけたんだけど、何を変えてるのかもハッキリしないんですよね
なのでオリジナル持ってる人が居たらと思いまして

174 名前:デフォルトの名無しさん mailto:sage [2024/12/07(土) 11:39:26.82 ID:ITlUnsCD0.net]
WinFormsってWindowのクラスネーム決められないの?
Win32のFindWindowのClassNameで探させたいのだけど

175 名前:デフォルトの名無しさん (ワッチョイ 3aae-tB/P) mailto:sage [2024/12/07(土) 17:24:39.89 ID:8OMGJvUm0.net]
protectedなCreateParamsプロパティをオーバーライドしてClassNameを書き換えることはできる
独自名ならとりあえずRegisterClassは必要だけどそれだけで済むかどうかは知らん

176 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 10:13:10.77 ID:Rw3oOi650.net]
C#側のプロパティは書き換えられても実際の内部の値はそういうことしないと無理そうか

177 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 11:19:30.20 ID:kkfUSfWy0.net]
RegisterClassExしてやろうとしたことあるけど
CreateParamsでRegisterしたClassName指定してもエラーになって
それで良く分からんまま放棄したな昔

178 名前:デフォルトの名無しさん [2024/12/08(日) 11:24:39.87 ID:I292Dtst0.net]
流行りのAIはその辺何か教えてくれんのか?

179 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 11:42:31.33 ID:gLALr0T30.net]
はい

180 名前:デフォルトの名無しさん (ワッチョイ 47d7-InQL) mailto:sage [2024/12/08(日) 12:16:51.06 ID:9nkQEnF50.net]
人間が垂れ流した知識を混ぜるだけのAIが、人間が知らないことを教えられるわけないだろw



181 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 12:37:03.03 ID:cRlpRIfuM.net]
世界中のどこかで語られたかもしれない事実をそこらの人間がすべて知ってると思うのがおかしい気がする

182 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 17:47:34.90 ID:d7OE/SEZ0.net]
つーかさWin32APIのCreateWindowで作ったウィンドウをC#にAttachする程度基本的な仕組みぐらいあるやろ
あるやろ…

183 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 21:09:31.34 ID:NIwBIUGx0.net]
CSharp初心者が学習始めるなら何からがおすすめ?
多分IIS?使ったウェブアプリになるんだけども
Javaでのアプリ開発経験はあり

184 名前:デフォルトの名無しさん mailto:sage [2024/12/08(日) 21:38:41.73 ID:Dh5r1ipA0.net]
Paint.netのソースを見たまえ

185 名前:デフォルトの名無しさん (ワッチョイ 5f62-oAsD) mailto:sage [2024/12/08(日) 21:46:52.70 ID:NIwBIUGx0.net]
これかな、ありがとちょっと見てみるわ
h
ttps://github.com/paintdotnet

186 名前:デフォルトの名無しさん [2024/12/09(月) 11:14:47.99 ID:uh4vUAM3a.net]
SetWindowLong
SetWindowLongEx

187 名前:デフォルトの名無しさん [2024/12/09(月) 11:15:02.52 ID:uh4vUAM3a.net]
GWL_EX_STYLE

188 名前:デフォルトの名無しさん (ワッチョイ dff4-tB0+) [2024/12/09(月) 13:22:41.09 ID:wWCmXoxS0.net]
科学 + 5ch

【AI】AIはわずか2時間の対話で人間の性格をコピーできる [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1733576027/

コメントに面白いことが書かれている

189 名前:185 mailto:sage [2024/12/09(月) 17:56:14.64 ID:apYLNmO+0.net]
PaintDotNetをインストールした

190 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 06:17:57.42 ID:BgUz4+cQ0.net]
varなんて使うな戦争ってもう終結したの?



191 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 07:27:33.98 ID:DZxIsQuWr.net]
言語によりけりだから

192 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 08:36:42.20 ID:tumrZkmz0.net]
盲目的にvar使うなとは思うけど、一切使うなはないなぁ

193 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 08:50:12.41 ID:AAqkzyDB0.net]
まあマイクロソフトのサンプルにも使ってる例あるしな

194 名前:デフォルトの名無しさん (ラクッペペ MM8f-n9Eh) mailto:sage [2024/12/11(水) 10:05:12.70 ID:BwkZDwjMM.net]
jsのvarと違ってただの便利機能だしな

195 名前:デフォルトの名無しさん (ワッチョイ 476d-Ahcx) [2024/12/11(水) 12:36:15.23 ID:uq+uLBFl0.net]
varで参照型を扱うとnullableになるのはどうにかしてほしい

196 名前:デフォルトの名無しさん (ワッチョイ 87ae-pQ4B) mailto:sage [2024/12/11(水) 13:56:36.44 ID:pPQiPOka0.net]
推論型なんだし、必要に応じて使えばいいんじゃね?
objectならともかく

197 名前:デフォルトの名無しさん (ワッチョイ df6c-Fa9A) mailto:sage [2024/12/11(水) 14:39:24.72 ID:1I783KxU0.net]
varが絶対必要なのって匿名型使うときだけだから、必要に応じて使う、だとvarはほとんど用無しになっちゃう
戦争に参加するつもりはないが仮にvar使うんなら必要に応じてじゃなく基本varにしないと

198 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 14:54:27.03 ID:9MAiYNgK0.net]
c#は基本varでいいよね
多分大体のc#er?はvarじゃないときにだけ理由を気にするんじゃないかな

199 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 18:36:49.06 ID:SiVbJLlPM.net]
初期に頭のいい人は一番先に varに飛び移った
その後みんな気が付いて移行した
今でも使わないのはご老人

200 名前:デフォルトの名無しさん (ワッチョイ 475a-NyP9) mailto:sage [2024/12/11(水) 19:15:48.68 ID:Rq12mde/0.net]
varばかりやわ



201 名前:デフォルトの名無しさん [2024/12/11(水) 20:38:24.59 ID:pwnGkEKD0.net]
VBのVariant最強

202 名前:デフォルトの名無しさん mailto:sage [2024/12/11(水) 20:41:39.44 ID:SiVbJLlPM.net]
それはないかなw

203 名前:デフォルトの名無しさん [2024/12/11(水) 23:21:13.31 ID:uq+uLBFl0.net]
インターフェース分離の原則が分からない
「必要のない振る舞いを実装しない」のは適切だと思うんだけど、ポリモーフィズムとの組み合わせが悪いように思う

interface IBird { string Name { get; } }
interface IFlyable { void Fly(); }

// ペンギンは飛べないので IFlyableを実装しない
class Pengin : IBird { ... }
class Eagle : IBird, IFlyable { ... }

のようにした場合に、プログラムが List<IBird> birds のような形でデータを持つと、「飛べる鳥がいる」という情報が型から消える

foreach (IBird bird in birds) {
 Console.write(bird.Name);
 if (bird is IFlyable flyable) {
  flyable.Fly();
 }
}

「飛べる鳥なら飛ばす」ようにしたい場合、インターフェースを分離する場合だと上記のように is でキャストするしか無さそう?
IBirdで扱っているのに「インスタンスは IFlyable である可能性がある」という情報に依存してるのに少し違和感があって、より綺麗な解決策があれば知りたい

204 名前:デフォルトの名無しさん (ワッチョイ e701-5/pq) mailto:sage [2024/12/12(木) 00:16:45.29 ID:7oNgfo0K0.net]
c#スレですよ

205 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 08:54:59.88 ID:ZQ0BgCqv0.net]
そこを別々のインターフェースとして分離するのが間違ってるだでは
飛べる飛べないも”鳥”の一要素でしょ

206 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 08:59:12.98 ID:cbjQHW3y0.net]
プロパティで持てば解決

207 名前:デフォルトの名無しさん (ワッチョイ 476d-Ahcx) [2024/12/12(木) 09:20:56.04 ID:m/Fq7DtI0.net]
>>206
Nullableな IFrayable? をプロパティとして持たせて、飛ぶ鳥の場合はthisを返すようにするということ?

208 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 09:43:51.10 ID:ZQ0BgCqv0.net]
そこだけのインターフェース化に拘るなって言ってんだよ

209 名前:デフォルトの名無しさん [2024/12/12(木) 10:34:43.14 ID:m/Fq7DtI0.net]
鳥とペンギンだと近すぎて例えとして微妙だった
例えば「動物のリスト」のようなデータを持ち、動物には鳥のように飛べるクラス (Flyメソッドを持つ) と、トラやライオンのように走るクラス (Runメソッドを持つ) があるといった場合

動物の一覧を持つには List<IAnimal> のような型を使うと思うけど、これは合ってるよね?
その上で動物によって違うアクションを行わせたいとする

IAnimal側に CanFly のようなメソッドを追加していくと、例えばサルのように「道具を使う動物」が後から追加された場合、IAnimalにメソッド追加が必要になり、それはBirdなどの各クラスにも影響する
Birdクラスは「道具を使う」なんてことは知らないのに、インターフェースのために CanUseTool のようなメソッドを後から追加するのは違う気がする

そうするとやっぱインターフェース分離の形になりそうで、そうなると利用側で is でキャストするのが落としどころなのかと

210 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 13:06:06.44 ID:ZQ0BgCqv0.net]
鳥以外にも飛ぶ(正確には滑空だが滞空することに変わりはない)動物は居るし
鳥だって地面をRunするヤツは居る
鳥にも、猿程でなくてもその辺に落ちてる物を道具的に使うヤツも居る

お前の例題がそもそもめちゃくちゃなんだよ



211 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 13:06:59.82 ID:ZQ0BgCqv0.net]
あといい加減余所でやれ
C#直接関係ない

212 名前:デフォルトの名無しさん [2024/12/12(木) 17:51:32.06 ID:pRQ+cocj0.net]
ここの住人はC#を使っていてSOLID原則に悩まされたことなど無いのだろうか

213 名前:デフォルトの名無しさん [2024/12/12(木) 18:08:37.64 ID:A8Z2cdQL6.net]
>>203
ある動物が飛べることと、鳥であることは独立なんだから、
「飛べる鳥がいる」という情報はなくても仕方なくない?
統計的な相関関係はあるかもしれないが、包含関係でないなら仕方ない。
飛べる他の動物を無視するのなら、IBirdを継承したインタフェースでIFlyableBirdを作ればいいのでは?

214 名前:デフォルトの名無しさん [2024/12/12(木) 18:40:52.28 ID:m/Fq7DtI0.net]
ISP自体はC#でよく出てくる問題じゃないの?
これなんかまさにそう
https://dev.to/fabriziobagala/interface-segregation-principle-452m

だけどこういった解説はISP単体の説明になっていて、泳ぐ、走るといった能力の異なるものを Animal として抽象化する方法を教えてくれない
綺麗な方法でなくても「C#ではこうすることが多い」のようなプラクティスがあれば知りたかったんだけど、そういうのは無さそうなんですかね

215 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 19:18:32.74 ID:j5Bpxje00.net]
実装を伴わない抽象化の話ってなんの身にもならないからやめなさい
それとインターネットサービスプロバイダの話は他所でやってくれ

216 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 19:18:50.89 ID:F/GYmEjD0.net]
求めてそうなプラクティスは見た事ないなぁ
個人的には、飛ぶにしても走るにしても動物という存在の態様のひとつだから
動物IFのプロパティに含めるでいいんじゃないかと思うけどね

217 名前:デフォルトの名無しさん [2024/12/12(木) 19:36:28.62 ID:uARXvv9l0.net]
var unko = new Unko()

より

Unko unko = new()

の方が良くね?

218 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 19:46:48.91 ID:j5Bpxje00.net]
もっと地球規模の視野で考えろよ
うんこも地球の一部だろ?つまりうんこは地球とも言える
わかるか?

219 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 19:55:04.36 ID:F/GYmEjD0.net]
>>217
まぁ、後者ができるようになったの後になってからだから

220 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 22:38:48.07 ID:VQmaeBIU0.net]
>>214
それISP単体の説明にもなってない
class Penguin : IAnimalにNotImplementedExceptionでFly()を実装すれば即ISP違反だというのは間違い
まずは原典にあたってISPを理解してきたほうがいい
謳われてる原則をどう活用するかはその後



221 名前:デフォルトの名無しさん mailto:sage [2024/12/12(木) 22:49:28.08 ID:cbjQHW3y0.net]
そもそも
そんな鳥のプログラムなんか一般的じゃねーし

222 名前:デフォルトの名無しさん [2024/12/12(木) 22:59:54.30 ID:m/Fq7DtI0.net]
>>220
「クライアントが『泳ぐ、飛ぶ、もしくは走る動物』として使うことを想定するのなら、そのインターフェースであるIAnimalにその情報を含めるのは適切」ということですかね
class Penguin としては Fly や Run などのメソッドの実装はノイズに思えるけど、IAnimalとして使われるなら、その契約に従えという感じかな
(それだと後から「道具を使う」がIAnimalに追加された際に Penguine もメソッド追加が必要で、そこがモヤモヤしてる)

こういう場合にアダプタ (ラッパー?) を使うのって適切?
純粋に Penguine としての機能を提供するクラスと、それを IAnimal として使うためのアダプタみたいなの
それだと更に複雑さを増すだけ?

OOP難しい……






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

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

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