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