[過去ログ] Rust part24 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
703: デフォルトの名無しさん [sage] 2024/07/10(水) 00:33:23.92 ID:L/ekmjSC(1/2) AAS
>>701701(2): デフォルトの名無しさん [] 2024/07/10(水) 00:10:24.05 ID:HryWiaEt(1/4) AAS
過去に見た (rust以外の) プロジェクトの失敗例だと
・もともとFooというクラスがあった
・新しく作るBooクラスについて、Fooクラスと同じように扱えれば既存コードをあまり変更しなくても済むぞ!と誰かが気づいた
・その人物は Foo クラスのメソッドを元に IFoo インタフェースを定義し、それを Foo と Boo に実装させた
ことから混沌としたコードが生まれた例がある
この失敗をやらかした人は、Rustでも同じように「既存の Rectangle クラスを元に IRectangle トレイトを作り、それを Rectangle と Square に実装させる」ことをやりかねない
Rustではそれが不自然なパターンになりやすいし、起こりにくくはあるけど、本質的には設計の問題
それらインタフェースやトレイトを用いている時点でLSPの対象外となっている
LSPを満たす必要がないどころかそんな制限があったら支障が出る
>>691691(7): デフォルトの名無しさん [] 2024/07/09(火) 22:57:23.83 ID:/lHavWP5(1) AAS
>>685
リスコフの置換原則は設計的な原則だから言語仕様で違反を防ぐことはできないぞ
悪名高い長方形・正方形の問題はトレイトがあっても起こり得る
trait Rectangle {
fn set_width(&mut self, width: i32);
fn set_height(&mut self, height: i32);
fn width(&self) -> i32;
fn height(&self) -> i32;
fn area(&self) -> i32 { self.width() * self.height() }
}
struct Square { len: i32 }
impl Rectangle for Square {
fn set_width(&mut self, width: i32) { self.len = width; }
fn set_height(&mut self, height: i32) { self.len = width; }
fn width(&self) -> i32 { self.len }
fn height(&self) -> i32 { self.len }
}
fn func(x: &mut impl Rectangle) {
x.set_width(3);
x.set_height(4);
// xが長方形であれば以下が成り立つはずだが、Square型を渡された場合に失敗する
assert!(x.area() == 12);
}
のコードをLSP違反例として出してきたのは明確に間違い
おバカな設計例としてならば理解する
704(1): デフォルトの名無しさん [sage] 2024/07/10(水) 00:35:49.38 ID:L/ekmjSC(2/2) AAS
>>702702(1): デフォルトの名無しさん [] 2024/07/10(水) 00:29:11.77 ID:HryWiaEt(2/4) AAS
「Rustを書く人はみんな賢いからそのような問題は起こさないはずだ」というなら話は別たけど
実装者の設計能力は言語仕様によって担保できるものではない
おバカな設計を言語仕様で防げるなんて主張は誰もしていない
あなたが勘違い思い込みで暴走している
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.059s