Ist es in Ordnung, dass Schnittstellen von konkreten Klassen abhängen?


9

Ich erstelle eine Schnittstelle in Java für die benutzerdefinierte Fehlerbehandlung.

Ich möchte ein Argumentfehlerobjekt übergeben, aber ich brauche es, um ein Kind der ExceptionKlasse zu sein.

Ist es in Ordnung, meinen definierten Klassennamen in einer Schnittstelle zu verwenden?

Wird es nicht weniger zu einer Schnittstelle, da es nicht von einer Implementierung abhängig ist?

Ich versuche so etwas zu tun:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

Versuchen Sie zu fragen, ob es in Ordnung ist, eine andere Klasse in einer Schnittstelle zu erben?
Snoop

@StevieV Nein. Ich habe die Frage bearbeitet.
Nikachx

1
@AndresF. Dies ist nur ein Beispiel und kann auf jede OO-Sprache zur Verwendung von Klassen in Schnittstellen angewendet werden.
Nikachx

3
Sagen Sie mir: Ist ein CustomExceptionTeil der Implementierung oder ein Teil der Schnittstelle?
user253751

2
@ Nikachx Ich verstehe nicht, was du mit "sicher" meinst. Inwiefern ist Stringsicherer als CustomException? Warum ist es wichtig, wenn CustomExceptionwiederum andere Abhängigkeiten bestehen?
Andres F.

Antworten:


2

Zuerst muss ich darauf hinweisen, dass sich CustomExceptiondas nicht ausdehnt, Exceptionso dass es nicht wirklich ein ist Exception.

Das gesagt:

Wenn Sie sich nicht für das Prinzip der Abhängigkeitsinversion interessieren , lassen Sie es so, wie es ist. Es ist vollkommen in Ordnung, wenn eine Schnittstelle von konkreten Klassen abhängt.StringObject Beispielsweise hängen viele Schnittstellen von konkreten Klassen ab oder sind konkrete Klassen . Die Sache ist, dass wir eher glauben würden, dass Klassen, die zum Java SDK gehören, stabiler sind (weniger anfällig für Änderungen, die den Code brechen) als die, die wir schreiben.

In der anderen Hand:

Wenn Sie dem DIP folgen möchten (das unzählige Vorteile hat und meine Empfehlung ist), müssen Sie eines von zwei Dingen tun:

Option 1

  • make CustomExceptionabstrakt
  • Bleib void onError(CustomException ex)wie es ist

Option 2

  • Machen Sie CustomExceptioneine Schnittstelle
  • Bleib void onError(CustomException ex)wie es ist

Mit einer dieser Optionen würden Sie dem DIP entsprechen, da die Schnittstelle nicht von einer konkreten Klasse abhängen würde, sondern nur von Abstraktionen.

Bei einer direkten Anwendung der Abhängigkeitsinversion gehören die Abstracts den oberen Ebenen / Richtlinienebenen. Diese Architektur gruppiert die höheren / Richtlinienkomponenten und die Abstracts, die niedrigere Dienste definieren, in demselben Paket. Die untergeordneten Ebenen werden durch Vererbung / Implementierung dieser abstrakten Klassen oder Schnittstellen erstellt . Martin, Robert C. (2003).

  • Agile Softwareentwicklung, Prinzipien,> Muster und Praktiken. Prentice Hall. S. 127–131. ISBN 978-0135974445.

1
Es gibt keinen großen Unterschied zwischen dem Akzeptieren einer abstrakten Klasse oder einer konkreten (nicht endgültigen) Klasse, und der Unterschied zu einer Schnittstelle ist nicht viel größer. Solange die Instanz als Parameter übergeben und in Ihrer Implementierung nicht fest codiert ist, haben Sie die Grundlagen für DI.
Jacob Raihle

@JacobRaihle Was meinst du mit der Übergabe einer in der Implementierung fest codierten Instanz?
Tulains Córdova

Ich sagte "solange es bestanden und nicht fest codiert ist". Ich meine, da die InterfaceSchnittstelle a akzeptiert CustomExceptionund es dem Aufrufer überlässt, eine bereitzustellen, kann der Anrufer jede Klasse bereitstellen, die sich erweitert, CustomExceptionselbst wenn CustomExceptiones sich um eine konkrete Klasse handelt - was nicht möglich gewesen wäre, wenn Interfacees irgendwie für das Erstellen verantwortlich gewesen wäre es. Diese Umkehrung der Kontrolle, mehr als die Arbeit mit Schnittstellen (obwohl das sicherlich hilft), ist meiner Meinung nach das, worum es bei DI geht.
Jacob Raihle

@JacobRaihle "Bei einer direkten Anwendung der Abhängigkeitsinversion gehören die Abstracts den oberen / Richtlinienebenen. Diese Architektur gruppiert die höheren / Richtlinienkomponenten und die Abstracts, die niedrigere Dienste definieren, in demselben Paket. Die unteren Ebenen werden erstellt durch Vererbung / Implementierung dieser abstrakten Klassen oder Schnittstellen . " Martin, Robert C. (2003). Agile Softwareentwicklung, Prinzipien, Muster und Praktiken. Prentice Hall. S. 127–131. ISBN 978-0135974445.
Tulains Córdova

Was bringt eine abstrakte Klasse, wenn Sie einen vernünftigen Standard angeben können? Was verlieren Sie dadurch? Zitieren Sie nicht nur Bücher, denken Sie.
Jacob Raihle

2

Tulains hat recht - Schnittstellen hängen ständig von konkreten Klassen ab. Sie sollen nur einen Vertrag für ihre eigenen Anliegen erstellen. Dieser Vertrag kann die Aufnahme und Rückgabe jeglicher Art von Daten beinhalten.

Denken Sie daran, dass in höheren Sprachen selbst primitive Typen nicht so primitiv sind. Sie arbeiten also sowieso mit konkreten Typen!


0

Ich nehme an, mit Namen meinen Sie die eigentliche Klasse. Wenn Sie versuchen, den tatsächlichen Namen der Ausnahmeklasse anzugeben , um die entsprechende Ausnahme über Reflection zu initialisieren, ist dies nicht der richtige Weg.

Wenn Sie eine benutzerdefinierte Klasse in einer Schnittstelle verwenden möchten, können Sie natürlich Ihre eigenen Klassen in Ihren eigenen Schnittstellen verwenden. Die Klassen werden Teil der öffentlichen Schnittstelle Ihrer Bibliothek / API. Datenstrukturen und Ausnahmen sind ein gutes Beispiel für die Klassen, die häufig von den Schnittstellen verwendet werden.

Wenn Sie je nach Kontext unterschiedliche Ausnahmen verwenden müssen, sind Sie möglicherweise an der Verwendung von Generika interessiert.


Nein, ich meine nicht Nachdenken. Ja, wie Sie bereits erwähnt haben, können Ausnahmen und Datenstrukturen in Schnittstellen verwendet werden, da sie nur Daten enthalten und nicht plattform- oder anderweitig von anderen Klassen abhängig sind. Vielen Dank.
Nikachx

2
Antworten, die die OP-Fragen stellen ... Fragen Sie einfach in einem Kommentar und geben Sie dann Ihre Antwort.
Snoop

1
@StevieV: Der erste Absatz war eher eine rhetorische Frage. Und wie der Kommentar des OP zeigt, habe ich die Frage des OP tatsächlich beantwortet.
Arseni Mourzenko
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.