Java: Wie man Wiederholungen ohne Copy-Paste-Code behandelt?

8

Ich habe mehrere Fälle, in denen ich ein neues Verfahren für DB- und Netzwerkoperationen durchführen muss. Überall wo ich es mache, habe ich die folgende Art von Code:

%Vor%

Das Problem ist, dass dieses Codemuster überall in meinen Klassen kopiert wird. Was wirklich schlimm ist. Ich kann mir nicht vorstellen, wie ich dieses Copy-Paste-Muster für den Bruch entfernen kann, da ich normalerweise eine andere Ausnahme bekomme. Ich möchte Daten protokollieren, auf die ich gescheitert bin (normalerweise auch unterschiedliche Wege).

Gibt es eine gute Möglichkeit, dieses Kopieren-Einfügen in Java 7 zu vermeiden?

Bearbeiten: Ich verwende guice für die Abhängigkeitsinjektion. Ich habe Ausnahmen überprüft. Es könnte mehrere Variablen anstelle von nur einer Daten geben und sie sind alle unterschiedlichen Typs.

Edit2 : Der AOP-Ansatz sieht für mich am vielversprechendsten aus.

    
Artem 02.03.2012, 20:23
quelle

7 Antworten

5

Off-Hand kann ich zwei verschiedene Ansätze vorstellen:

Wenn die Unterschiede in der Ausnahmebehandlung deklarativ ausgedrückt werden können, verwenden Sie möglicherweise AOP, um den Ausnahmebehandlungscode um Ihre Methoden zu weben. Dann könnte Ihr Geschäftscode wie folgt aussehen:

%Vor%

Der Vorteil ist, dass es sehr einfach ist, Wiederholungsverhalten zu einer Methode hinzuzufügen, der Nachteil ist die Komplexität des Webens des Rates (den Sie nur einmal implementieren müssen. Wenn Sie eine Dependency-Injection-Bibliothek verwenden, ist es wahrscheinlich bieten Unterstützung für die Abhörmethode an.)

Der andere Ansatz besteht darin, das Befehlsmuster zu verwenden:

%Vor%

Das Problem mit dem Befehlsmuster sind die Methodenargumente. Sie sind auf einen einzelnen Parameter beschränkt und die Generika sind für den Aufrufer eher unhandlich. Außerdem funktioniert es nicht mit geprüften Ausnahmen. Auf der positiven Seite, keine schicken AOP Sachen: -)

    
meriton 02.03.2012, 21:17
quelle
4

Wie bereits vorgeschlagen, sind AOP- und Java-Annotationen eine gute Option. Ich würde empfehlen, einen Read-Made-Mechanismus von jcabi-aspects zu verwenden:

%Vor%

Lesen Sie auch diesen Blogbeitrag: Ссылка

    
yegor256 03.02.2013 08:24
quelle
3

Ich habe die RetryLogic-Klasse implementiert, die wiederverwendbare Wiederholungslogik bietet und Parameter unterstützt, weil der Code, der wiederholt werden soll, in einem Delegaten enthalten ist.

%Vor%

Nachfolgend finden Sie ein Anwendungsbeispiel. Der Code, der wiederholt werden soll, befindet sich innerhalb der Aufrufmethode.

%Vor%

Wenn Sie nur versuchen möchten, wenn ein bestimmter Ausnahmetyp auftritt (und bei allen anderen Arten von Ausnahmen fehlschlägt), unterstützt die RetryLogic-Klasse einen Ausnahmeklassenparameter.

    
Marquez 16.05.2013 12:31
quelle
2

Lassen Sie Ihre doSomething eine Schnittstelle implementieren, z. B. Runable , und erstellen Sie eine Methode, die Ihren obigen Code enthält, wobei doSomething durch interface.run(data)

ersetzt wird     
stryba 02.03.2012 20:29
quelle
1

werfen Sie einen Blick auf: dieses Wiederholungs-Dienstprogramm

Diese Methode sollte für die meisten Anwendungsfälle funktionieren:

%Vor%

Sie können einen Aspekt mit diesem Dienstprogramm einfach implementieren, um dies mit noch weniger Code zu tun.

    
user2179737 11.06.2014 14:16
quelle
0

Erweitern Sie den bereits diskutierten Ansatz, wie wäre es mit so etwas (keine IDE auf diesem Netbook, also betrachten Sie das als Pseudocode ...)

%Vor%     
DNA 02.03.2012 20:57
quelle
0

Eine Sache, die ich hinzufügen möchte. Die meisten Ausnahmen (99,999%) bedeuten, dass mit deinem Code oder deiner Umgebung etwas nicht stimmt, das die Aufmerksamkeit eines Admins benötigt. Wenn Ihr Code keine Verbindung zur Datenbank herstellen kann, handelt es sich wahrscheinlich um eine falsch konfigurierte Umgebung. Es ist daher wenig sinnvoll, sie erneut zu versuchen, nur um herauszufinden, ob sie auch am 3., 4. oder 5. Mal funktioniert hat. Wenn Sie eine Ausnahme auslösen, weil die Person keine gültige Kreditkartennummer angegeben hat, wird der Wiederholungsversuch keine Kreditkartennummer eingeben.

Die einzigen Situationen, die remote einen erneuten Versuch wert sind, sind, wenn ein System ungemein angespannt ist und die Dinge auslaufen, aber in dieser Situation wird die Wiederholungslogik wahrscheinlich mehr Belastung als weniger verursachen (3x für 3 Wiederholungen bei jeder Transaktion). Aber das tun die Systeme, um die Nachfrage zu reduzieren (siehe die Missionsgeschichte von apollo lander). Wenn ein System aufgefordert wird, mehr zu tun, als es kann, beginnt es, Aufträge zu löschen, und Zeitüberschreitungen sind das Signal, das das System belastet (oder schlecht geschrieben). Sie wären in einer viel besseren Situation, wenn Sie nur die Kapazität Ihres Systems erhöhen (fügen Sie mehr RAM, größere Server, mehr Server, bessere Algorithmen hinzu, skalieren Sie es!).

Die andere Situation wäre, wenn Sie optimistisches Sperren verwenden und Sie können zwei Versionen eines Objekts wiederherstellen und automatisch zusammenführen. Während ich dies schon einmal gesehen habe, warne ich diesen Ansatz, aber es könnte für einfache Objekte gemacht werden, die zu 100% ohne Konflikte zusammengeführt werden können.

Die meisten Ausnahmen sollten auf der entsprechenden Ebene abgefangen werden (sehr wichtig), stellen Sie sicher, dass Ihr System in einem guten konsistenten Zustand ist (zB Rollback-Transaktionen, Dateien schließen, usw.), protokollieren Sie, informieren Sie den Benutzer, dass es nicht funktioniert.

Aber ich werde diese Idee ablegen und versuchen, einen guten Rahmen zu geben (gut, weil es Spaß macht wie Kreuzworträtsel-Spaß).

%Vor%     
chubbsondubs 11.06.2014 14:52
quelle

Tags und Links