リスコフ置換原則への取り組み(続々、Birthday改めBirthdate問題、もしくは、僕たちはフインキで型安全している)
- Tanaka9230
- 7279
- 16
- 0
- 0
そうじゃなければ楕円を継承して円を定義するなんてこと絶対しなくて、両者共通の基底型を抽象として定義するし、なんなら必要な振る舞いだけインターフェースに切り出すよねー、と。
2019-09-14 08:22:15@kawasima 最近、この手の議論をよく目にし、色々考えさせられます。 思考訓練にもなるし、他人の考えに触れ、より深く考えられる気がします。 記事楽しみにしてます。
2019-09-14 09:01:35楕円と真円はGeneralとSpecialですが、これを(リスコフ的な)派生関係とみることには問題がないです。問題は、「引き伸ばせる楕円」の派生型であるような「引き伸ばせる円」をうまく定義出来ないこと。でもこれは問題ではない。「引き伸ばせる円」という概念が我々の日常的直観に合わないだけです。 twitter.com/Tanaka9230/sta…
2019-09-14 09:54:52この通りだとしたら、 根本的に、「猫 is a 動物」でOOを語ったら、どっかーんだ。 twitter.com/kawasima/statu…
2019-09-13 22:57:44リスコフの置換原則は、あくまで、2つの型(抽象データ型)の関係について語っている。それを実装継承の話(Abstract-Concrete)と混ぜると、意味がわからなくなると思いますね。
2019-09-14 09:59:42経験則として、イミュータブルなクラスAとBの間に直感的に派生関係が成立しても、それぞれのミュータブルな相方MA,MBの間に派生関係が成立しない(または成立させるのに工夫がいる)ケースは普通にありますよね。AとMA、BとMBの概念が違うからなので、リスコフ置換原則違反ではないと思います。
2019-09-14 10:09:49リスコフの置換原則、(我々が考えるような、実装継承を伴う)継承の話ではなく、型の派生についての話なんで、継承において、それがどんな意味を持つのかを理解するには一ひねりいる。Javaなどでいうインターフェースの拡張には素直に適用できる。そっちから理解を始めた方がスジがいい。
2019-09-14 10:31:29昨日のLSPの議論。原典にいろいろ書いてある気がする。 ちゃんと読まなきゃいけないな… reports-archive.adm.cs.cmu.edu/anon/1999/CMU-…
2019-09-14 11:50:22TLのどこかで見かけた、LSPとimmutabilityとの関係が全く分かってない。難しい。 型の間の代入可能性と、インスタンスの不変性って、かなり直交したものではないかしらん。多少の制御をできるような場合もあるかもしれないけれど、本質的な相関があるように思えないのだけど。はて。 だれか……。
2019-09-14 12:28:12@MinoDriven なのですよー。 たまたまうまく組合せがはまって効果があった、もしくは、効果があったわけでなく偽の相関があるように見えているだけで。直観的には、一般化はできないのではないかという。
2019-09-14 12:35:53@hirodragon112 楕円クラスと円クラスの派生関係をどっちからどっちにするかでLSP違反になるけれど、不変にして (回転とかの操作で) 操作後の別オブジェクトを返すようにすれば LSP違反にならないのでは、みたいな主張だったように思うのだけど、寝ぼけながら意識朦朧としつつだったので、あれ、どういうことだっけ(←
2019-09-14 13:06:37@n_siena あ、念のための確認ですがここで書いてるLSPはリスコフさんの事で合ってますか? いや、念のためw
2019-09-14 13:08:26@n_siena なるほど。 ありがとうございます! 断片情報なので捉えきれてないかもですが、そ派生関係をどっちと定義するかは、そのコンテキストにおいて必要な抽象が何か次第で決まりそうですね。 派生は抽象の具体化だと思うので。 それを不変に~あたりはこの情報だけだと趣旨がまだよくわからなかったですw
2019-09-14 13:19:08@hirodragon112 LSP的には、(型階層に埋め込まれるべきクラス階層である言語では) 下位型のインスタンスの集合は上位型のそれの部分集合でなければならないので、大抵は、 楕円 <|-- 円 でしょうねー。あえて真円を別クラスにしなければならないのだとしたら。 不変性の話はまるで分かってないので、ぼすけて……。
2019-09-14 13:30:32@n_siena なんか、楕円の定義を知らなかったのでさっき見てみたら、2点からの和が等しい点の集合って事だったのでその2点が同じ場所であれば正円、そうでなければ楕円ともとれるぽいんですよね。 んで円は一点からの距離が等しい...なので、これを見ると ○ 円 is a 楕円 × 楕円 is a 円 に見えますね
2019-09-14 13:36:35@hirodragon112 そうそう。数学的位は円の定義はその通りで、結果的に、長径と短径が同じ特殊な楕円のことなのです。 # だっせんにのる
2019-09-14 13:40:01リスコフ置換原則自体は、派生型とは何かを定義しているだけで、とてもシンプルなんだけど、それにまつわる人々の受け止めには色んな要素が含まれていて、それのほうが却って興味深い。
2019-09-14 15:07:44Java の extends や implements に限らず、色んなプログラミング言語の機構は、ゆるやかにリスコフ置換原則に基づいているけれど、それを保証するものでも、強制するものでもない。そういう現実を受けて、リスコフ置換原則に違反するが設計上受け入れられるパターン、みたいなものが生じ得る。
2019-09-14 15:11:14コプリエン氏のいう「負の可変性」もそういうものであると理解している。リスコフ置換原則にもとづく整然とした構造に開いた「破れ目」。そんな破れ目が逆に、新しい世界理解への道を暗示している、ということを、氏は言いたかったんじゃなかろうか。想像だけど。
2019-09-14 15:15:41