ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[OOP] リスコフの置換原則

 
『アジャイルソフトウェア開発の奥義』でリスコフの置換原則が引用されているが、翻訳に不備がある。
ここで望まれるのは、次の述べるような置換可能な性質である:S型のオブジェクト o1 の各々に対応する T 型のオブジェクト o2 が 1つ存在し、 T を使って定義されたプログラム P に対して o2 の代わりに o1 を使っても P の振る舞いが変わらない場合、 S は T の派生型であると言える。

アジャイルソフトウェア開発の奥義 初版第5刷
第10章 リスコフの置換原則(LSP) 144頁

以下は原文である。
Liskov Substitution Principle

What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.

BarbaraLiskov, Data Abstraction and Hierarchy, SIGPLAN Notices, 23,5 (May, 1988).
http://c2.com/cgi/wiki?LiskovSubstitutionPrinciple

all programs と強調した点については、上の翻訳では言及されていない。正しい翻訳(下線部)は「T を使って定義されたすべてのプログラム P」となる。この「all」という言及はこの原則の重要なポイントである。

わかりにくいので、少し噛み砕いていえば、

リスコフの置換原則に則るとき、子クラスのオブジェクトは、親クラス用のすべてのプログラムで動作する。

となる。注意が必要なのは、親クラスの或る"特定の"プログラムで、子クラスのオブジェクトが動作したからといって、リスコフの置換原則に則ってるとは限らないこと。また、子クラス用のプログラムは、親クラスのオブジェクトに対しては、動作しなくともよい(動作しないのが普通)。

リスコフの置換原則について、Wikipedia に記された契約プログラミングの節を読まれたし。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87

[Windows] Why is not the WM_KEYDOWN message generated?

 
WM_CHAR, WM_DEADCHAR, WM_KEYDOWN, WM_KEYUP, WM_SYSCHAR, WM_SYSDEADCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP のいすれかのメッセージが、生成されないなら、他のアプリケーションにキーボードメッセージをフックされている可能性がある。グローバルフックを使えば、すべてのアプリケーションのメッセージを横取りできる。
SetWindowsHookEx で登録されるフックプロシージャ(e.g.  KeyboardProc, LowLevelKeyboardProc) のなかで CallNextHookEx 関数を呼ばずに 0以外の値でリターンすると、各アプリケーションには、関連するメッセージが転送されない。

not generated not created送られてこない 作成されない 発生しない 送信されない。