ホームページ  >  記事  >  バックエンド開発  >  オブジェクト指向 PHP の 5 つの主要原則であるリスコフ置換原則 (LSP) の詳細な説明

オブジェクト指向 PHP の 5 つの主要原則であるリスコフ置換原則 (LSP) の詳細な説明

不言
不言オリジナル
2018-04-08 09:43:422024ブラウズ

この記事では、PHP の 5 つのオブジェクト指向原則のうち、リスコフ置換原則 (LSP) を主に紹介し、リスコフ置換原則 (LSP) の概念と原理をより詳細に分析し、PHP のリスコフ置換原則 (LSP) を分析します。例の形で)、必要な友人はそれを参照できます

この記事では、PHP の 5 つのオブジェクト指向原則のうちのリスコフ置換原則 (LSP) を例とともに説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

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

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

1. LSP の内容

Liskov Substitution Principle (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、アクセラレータなどのさまざまなメカニズムでキャッシュを実装する必要がある場合は、この抽象クラスを継承し、その抽象メソッドを実装するだけで済みます。

LSPのコードは機能だけでなく、手話の意味も含みます。考えてみてください。白い馬は馬の代わりになります。牛も労働力として使われますが、馬の代わりになるでしょうか。ハイヒールも靴です。男性がハイヒールを履いても大丈夫ですか?

関連する推奨事項:

PHP の 5 つのオブジェクト指向原則のうち、オープンクローズ原則 (OCP) の詳細な説明

PHP オブジェクト指向の継承コンストラクター

インターフェイス分離原則の詳細な説明(ISP) PHP の 5 つのオブジェクト指向原則

以上がオブジェクト指向 PHP の 5 つの主要原則であるリスコフ置換原則 (LSP) の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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