it-swarm.com.de

Beispiel für ein Querschnittsthema

Was ist ein gutes Beispiel für einen cross-cutting concern? Das Krankenaktenbeispiel auf der Seite wikipedia scheint mir unvollständig zu sein.

Warum führte die Protokollierung in diesem Beispiel zu Codeverdoppelung ( Streuung )? (Abgesehen von einfachen Aufrufen wie log("....") überall, was keine große Sache zu sein scheint).

Was ist der Unterschied zwischen einem core concern Und einem cross-cutting concern?

Mein Endziel ist es, AOP besser zu verstehen.

96
jlars62

Bevor wir die Querschnittsthematik verstehen, müssen wir die -Thematik verstehen.

Ein Problem ist ein Begriff, der sich auf einen Teil des Systems bezieht, der auf der Grundlage der Funktionalität unterteilt ist.

Es gibt zwei Arten von Bedenken:

  1. Die Anliegen, die eine einzelne und spezifische Funktionalität für primäre Anforderungen darstellen, werden als Kernanliegen bezeichnet.
    ODER
    Die primäre Funktionalität des Systems ist als Kernanliegen bekannt.
    Zum Beispiel : Geschäftslogik
  2. Die Bedenken, die Funktionalitäten für sekundäre Anforderungen darstellen, werden als übergreifende Bedenken oder systemweite Bedenken bezeichnet.
    ODER
    Der Querschnittsthema ist ein Problem, das für die gesamte Anwendung gilt und sich auf die gesamte Anwendung auswirkt.
    Zum Beispiel: Protokollierung, Sicherheit und Datenübertragung sind die Anliegen, die in fast jedem Modul einer Anwendung benötigt werden, daher sind sie übergreifend Bedenken abbauen.

mit freundlicher Genehmigung

enter image description here

Diese Abbildung zeigt eine typische Anwendung, die in Module unterteilt ist. Das Hauptanliegen jedes Moduls ist die Bereitstellung von Diensten für die jeweilige Domäne. Für jedes dieser Module sind jedoch ähnliche Zusatzfunktionen erforderlich, z. B. Sicherheitsprotokollierung und Transaktionsverwaltung. Ein Beispiel für Probleme, die sich überschneiden, ist die Protokollierung, die häufig in verteilten Anwendungen verwendet wird, um das Debuggen durch Verfolgen von Methodenaufrufen zu unterstützen. Angenommen, wir protokollieren sowohl am Anfang als auch am Ende jedes Funktionskörpers. Dies führt dazu, dass alle Klassen, die mindestens eine Funktion haben, gekreuzt werden.

(mit freundlicher Genehmigung)

189
Premraj

Ich denke, das beste Beispiel für ein Querschnittsthema ist das Transaktionsverhalten. Zum Beispiel wäre es abstoßend, Try-Catch-Blöcke mit Commit- und Rollback-Aufrufen in all Ihren Dienstmethoden zu platzieren. Es ist ein großer Gewinn, die Methoden mit einem Marker zu versehen, den AOP verwenden kann, um sie mit dem gewünschten Transaktionsverhalten zu kapseln.

Ein weiterer guter Kandidat als Beispiel für ein Querschnittsthema ist die Zulassung. Das Kommentieren einer Dienstmethode mit einer Markierung, die angibt, wer sie aufrufen kann, und die Entscheidung, ob der Methodenaufruf zulässig ist oder nicht, durch einige AOP-Empfehlungen kann der Behandlung im Dienstmethodencode vorgezogen werden.

Das Implementieren der Protokollierung mit AOP-Ratschlägen kann eine Möglichkeit sein, mehr Flexibilität zu erzielen, sodass Sie die Protokollierung ändern können, indem Sie einen Joinpoint ändern. In der Praxis sehe ich Projekte, die das sehr oft machen. In der Regel funktioniert die Verwendung einer Bibliothek wie log4j, mit der Sie zur Laufzeit nach Protokollierungsstufe und Kategorie filtern können, sofern dies erforderlich ist.

Ein zentrales Anliegen ist ein Grund dafür, dass die Anwendung vorhanden ist, die Geschäftslogik, die die Anwendung automatisiert. Wenn Sie eine Logistikanwendung haben, die den Frachtversand abwickelt, kann es von zentraler Bedeutung sein, herauszufinden, wie viel Fracht Sie auf einen LKW packen können oder wie der LKW am besten vorankommt, um seine Lieferungen abzugeben. Querschnittsthemen sind in der Regel Implementierungsdetails, die von der Geschäftslogik getrennt werden müssen.

41
Nathan Hughes

Neben der akzeptierten Antwort möchte ich ein weiteres Beispiel für ein Querschnittsthema nennen: Remoting. Angenommen, ich möchte andere Komponenten in meinem Ökosystem nur lokal aufrufen, als würden sie gerade ausgeführt. Vielleicht tun sie es in einigen Fällen sogar. Jetzt möchte ich meine Dienste jedoch in einer Cloud oder einem Cluster verteilen. Warum sollte ich mich als Anwendungsentwickler für diesen Aspekt interessieren? Ein Aspekt könnte sich darum kümmern, herauszufinden, wer wie angerufen werden soll, übertragene Daten zu serialisieren und einen Fernanruf zu tätigen. Wenn alles in Bearbeitung wäre, würde der Aspekt den lokalen Anruf einfach weiterleiten. Auf der Seite der Angerufenen würde der Aspekt die Daten deserialisieren, den lokalen Anruf tätigen und das Ergebnis zurückgeben.

Lassen Sie mich nun eine kleine Geschichte über "triviale" Dinge wie die Protokollausgabe erzählen: Vor ein paar Wochen habe ich eine komplexe, aber nicht zu große Codebasis (etwa 250 KB Codezeilen) für einen Client überarbeitet. In einigen hundert Klassen wurde eine Art von Protokollierungsframework verwendet, in einigen hundert anderen. Dann gab es mehrere tausend Zeilen von System.out.println(*), in denen eigentlich eine Protokollausgabe hätte erfolgen sollen. So endete ich damit, Tausende von Codezeilen zu reparieren, die über die gesamte Codebasis verteilt waren. Glücklicherweise konnte ich einige clevere Tricks in IntelliJ IDEA (strukturelles Suchen und Ersetzen)) anwenden, um die gesamte Aktion zu beschleunigen, aber Junge, denkst du nicht, es war trivial! Die abhängige Debug-Protokollierung findet immer innerhalb eines Methodentexts statt, es gibt jedoch viele wichtige Protokollierungstypen, z. B. das Verfolgen von Methodenaufrufen (auch hierarchisch mit einer gut eingerückten Ausgabe), das Protokollieren von behandelten oder nicht behandelten Ausnahmen sowie die Benutzerüberwachung (das Protokollieren von Aufrufen zu eingeschränkten Methoden basierend auf dem Benutzer) Rollen) und so weiter können problemlos in Aspekte implementiert werden, ohne dass sie den Quellcode verschmutzen. Der alltägliche Anwendungsentwickler muss nicht darüber nachdenken oder die über die Codebasis verteilten Logger-Aufrufe sehen. Jemand ist dafür verantwortlich, den Aspekt auf dem neuesten Stand zu halten Sie können sogar die Protokollierungsstrategie oder das gesamte Protokollierungsframework zentral an einem Ort ändern.

Ich kann ähnliche Erklärungen für andere Querschnittsthemen finden. Es ist eine Frage der Professionalität, den Code sauber und frei von Streuungen und Verwicklungen zu halten. Last but not least bleibt der Code lesbar, wartbar und umgestaltbar. Amen.

12
kriegaex