![](https://s.togetter.com/static/web/img/placeholder.gif)
リスコフ置換原則への取り組み(続々、Birthday改めBirthdate問題、もしくは、僕たちはフインキで型安全している)
-
Tanaka9230
- 7354
- 16
- 0
- 0
![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスの比較 - (保存用) 檜山正幸のキマイラ飼育記 メモ編 m-hiyama-memo.hatenablog.jp/entry/20160923…
2019-09-14 02:10:55![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスの悪いお薬 - (保存用) 檜山正幸のキマイラ飼育記 メモ編 m-hiyama-memo.hatenablog.jp/entry/20160924…
2019-09-14 02:11:33![](https://s.togetter.com/static/web/img/placeholder.gif)
ECMAScriptのclass, 「インスタンスメソッド」が継承されるだけでなく、「クラスメソッド」も継承される仕組みだけど、クラスXのクラスメソッドがコンストラクタの場合 () => X のような型を持ち、型Xは共変の位置にあるから、健全に継承することはできない。
2019-09-14 02:16:08![](https://s.togetter.com/static/web/img/placeholder.gif)
配列がイミュータブルなら、型パラメタは共変(X <: Y ⇒ Array<X> <: Array<Y>)だけど、配列がミュータブルだと不変になる。
2019-09-14 02:19:05![](https://s.togetter.com/static/web/img/placeholder.gif)
イミュータブルなオブジェクトで、バイナリメソッドを考えないなら、メソッドの継承はうまく行きます。現実はオブジェクトはミュータブルだしバイナリメソッドが存在するので、継承はうまくいかない。
2019-09-14 02:20:30![](https://s.togetter.com/static/web/img/placeholder.gif)
オブジェクトが共変の位置に来るメソッド(オブジェクトを返すメソッド)は、むしろサブクラスのメソッドをスーパークラスが継承するべきだ、ということにならない?
2019-09-14 02:23:20![](https://s.togetter.com/static/web/img/placeholder.gif)
円や楕円が静的なオブジェクトであるなら「円の集合⊂楕円の集合」だ。 しかし、「円の範囲で変形するオブジェクトの集合⊂楕円の範囲で変形するオブジェクトの集合」はなりたたない。 円というオブジェクトと、円の範囲で変形するオブジェクトは異なるオブジェクトなのだ。
2019-09-14 02:30:39![](https://s.togetter.com/static/web/img/placeholder.gif)
オブジェクトが反変の位置に来るからスーパークラスで定義したメソッドをそのまま継承できる、そうでないなら継承できないという構造を理解していないから、円-楕円問題で消耗すると思ってるんだけど
2019-09-14 02:34:10![](https://s.togetter.com/static/web/img/placeholder.gif)
サブクラスの関係って、言語によってセマンティクスが違っているだろうし、ちゃんとどういうセマンティクス上で議論しますよ、と宣言してからじゃないと厳しそう
2019-09-14 02:36:28![](https://s.togetter.com/static/web/img/placeholder.gif)
確かなのは、サブタイプ関係(その特殊例としてのサブクラス関係)とメソッドの継承関係の話をごっちゃにするせいで、よく分からんことになっているということ。
2019-09-14 02:40:23![](https://s.togetter.com/static/web/img/placeholder.gif)
サブタイプの概念はメソッドの継承の概念とは異なるものだし、サブクラスという概念を使っていると、それがサブタイプを意図しているのか、メソッドの継承を意図しているかが混同し、パラドックスになってしまう。
2019-09-14 02:43:54![](https://s.togetter.com/static/web/img/placeholder.gif)
昨日の一連の議論の中で、あー頭が硬くなってるなーって思ったのは別にLSPを使わなければいけない訳ではなく、その原則を受け入れる(制約を課す)ことで、設計が良くなるのであればそうするし、別の方法で良くすることができればそっちを使えばいいだけだし、それは継承ですらないかもしれないし
2019-09-14 06:34:37![](https://s.togetter.com/static/web/img/placeholder.gif)
設計原則があるから使う、ではなく、使えば有効ならば使おうって話で、それが円と楕円みたいな抽象度が高いお題の方がよりそうゆう訓練になるなーって
2019-09-14 06:39:10![](https://s.togetter.com/static/web/img/placeholder.gif)
@kawasima General - Special は汎化の関係なので継承で表現される気がしますが、設計としては筋が悪いって感じですかね? もう一歩踏み込んで、円と楕円を同一に扱う要件は何かに着目して抽象型を抽出するって感じですかね。 ilclubdellesei.blog/2017/08/17/sol…
2019-09-14 07:12:38![](https://s.togetter.com/static/web/img/placeholder.gif)
@ymasuda_ is-aの関係性は、いくつか分類できて、継承が適さないものがあるって感じですかね。昨晩の議論は色々考えさせられたので、私なりの考えをまとめて記事にしようと思ってます。
2019-09-14 07:50:47![](https://s.togetter.com/static/web/img/placeholder.gif)
@tanakahisateru @sugimoto_kei @magnolia_k_ @polidog @tenjuu99 「そういう問題もあるよと知ってはいても、不完全性に妥協する方が都合いいこともある」僕もこのスタンスがとても好きです。僕が今まで思ってたことがうまく言語化されている。
2019-09-14 08:05:46![](https://s.togetter.com/static/web/img/placeholder.gif)
基底型が具象クラスで単体でインスタンス化可能な時、それを引数にとるメソッドがその派生型を期待することがありえるのかどうかはほぼアプリケーションによるし、LSPには違反してるけど別に不都合はないよねってのは考え方としてアリだと思う。
2019-09-14 08:07:49![](https://s.togetter.com/static/web/img/placeholder.gif)
言い換えると、具象クラス継承は実装の継承であって型の継承ではないって割り切る(こともある)ってことかな。traitみたいなのが機能として存在する原義の場合はそれを使うだろうし。
2019-09-14 08:10:12