Praktische Analyse des PHP-Liskov-Substitutionsprinzips

php中世界最好的语言
Freigeben: 2023-03-26 08:42:02
Original
1314 Leute haben es durchsucht

Dieses Mal werde ich Ihnen eine praktische Analyse des PHP-Liskov-Substitutionsprinzips geben. Was sind die Vorsichtsmaßnahmen bei der Verwendung des PHP-Liskov-Substitutionsprinzips?

Das Substitutionsprinzip wurde von Frau Liskov vom MIT Computer Science Laboratory in einem Artikel auf der OOPSLA-Konferenz im Jahr 1987 vorgeschlagen. Es geht hauptsächlich auf einige Prinzipien im Zusammenhang mit der Vererbung ein und wird daher als Liskov-Substitutionsprinzip bezeichnet.

Im Jahr 2002 veröffentlichte Robert C.Martin ein Buch mit dem Titel „Agile Software Development Principles Patterns and Practices“, in dem er das Liskov-Substitutionsprinzip schließlich in einem Satz vereinfachte: „Subtypen müssen für ihre Basistypen ersetzbar sein.“ (Unterklassen müssen durch ihre Basistypen ersetzt werden können.)

1. Inhalt von LSP

Liskov-Substitutionsprinzip, die Definition und Hauptidee von LSP ) sind wie folgt: Da die Vererbung in der objektorientierten Programmiertechnologie in der spezifischen Programmierung zu einfach ist, haben wir beim Entwurf und der Programmierimplementierung vieler Systeme nicht ernsthaft und rational darüber nachgedacht, ob die Vererbungsbeziehung zwischen verschiedenen Klassen im Anwendungssystem angemessen ist, ob die abgeleitete Klasse einige Methoden in ihrer Basisklasse korrekt überschreiben kann usw. Daher kommt es häufig zu einem Missbrauch der Vererbung oder einer falschen Vererbung, was große Probleme bei der späteren Wartung des Systems mit sich bringt. Dies erfordert, dass wir ein Gestaltungsprinzip befolgen, nämlich das Ersetzungsprinzip.

LSP weist darauf hin, dass Unterklassentypen ihre übergeordneten Typen ersetzen und überall dort erscheinen müssen, wo die übergeordnete Klasse erscheinen kann. Es zeigt uns, wie man Code korrekt erbt und ableitet und sinnvoll wiederverwendet. Dieses Prinzip besagt, dass, wenn eine Software-Entität eine Basisklasse verwendet, diese auf ihre Unterklassen angewendet werden muss, und dass der Unterschied zwischen Basisklassenobjekten und Unterklassenobjekten überhaupt nicht erkannt werden kann. Denken Sie darüber nach, ähnelt es dem Konzept des Polymorphismus?

2. LSP basiert hauptsächlich auf dem Designprinzip der Vererbung

Da Vererbung und Ableitung ein Hauptmerkmal von OOP sind, können sie die wiederholte Programmierimplementierung von Code reduzieren. Dadurch wird die Systemcode-Wiederverwendung in der Anwendung realisiert, aber wie kann man die Vererbung richtig gestalten und den Vererbungsmechanismus rational anwenden?

Das ist das Problem, das LSP lösen möchte:

Wie gestaltet man die Vererbung richtig?

Wie erhält man die beste Vererbungshierarchie?

Wie kann verhindert werden, dass die entworfene Klassenhierarchie in eine Situation gerät, die nicht den OCP-Prinzipien entspricht?

Wie lässt sich dieses Gestaltungsprinzip einhalten?

1) Alle Methoden der übergeordneten Klasse müssen in der Unterklasse implementiert oder neu geschrieben werden, und die abgeleitete Klasse implementiert nur die in ihrer abstrakten Klasse deklarierten Methoden und sollte keine redundanten Methodendefinitionen oder -implementierungen geben

2) In Client-Programmen sollten anstelle von Unterklassenobjekten direkt nur übergeordnete Klassenobjekte verwendet werden, damit eine Laufzeitbindung (dynamischer Polymorphismus) erreicht werden kann.

Wenn die Klassen A und B gegen das Design von LSP verstoßen, besteht der übliche Ansatz darin, eine neue abstrakte Klasse C als Oberklasse der beiden konkreten Klassen zu erstellen und so die gemeinsamen Verhaltensweisen von A und B nach C zu verschieben Lösung des Problems, dass die Verhaltensweisen von A und B nicht vollständig konsistent sind.

Die Unterstützung von PHP für LSP ist jedoch nicht gut, es mangelt an Konzepten wie der Aufwärtstransformation und kann nur durch einige umständliche Methoden erreicht werden. Auf dieses Prinzip wird hier nicht näher eingegangen.

Das Folgende ist eine Cache-Implementierungsschnittstelle, die abstrakte Klassen als Basisklassen verwendet und LSP folgt, um ihr Design zu implementieren.

<?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);
}
Nach dem Login kopieren

Wenn Sie nun das Caching unter verschiedenen Mechanismen wie Dateien, Memcache, Beschleuniger usw. implementieren müssen, müssen Sie nur diese abstrakte Klasse erben und ihre abstrakten Methoden implementieren.

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Detaillierte Erklärung der Schritte zum Hochladen mehrerer Bilder mit Bootstrap+PHP

PHP+Session to Verhindern Sie wiederholte Formularübermittlungsschritte. Detaillierte Erklärung

Das obige ist der detaillierte Inhalt vonPraktische Analyse des PHP-Liskov-Substitutionsprinzips. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage