ホームページ >バックエンド開発 >PHPチュートリアル >PHP Liskov 置換原理の実践的な分析

PHP Liskov 置換原理の実践的な分析

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-17 10:45:431355ブラウズ

今回は、PHP Richter 置換原則の実践的な分析をお届けします。PHP Richter 置換原則を使用する際の 注意事項 は何ですか?実際のケースを見てみましょう。

置換原則は、1987 年の OOPSLA 会議の論文で MIT コンピューターサイエンス研究所のリスコフ氏によって提案されました。主に継承に関連するいくつかの原則について詳しく説明されているため、リスコフ置換原則と呼ばれます。

2002 年に、Robert C.Martin は「アジャイル ソフトウェア開発原則のパターンと実践」という本を出版し、その中でリスコフ置換原則を最終的に「サブタイプはその基本タイプに対して置換可能でなければならない」という一文に簡略化しました (サブクラスは

1. LSP の内容

リスコフ置換原理 (LSP) の定義と主な概念は次のとおりです: テクノロジーにおける

オブジェクト指向 プログラミング継承による多くのシステムの設計やプログラミング実装では、アプリケーションシステム内のさまざまなクラス間の継承関係が適切かどうか、派生クラスを正しくオーバーライドできるかどうかなどの問題が真剣かつ合理的に考慮されていません。基本クラス内のいくつかのメソッド。そのため、相続の濫用や不正相続が多発し、その後の制度維持に多大な支障をきたすことになる。これには、置換原則である設計原則に従う必要があります。

LSP は次のように指摘しています: サブクラス型は親クラスを置き換えて、親クラスが出現できる場所であればどこにでも出現できる必要があります。正しく継承および派生し、コードを合理的に再利用する方法について説明します。この原則では、ソフトウェア エンティティが基本クラスを使用する場合、そのクラスはそのサブクラスに適用されなければならないため、基本クラス オブジェクトとサブクラス オブジェクトの違いはまったく検出できません。考えてみてください。これはポリモーフィズムの概念に似ていますか?

2. LSP は主に継承の設計原則を目的としています

継承と派生は OOP の主要な機能であり、コードの繰り返しプログラミング実装を削減し、それによってシステム内でのコードの再利用を実現します。継承を正しく行う 継承メカニズムの設計と適切な適用についてはどうでしょうか?

これが LSP が解決したい問題です:

継承を正しく設計するにはどうすればよいですか?

最高の継承レベルを取得するにはどうすればよいですか?

設計されたクラス階層が OCP 原則に準拠しない状況に陥るのを防ぐにはどうすればよいでしょうか?

では、この設計原則に準拠するにはどうすればよいでしょうか?

1) 親クラスのメソッドはサブクラスで実装または書き換える必要があり、派生クラスはその抽象クラスで宣言されたメソッドのみを実装し、冗長なメソッド定義や実装を与えるべきではありません

2) クライアント側実行時のバインディング (動的ポリモーフィズム) を実現できるように、プログラム内ではサブクラス オブジェクトを直接使用するのではなく、親クラス オブジェクトのみを使用する必要があります。

クラス A と B が LSP の設計に違反している場合、通常のアプローチは、2 つの具象クラスのスーパークラスとして新しい抽象クラス C を作成し、問題を解決するために A と B の共通の動作を C に移動することです。 A と B は完全に一致していません。

ただし、PHP の LSP サポートは良好ではなく、上方変換などの概念が欠けており、いくつかの曲がりくねった方法でのみ実現できます。この原則については、ここでは詳しく説明しません。

以下は、抽象クラスを基底クラスとして使用し、LSP に従ってその設計を実装するキャッシュ実装インターフェイスです。

<?php
abstract class Cache
{
 /**
  * 设置一个缓存变量
  * @param $key 缓存key
  * @param $value 缓存内容
  * @param int $expire 缓存时间(秒)
  * @return boolean 是否缓存成功
  */
 public abstract function set($key, $value, $expire = 60);
 /**
  * 获取一个已经缓存的
  * @param $key 缓存key
  * @return mixed 缓存内容
  */
 public abstract function get($key);
 /**
  * 删除一个已经缓存的变量
  * @param $key 缓存key
  * @return boolean 是否删除成功
  */
 public abstract function del($key);
 /**
  * 删除全部缓存变量
  * @return boolean 是否删除成功
  */
 public abstract function delAll();
 /**
  * 检测是否存在对应的缓存
  * @param $key 缓存key
  * @return boolean 是否存在
  */
 public abstract function has($key);
}

ファイル、memcache、アクセラレータなどのさまざまなメカニズムでキャッシュを実装する必要がある場合は、この抽象クラスを継承し、その抽象メソッドを実装するだけで済みます。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

Bootstrap+PHPを使用して複数の画像をアップロードする手順の詳細な説明

フォームの繰り返し送信を防ぐためのPHP+Session

以上がPHP Liskov 置換原理の実践的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。