リスコフ置換原則への取り組み(続々、Birthday改めBirthdate問題、もしくは、僕たちはフインキで型安全している)

「俺がリスコフだ!」「バーバラ・リスコフさんは女性ですね」「LSP違反!」
5
前へ 1 ・・ 5 6 8 次へ
Ryusei @mandel59

負の可変性って何……

2019-09-14 02:09:01
Ryusei @mandel59

共変/反変/不変という用語を理解しているか

2019-09-14 02:09:24
Ryusei @mandel59

型クラスの比較 - (保存用) 檜山正幸のキマイラ飼育記 メモ編 m-hiyama-memo.hatenablog.jp/entry/20160923…

2019-09-14 02:10:55
Ryusei @mandel59

型クラスの悪いお薬 - (保存用) 檜山正幸のキマイラ飼育記 メモ編 m-hiyama-memo.hatenablog.jp/entry/20160924…

2019-09-14 02:11:33
Ryusei @mandel59

ECMAScriptのclass, 「インスタンスメソッド」が継承されるだけでなく、「クラスメソッド」も継承される仕組みだけど、クラスXのクラスメソッドがコンストラクタの場合 () => X のような型を持ち、型Xは共変の位置にあるから、健全に継承することはできない。

2019-09-14 02:16:08
Ryusei @mandel59

配列がイミュータブルなら、型パラメタは共変(X <: Y ⇒ Array<X> <: Array<Y>)だけど、配列がミュータブルだと不変になる。

2019-09-14 02:19:05
Ryusei @mandel59

イミュータブルなオブジェクトで、バイナリメソッドを考えないなら、メソッドの継承はうまく行きます。現実はオブジェクトはミュータブルだしバイナリメソッドが存在するので、継承はうまくいかない。

2019-09-14 02:20:30
Ryusei @mandel59

オブジェクトが共変の位置に来るメソッド(オブジェクトを返すメソッド)は、むしろサブクラスのメソッドをスーパークラスが継承するべきだ、ということにならない?

2019-09-14 02:23:20
Ryusei @mandel59

円や楕円が静的なオブジェクトであるなら「円の集合⊂楕円の集合」だ。 しかし、「円の範囲で変形するオブジェクトの集合⊂楕円の範囲で変形するオブジェクトの集合」はなりたたない。 円というオブジェクトと、円の範囲で変形するオブジェクトは異なるオブジェクトなのだ。

2019-09-14 02:30:39
Ryusei @mandel59

厳密な集合論を論じる場面ではともかく、ラフな議論では集合とクラスはそんなに区別されてない……素朴集合論……

2019-09-14 02:31:28
Ryusei @mandel59

オブジェクトが反変の位置に来るからスーパークラスで定義したメソッドをそのまま継承できる、そうでないなら継承できないという構造を理解していないから、円-楕円問題で消耗すると思ってるんだけど

2019-09-14 02:34:10
Ryusei @mandel59

ちょっと自分でも混乱してきてるな

2019-09-14 02:34:35
Ryusei @mandel59

サブクラスの関係って、言語によってセマンティクスが違っているだろうし、ちゃんとどういうセマンティクス上で議論しますよ、と宣言してからじゃないと厳しそう

2019-09-14 02:36:28
Ryusei @mandel59

副作用がある場合とない場合で違う……

2019-09-14 02:37:21
Ryusei @mandel59

ちょっと話が循環していて、どっちを基準にして話していくべきなのかが困ってしまうな……

2019-09-14 02:37:39
Ryusei @mandel59

確かなのは、サブタイプ関係(その特殊例としてのサブクラス関係)とメソッドの継承関係の話をごっちゃにするせいで、よく分からんことになっているということ。

2019-09-14 02:40:23
Ryusei @mandel59

サブタイプの概念はメソッドの継承の概念とは異なるものだし、サブクラスという概念を使っていると、それがサブタイプを意図しているのか、メソッドの継承を意図しているかが混同し、パラドックスになってしまう。

2019-09-14 02:43:54
magnoliak🍧 @magnolia_k_

昨日の一連の議論の中で、あー頭が硬くなってるなーって思ったのは別にLSPを使わなければいけない訳ではなく、その原則を受け入れる(制約を課す)ことで、設計が良くなるのであればそうするし、別の方法で良くすることができればそっちを使えばいいだけだし、それは継承ですらないかもしれないし

2019-09-14 06:34:37
magnoliak🍧 @magnolia_k_

設計原則があるから使う、ではなく、使えば有効ならば使おうって話で、それが円と楕円みたいな抽象度が高いお題の方がよりそうゆう訓練になるなーって

2019-09-14 06:39:10
ますごん @ymasuda_

@kawasima General - Special は汎化の関係なので継承で表現される気がしますが、設計としては筋が悪いって感じですかね? もう一歩踏み込んで、円と楕円を同一に扱う要件は何かに着目して抽象型を抽出するって感じですかね。 ilclubdellesei.blog/2017/08/17/sol…

2019-09-14 07:12:38
kawasima@99卒 @kawasima

@ymasuda_ is-aの関係性は、いくつか分類できて、継承が適さないものがあるって感じですかね。昨晩の議論は色々考えさせられたので、私なりの考えをまとめて記事にしようと思ってます。

2019-09-14 07:50:47
すえなみ @a_suenami

@tanakahisateru @sugimoto_kei @magnolia_k_ @polidog @tenjuu99 「そういう問題もあるよと知ってはいても、不完全性に妥協する方が都合いいこともある」僕もこのスタンスがとても好きです。僕が今まで思ってたことがうまく言語化されている。

2019-09-14 08:05:46
すえなみ @a_suenami

基底型が具象クラスで単体でインスタンス化可能な時、それを引数にとるメソッドがその派生型を期待することがありえるのかどうかはほぼアプリケーションによるし、LSPには違反してるけど別に不都合はないよねってのは考え方としてアリだと思う。

2019-09-14 08:07:49
すえなみ @a_suenami

無秩序にそれをやると危険だけど(そのための設計原則)。

2019-09-14 08:08:18
すえなみ @a_suenami

言い換えると、具象クラス継承は実装の継承であって型の継承ではないって割り切る(こともある)ってことかな。traitみたいなのが機能として存在する原義の場合はそれを使うだろうし。

2019-09-14 08:10:12
前へ 1 ・・ 5 6 8 次へ