C#, C♯, C#相談室 Part98 (518レス)
C#, C♯, C#相談室 Part98 http://mevius.5ch.net/test/read.cgi/tech/1719656321/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
199: デフォルトの名無しさん (オイコラミネオ MMab-InQL) [sage] 2024/12/11(水) 18:36:49.06 ID:SiVbJLlPM 初期に頭のいい人は一番先に varに飛び移った その後みんな気が付いて移行した 今でも使わないのはご老人 http://mevius.5ch.net/test/read.cgi/tech/1719656321/199
200: デフォルトの名無しさん (ワッチョイ 475a-NyP9) [sage] 2024/12/11(水) 19:15:48.68 ID:Rq12mde/0 varばかりやわ http://mevius.5ch.net/test/read.cgi/tech/1719656321/200
201: デフォルトの名無しさん (ワッチョイ 7f2a-7Ydj) [] 2024/12/11(水) 20:38:24.59 ID:pwnGkEKD0 VBのVariant最強 http://mevius.5ch.net/test/read.cgi/tech/1719656321/201
202: デフォルトの名無しさん (オイコラミネオ MMab-InQL) [sage] 2024/12/11(水) 20:41:39.44 ID:SiVbJLlPM それはないかなw http://mevius.5ch.net/test/read.cgi/tech/1719656321/202
203: デフォルトの名無しさん (ワッチョイ 476d-Ahcx) [] 2024/12/11(水) 23:21:13.31 ID:uq+uLBFl0 インターフェース分離の原則が分からない 「必要のない振る舞いを実装しない」のは適切だと思うんだけど、ポリモーフィズムとの組み合わせが悪いように思う 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 である可能性がある」という情報に依存してるのに少し違和感があって、より綺麗な解決策があれば知りたい http://mevius.5ch.net/test/read.cgi/tech/1719656321/203
204: デフォルトの名無しさん (ワッチョイ e701-5/pq) [sage] 2024/12/12(木) 00:16:45.29 ID:7oNgfo0K0 c#スレですよ http://mevius.5ch.net/test/read.cgi/tech/1719656321/204
205: デフォルトの名無しさん (ワッチョイ 47d7-InQL) [sage] 2024/12/12(木) 08:54:59.88 ID:ZQ0BgCqv0 そこを別々のインターフェースとして分離するのが間違ってるだでは 飛べる飛べないも”鳥”の一要素でしょ http://mevius.5ch.net/test/read.cgi/tech/1719656321/205
206: デフォルトの名無しさん (ワッチョイ df2b-2fXw) [sage] 2024/12/12(木) 08:59:12.98 ID:cbjQHW3y0 プロパティで持てば解決 http://mevius.5ch.net/test/read.cgi/tech/1719656321/206
207: デフォルトの名無しさん (ワッチョイ 476d-Ahcx) [] 2024/12/12(木) 09:20:56.04 ID:m/Fq7DtI0 >>206 Nullableな IFrayable? をプロパティとして持たせて、飛ぶ鳥の場合はthisを返すようにするということ? http://mevius.5ch.net/test/read.cgi/tech/1719656321/207
208: デフォルトの名無しさん (ワッチョイ 47d7-InQL) [sage] 2024/12/12(木) 09:43:51.10 ID:ZQ0BgCqv0 そこだけのインターフェース化に拘るなって言ってんだよ http://mevius.5ch.net/test/read.cgi/tech/1719656321/208
209: デフォルトの名無しさん (ワッチョイ 476d-Ahcx) [] 2024/12/12(木) 10:34:43.14 ID:m/Fq7DtI0 鳥とペンギンだと近すぎて例えとして微妙だった 例えば「動物のリスト」のようなデータを持ち、動物には鳥のように飛べるクラス (Flyメソッドを持つ) と、トラやライオンのように走るクラス (Runメソッドを持つ) があるといった場合 動物の一覧を持つには List<IAnimal> のような型を使うと思うけど、これは合ってるよね? その上で動物によって違うアクションを行わせたいとする IAnimal側に CanFly のようなメソッドを追加していくと、例えばサルのように「道具を使う動物」が後から追加された場合、IAnimalにメソッド追加が必要になり、それはBirdなどの各クラスにも影響する Birdクラスは「道具を使う」なんてことは知らないのに、インターフェースのために CanUseTool のようなメソッドを後から追加するのは違う気がする そうするとやっぱインターフェース分離の形になりそうで、そうなると利用側で is でキャストするのが落としどころなのかと http://mevius.5ch.net/test/read.cgi/tech/1719656321/209
210: デフォルトの名無しさん (ワッチョイ 47d7-InQL) [sage] 2024/12/12(木) 13:06:06.44 ID:ZQ0BgCqv0 鳥以外にも飛ぶ(正確には滑空だが滞空することに変わりはない)動物は居るし 鳥だって地面をRunするヤツは居る 鳥にも、猿程でなくてもその辺に落ちてる物を道具的に使うヤツも居る お前の例題がそもそもめちゃくちゃなんだよ http://mevius.5ch.net/test/read.cgi/tech/1719656321/210
211: デフォルトの名無しさん (ワッチョイ 47d7-InQL) [sage] 2024/12/12(木) 13:06:59.82 ID:ZQ0BgCqv0 あといい加減余所でやれ C#直接関係ない http://mevius.5ch.net/test/read.cgi/tech/1719656321/211
212: デフォルトの名無しさん (ワッチョイ 4793-Ahcx) [] 2024/12/12(木) 17:51:32.06 ID:pRQ+cocj0 ここの住人はC#を使っていてSOLID原則に悩まされたことなど無いのだろうか http://mevius.5ch.net/test/read.cgi/tech/1719656321/212
213: デフォルトの名無しさん (ガックシ 06eb-7Ydj) [] 2024/12/12(木) 18:08:37.64 ID:A8Z2cdQL6 >>203 ある動物が飛べることと、鳥であることは独立なんだから、 「飛べる鳥がいる」という情報はなくても仕方なくない? 統計的な相関関係はあるかもしれないが、包含関係でないなら仕方ない。 飛べる他の動物を無視するのなら、IBirdを継承したインタフェースでIFlyableBirdを作ればいいのでは? http://mevius.5ch.net/test/read.cgi/tech/1719656321/213
214: デフォルトの名無しさん (ワッチョイ 474b-Ahcx) [] 2024/12/12(木) 18:40:52.28 ID:m/Fq7DtI0 ISP自体はC#でよく出てくる問題じゃないの? これなんかまさにそう https://dev.to/fabriziobagala/interface-segregation-principle-452m だけどこういった解説はISP単体の説明になっていて、泳ぐ、走るといった能力の異なるものを Animal として抽象化する方法を教えてくれない 綺麗な方法でなくても「C#ではこうすることが多い」のようなプラクティスがあれば知りたかったんだけど、そういうのは無さそうなんですかね http://mevius.5ch.net/test/read.cgi/tech/1719656321/214
215: デフォルトの名無しさん (ワッチョイ bf79-/9Tr) [sage] 2024/12/12(木) 19:18:32.74 ID:j5Bpxje00 実装を伴わない抽象化の話ってなんの身にもならないからやめなさい それとインターネットサービスプロバイダの話は他所でやってくれ http://mevius.5ch.net/test/read.cgi/tech/1719656321/215
216: デフォルトの名無しさん (ワッチョイ 7f10-InQL) [sage] 2024/12/12(木) 19:18:50.89 ID:F/GYmEjD0 求めてそうなプラクティスは見た事ないなぁ 個人的には、飛ぶにしても走るにしても動物という存在の態様のひとつだから 動物IFのプロパティに含めるでいいんじゃないかと思うけどね http://mevius.5ch.net/test/read.cgi/tech/1719656321/216
217: デフォルトの名無しさん (ワッチョイ 7f95-AGOF) [] 2024/12/12(木) 19:36:28.62 ID:uARXvv9l0 var unko = new Unko() より Unko unko = new() の方が良くね? http://mevius.5ch.net/test/read.cgi/tech/1719656321/217
218: デフォルトの名無しさん (ワッチョイ bf79-/9Tr) [sage] 2024/12/12(木) 19:46:48.91 ID:j5Bpxje00 もっと地球規模の視野で考えろよ うんこも地球の一部だろ?つまりうんこは地球とも言える わかるか? http://mevius.5ch.net/test/read.cgi/tech/1719656321/218
219: デフォルトの名無しさん (ワッチョイ 7f10-InQL) [sage] 2024/12/12(木) 19:55:04.36 ID:F/GYmEjD0 >>217 まぁ、後者ができるようになったの後になってからだから http://mevius.5ch.net/test/read.cgi/tech/1719656321/219
220: デフォルトの名無しさん (ワッチョイ bf01-aPXN) [sage] 2024/12/12(木) 22:38:48.07 ID:VQmaeBIU0 >>214 それISP単体の説明にもなってない class Penguin : IAnimalにNotImplementedExceptionでFly()を実装すれば即ISP違反だというのは間違い まずは原典にあたってISPを理解してきたほうがいい 謳われてる原則をどう活用するかはその後 http://mevius.5ch.net/test/read.cgi/tech/1719656321/220
221: デフォルトの名無しさん (ワッチョイ df2b-2fXw) [sage] 2024/12/12(木) 22:49:28.08 ID:cbjQHW3y0 そもそも そんな鳥のプログラムなんか一般的じゃねーし http://mevius.5ch.net/test/read.cgi/tech/1719656321/221
222: デフォルトの名無しさん (ワッチョイ 474b-Ahcx) [] 2024/12/12(木) 22:59:54.30 ID:m/Fq7DtI0 >>220 「クライアントが『泳ぐ、飛ぶ、もしくは走る動物』として使うことを想定するのなら、そのインターフェースであるIAnimalにその情報を含めるのは適切」ということですかね class Penguin としては Fly や Run などのメソッドの実装はノイズに思えるけど、IAnimalとして使われるなら、その契約に従えという感じかな (それだと後から「道具を使う」がIAnimalに追加された際に Penguine もメソッド追加が必要で、そこがモヤモヤしてる) こういう場合にアダプタ (ラッパー?) を使うのって適切? 純粋に Penguine としての機能を提供するクラスと、それを IAnimal として使うためのアダプタみたいなの それだと更に複雑さを増すだけ? OOP難しい…… http://mevius.5ch.net/test/read.cgi/tech/1719656321/222
223: デフォルトの名無しさん (ワッチョイ df2b-2fXw) [sage] 2024/12/12(木) 23:02:07.06 ID:cbjQHW3y0 適切とか とりあえず作ればよくね? 適切かどうかなんてエグゼにしたら関係なくね? それとも論点だけ考えて実際のプログラム作らないの? それ何したいの http://mevius.5ch.net/test/read.cgi/tech/1719656321/223
224: デフォルトの名無しさん (ワッチョイ df6a-B4jd) [sage] 2024/12/12(木) 23:31:52.39 ID:RbZTiiBk0 例が不適切だから混乱してるだけにしか見えないなぁ http://mevius.5ch.net/test/read.cgi/tech/1719656321/224
225: デフォルトの名無しさん (ワッチョイ ff70-Ahcx) [] 2024/12/12(木) 23:50:28.74 ID:cAk5An+50 SOLIDが現実のコードで使われなかったり、「オブジェクト指向は問題を複雑にするだけ」みたいなことを言われる原因 http://mevius.5ch.net/test/read.cgi/tech/1719656321/225
226: デフォルトの名無しさん (ワッチョイ 6714-oAsD) [sage] 2024/12/13(金) 01:16:53.76 ID:sFncMVeV0 >>203 インターフェース分離の原則は「クラスが必要としないメソッドを実装しない」ってだけ ペンギンのような飛べない鳥が IFlyable を実装しないのは正しい あとは「飛べる鳥」をインターフェースで分かるようにしてやればいい isを使う羽目になったのは飛べるかどうかわからない IBirdをListにしてるから --- interface IBird { string Name { get; } } interface IFlyable : IBird { void Fly(); } // ペンギンは飛べない class Penguin : IBird { public string Name => "Penguin"; } // ワシは飛べる class Eagle : IFlyable { public string Name => "Eagle"; public void Fly() => Console.WriteLine($"{Name} is flying!"); } // 飛べる鳥だけを扱うリストを作る List<IFlyable> flyableBirds = new List<IFlyable> { new Eagle() }; foreach (var bird in flyableBirds) { bird.Fly(); // 明示的に飛べる鳥しか扱わない } http://mevius.5ch.net/test/read.cgi/tech/1719656321/226
227: デフォルトの名無しさん (ワッチョイ e701-5/pq) [sage] 2024/12/13(金) 01:54:21.75 ID:aJRVKPMX0 こいつら病気なんか http://mevius.5ch.net/test/read.cgi/tech/1719656321/227
228: デフォルトの名無しさん (ワッチョイ df2b-2fXw) [sage] 2024/12/13(金) 01:55:37.37 ID:0Vp4NoOf0 だね http://mevius.5ch.net/test/read.cgi/tech/1719656321/228
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 290 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.015s