放送大学のプログラミングの授業とリスコフ置換原則
itpro.nikkeibp.co.jp/article/COLUMN… 「inheritance is not subtyping」「継承とis-a関係を混同してはいけない」(便乗ステマ)
2015-02-02 14:21:24@__obake @haruyama 横から失礼します。講義では、点→円→楕円という継承関係を扱っていましたが、これは継承の設計原則であるリスコフの置換原則に反するものになっています。たとえばこの場合、円クラスで定義される半径を返すメソッドは楕円クラスでは何を返すべきでしょうか?
2015-02-02 14:52:03もう一回言いますけど便乗ステマとか冗談抜きに「inheritance is not subtyping」「継承とis-a関係を混同してはいけない」itpro.nikkeibp.co.jp/article/COLUMN… で、それはオブジェクト指向(の継承)自体の本質的難点です!
2015-02-02 18:45:30何となく風の息づかいを感じるので念のため、継承でリスコフの置換原則を守ろうとしたら、少なくともisEqualToみたくselftypeを引数とするメソッドは禁止するしかないので、「継承でリスコフの置換原則」はそもそも制限つきでしか成り立たないです
2015-02-02 19:46:17LSPの話を持ち出すとそもそも入門としてどうなんだみたいな話になりそうだったので、Rubyに対する説明としてあきらかに間違ってる箇所の指摘と、動作だけ説明して利点を説明しないのは講義としてよくないと思うという意見だけです > 送ったメールの内容
2015-02-02 20:07:54Liskovの置換原則が話題のようなので、つ web.cse.ohio-state.edu/~neelam/course… いや、置換原則とか一言で説明されるけどもっと面白い話なんだよと言いたいのでこの論文ことあるごとに話題に出す
2015-02-02 20:56:24@esumii Objectを頂点とする型システムじゃなくて、class Equality[A]{ def eq(x: A, y: A): Boolean } StringEquality extends Equality[String] { def .... } みたいな感じ
2015-02-02 21:04:38@kmizu あ、はい、適当に省略しちゃっててすみません。そういうインターフェースの継承っぽいのがHaskellの型クラスだと思います(たぶん)
2015-02-02 21:45:55.@kmizu 実装の継承の例で楕円が円のサブクラスになってて議論が。円-楕円問題とか名前がついてるぐらい微妙な問題なので紛糾しています:-)
2015-02-02 22:24:36何の必要があって円クラスと楕円クラスを定義するのか考えれば自ずと答えはわかるし要求なしに設計だけあってもどうしようもねーべ派です
2015-02-02 23:00:07ところで、リスコフの置換原則は、*当然*、メソッドの事前条件、事後条件、クラス不変条件(+α(ややこしいので省く))が明らかになってないと満たしてるかどうか確かめられないので、まずその辺考えませう。
2015-02-02 23:15:11放送大学長 知識の問題はもちろんありますが, 授業用のテキストを書いてまともな人に査読してもらわなかった(ないしもらえなかった)のがやばいですね.
2015-02-03 09:22:08@__obake @haruyama その場合、半径を返すメソッドを使って円の面積を求める処理を書くと、楕円に対しては誤った結果が返るようになると思いますが、どうでしょう?
2015-02-03 10:13:16楕円クラスと言ったところで意味が一意に定まるわけでなし、どのようなインタフェースなのかを明示すべきである。横に伸ばす操作が可能だったら真円クラスのスーパークラスにはなれないし、最長部の半径を返すメソッドしかないなら継承可能
2015-02-03 13:35:45確かに違反しますね。この件、ちょっと勉強させていただきます。 @athos0220 @__obake @haruyama その場合、半径を返すメソッドを使って円の面積を求める処理を書くと、楕円に対しては誤った結果が返るようになると思いますが、どうでしょう? #放送大学
2015-02-03 13:42:13@__obake @athos0220 @haruyama いわゆる,Ellipse-Circle Dilemmaというやつですね.この場合,overrideすればOK.
2015-02-03 15:04:37