Polymorphie Verletzungen des Liskovschen Substitutionsprinzips

Was ist der am wenigsten schlimme Weg, das LSP zu verletzen?

  • Man verletzt das LSP nicht. Niemals.

    Stimmen: 0 0,0%
  • Nur wenn es nicht anders geht - Unit Tests helfen

    Stimmen: 0 0,0%
  • Es muss eine Exception geworfen werden, wenn die Subklasse den Contract nicht einhalten kann.

    Stimmen: 0 0,0%
  • Anderes, siehe Antwort im Thread

    Stimmen: 1 100,0%

  • Anzahl der Umfrageteilnehmer
    1

Tobse

Top Contributor
Ich bin bisher der festen Überzeugung, dass ein Verletzen des LSP "worst practice" (im Gegensatz zu best practice) ist - das Desaster ist nur eine Frage der Zeit.

Nun habe ich aber gerade die Situation, dass mir keine Wahl bleibt, außer das LSP zu verletzen um ein noch viel Größeres Desaster abzuwenden.

Daher die Umfrage.

------

Zur konkreten Problemstellung:
Ich arbeite an einer Applikation, welche die GSA (Google Search Appliance) on Premise nutzt. In c.a. einem Jahr wird diese Hardware vermutlich sämtlichen Dienst verweigern. Wenn wir nicht auf einen anderen Dienst umsteigen und das tatsächlich eintritt, sind 500.000 Menschen massiv in ihrer Arbeit eingeschränkt.

Der fachliche Code ist auf Gedeih-und-Verderb mit der GSA verheiratet. Meine Aufgabe während der letzten Zeit war es nun, den Code zu refactoren, damit wir innerhalb von 1 - 2 Wochen (inkl. QA u.s.w) auf einen anderen Anbieter wechseln können, wenn uns danach ist. Das Problem ist aber, dass die möglichen Such-Server (bspw. Solr, ElasticSearch) für das Feature-Set, welches wir für die Anwendung benötigen, das LSP nicht erfüllen. Zwar nur subtil, aber dennoch. Die Unterschiede sind nicht per Code abbildbar.

Ich versuche aktuell diese Edge-Cases zu detektieren damit eine aussagekräftige Exception geworfen werden kann. Bspw "Die GSA unterstütz die Konstellation aus A, C und Y nicht. Siehe https://link.zur/dokumentation/der/gsa#12385125".
Glücklich bin ich damit aber nicht.
 

Thallius

Top Contributor
Ist vielleicht etwas weit hergeholt aber irgendwie ist es das gleiche Problem:

Wir hatten einmal ein ähnliches Problem und zwar als wir ein Betriebssystem portieren mussten auf eine Hardware die nicht alle Hardware Componenten der alten Hardware hatten. Wir haben damals tatsächlich alle Hardware exceptions abgefangen und dann die nicht vorhandene Hardware nach und nach durch Software abgebildet bis alles wieder funktionierte.

Kannst du in diesem Fall nicht genauso vorgehen? Wenn eine Anfrage kommt die der neue Anbieter nicht abbilden kann löst du eine Exception aus und diese kann man dann nach und nach in anderem Code abbilden. Am Anfang kommt dann halt öfter mal eine "geht nicht" beim User an aber das wird nach und nach dann besser.

Gruß

Claus
 

thecain

Top Contributor
Der Link geht nicht.
Logischerweise... schau ihn dir doch an...

Ich würde eine Mischung aus dem Exceptions und den Unit Tests empfehlen. Wenn möglich die Testabdeckung noch erhöhen, solange das alte System noch läuft, dann nach der Umstellung die Tests laufen lassen.

Schnittstellentests können hierbei auch sehr hilfreich sein, also eher das Verhalten der Schnittstelle testen, als den Code direkt (Blackbox Tests). Dadurch weisst du nach der Umstellung auch direkt, wo noch geschraubt werden muss.
 

Tobse

Top Contributor
@krgewb Wenn es dich interessiert: Das nicht-Unterstützen ganz bestimmter boolscher Ausdrücke ist ein solcher Fall, wo die GSA nur 99 von 100% der Features bietet. Dann ist da aber noch die Aufteilung von partialfields und requiredfields, welche z.B. im Vergleich zu Lucene (Solr + ElasticSearch) deutlich restriktiver ist. Erstaunlicherweise kann Lucene Wildcards nur in der Mitte und am Ende eines Suchbegriffs (wie SQL LIKE 'a%bcd%', aber nicht LIKE '%abc'), die GSA bietet nur die Option für ein Wildcard hinten und vorne (wie SQL LIKE '%abc%').

@Thallius wie habt ihr denn die Hardware emuliert?
Was die boolschen ausdrücke angeht kann man durch umformen des Ausdrucks sicherlich den einen oder anderen ungültigen Ausdruck nachbessern. Aktuell wird schon eine Exception geworfen, wenn der Code der Meinung ist, dass die GSA den Ausdruck ablehnen würde (die GSA gibt in dem Fall keinen Fehler aus sondern einfach ein leeres Suchergebnis - ziemlich kacke). Diesbezüglich würde der Ansatz gut funktionieren.
Was die Wildcard-Suche könnte man über die Konfiguration im Suchserver und einige Sonderlocken im Code lösen; da bin ich mir aber nicht 100% sicher, obs klappt. Auf dem Applikationsserver kann man die Funktionalität leider nicht dazu programmieren weil man sonst große Teile des Such-Index auf den Applikationsserver übertragen müsste - auch keine Echte Option.

@thecain
Du meinst Blackbox-Integrationstests gegen den fachlichen Code + den Suchserver? Also quasi "Auf die Anfrage XYZ erscheinen die Ergebnisse A, B und C"?
 

Neue Themen


Oben