Beispiel für ein Querschnittsthema


120

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

Warum würde die Protokollierung speziell in diesem Beispiel zu einer Codeduplizierung ( Streuung ) führen? (Neben einfachen Anrufen wie log("....")überall, was keine große Sache zu sein scheint).

Was ist der Unterschied zwischen a core concernund a cross-cutting concern?

Mein Endziel ist es, AOP besser zu verstehen.

Antworten:


234

Bevor wir das Querschnittsthema verstehen , müssen wir das Anliegen verstehen .

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

Es gibt zwei Arten von Bedenken:

  1. Die Bedenken, die einzelne und spezifische Funktionen für primäre Anforderungen darstellen, werden als Kernprobleme bezeichnet .
    ODER
    Die Hauptfunktionalität des Systems ist als Kernanliegen bekannt.
    Zum Beispiel : Geschäftslogik
  2. Die Bedenken, die Funktionen für sekundäre Anforderungen darstellen, werden als Querschnittsthemen oder systemweite Bedenken bezeichnet .
    ODER
    Das Querschnittsthema ist ein Problem, das für die gesamte Anwendung gilt und die gesamte Anwendung betrifft.
    Zum Beispiel: Protokollierung, Sicherheit und Datenübertragung sind die Anliegen, die in fast jedem Modul einer Anwendung benötigt werden, daher sind sie Querschnittsthemen.

Höflichkeit

Geben Sie hier die Bildbeschreibung ein

Diese Abbildung stellt eine typische Anwendung dar, die in Module unterteilt ist. Das Hauptanliegen jedes Moduls ist die Bereitstellung von Diensten für seine bestimmte Domäne. Jedes dieser Module erfordert jedoch ähnliche Zusatzfunktionen wie Sicherheitsprotokollierung und Transaktionsverwaltung. Ein Beispiel für Querschnittsthemen 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 mit mindestens einer Funktion gekreuzt werden.

(Höflichkeit)


1
"Das Querschnittsthema ist ein Problem, das für die gesamte Anwendung gilt." ➤ Ich bin mir nicht sicher, da das Transaktionsmanagement nicht für die gesamte Anwendung gilt, aber immer noch ein Querschnittsthema ist. Und das Bild sagt mir nichts, um ehrlich zu sein, es ist nur verwirrend ..
Koray Tugay

Gute Erklärung, aber ich habe ein kleines Problem mit dem Bild, in dem wir diese Bedenken nennen: Querschnitt nicht Querschnittsthemen, und ich denke, es wäre besser, andere Bedenken mit Querschnittsthemen zu schneiden, nicht anders herum. Wie aspektorientierte Entwicklung
Hyeganeh

Trotzdem erklärt die Antwort nicht das Problem, einfach etwas wie Log4j zu verwenden und wie LogManager.getLogger () zu protokollieren. info (ModuleName, msg)
Vicky Singh

49

Ich denke, das beste Beispiel für ein Querschnittsthema ist das Transaktionsverhalten. Das Einfügen von Try-Catch-Blöcken mit Commit- und Rollback-Aufrufen in alle Ihre Dienstmethoden wäre beispielsweise abstoßend. Das Annotieren der Methoden mit einem Marker, mit dem AOP sie mit dem gewünschten Transaktionsverhalten kapseln kann, ist ein großer Gewinn.

Ein weiterer guter Kandidat als Beispiel für ein Querschnittsthema ist die Genehmigung. Das Kommentieren einer Servicemethode mit einer Markierung, die angibt, wer sie aufrufen kann, und das Zulassen einiger AOP-Ratschläge, ob der Methodenaufruf zulässig ist oder nicht, kann der Behandlung im Servicemethodencode vorzuziehen sein.

Das Implementieren der Protokollierung mit AOP-Ratschlägen kann eine Möglichkeit sein, mehr Flexibilität zu erhalten, sodass Sie die Protokollierung durch Ändern eines Joinpoints ändern können. In der Praxis sehe ich Projekte nicht sehr oft. Die Verwendung einer Bibliothek wie log4j, mit der Sie nach Laufzeit nach Protokollierungsstufe und Kategorie filtern können, funktioniert bei Bedarf gut genug.

Ein zentrales Anliegen ist der Grund, warum die Anwendung vorhanden ist, die Geschäftslogik, die die Anwendung automatisiert. Wenn Sie über eine Logistikanwendung verfügen, die den Versand von Fracht abwickelt, kann es von zentraler Bedeutung sein, herauszufinden, wie viel Fracht Sie auf einem LKW verpacken können oder wie der LKW am besten seine Lieferungen abgeben kann. Querschnittsthemen sind in der Regel Implementierungsdetails, die von der Geschäftslogik getrennt werden müssen.


2
Obwohl das Transaktionsverhalten tatsächlich nur in der Datenzugriffsschicht vorhanden ist, da die Try-Catch-Blöcke über viele Methoden hinweg dupliziert werden, wird dies als Querschnitt angesehen. Meine ursprüngliche Wahrnehmung war, dass Querschnitt bedeutete, dass sich der Code über mehrere Ebenen der Anwendung erstreckte.
jlars62

4
@ jlars62: Querschnitt bedeutet, dass es rechtwinklig zu den Features verläuft.
Nathan Hughes

7
@ jlars62: Mit rechtwinklig meine ich: Stellen Sie sich ein Feature als einen Stapel von Ebenen vor. Ein Querschnittsthema kann nur für eine Schicht gelten, ist jedoch allen Merkmalen gemeinsam.
Nathan Hughes

@ NathanHughes Authorization ist ein gutes Beispiel. Ich habe gerade meine App überarbeitet, um den gesamten Autorisierungscode in eine übergreifende Architektur zu integrieren, und es hat Wunder gewirkt, viel Code zu bereinigen. Ich betrachte die Domain als ein Haus. Wenn Sie den Schlüssel zum Einsteigen haben, können Sie dort tun, was Sie wollen (Sie werden als Eigentümer vermutet). Aber Sie würden nicht jede Tür im Haus abschließen und einen Schlüsseleingang verlangen. Du bist entweder drin oder nicht.
Richard

"Transaktionsverhalten" kann vielen Merkmalen gemeinsam sein, dies ist jedoch kein "Querschnitt", da es die Schichten nicht "kreuzt". Der Grund, warum die Protokollierung beispielsweise ein Querschnittsthema ist, liegt darin, dass ich mich möglicherweise in der Präsentationsschicht, der Geschäftsschicht, der Datenschicht usw.
anmelden möchte

14

Neben der akzeptierten Antwort möchte ich ein weiteres Beispiel für ein Querschnittsthema nennen: Remoting. Angenommen, ich möchte nur andere Komponenten in meinem Ökosystem lokal aufrufen, als ob sie in Bearbeitung wären. Vielleicht tun sie es in einigen Fällen sogar. Jetzt möchte ich meine Dienste in einer Cloud oder einem Cluster verteilen. Warum sollte mich dieser Aspekt als Anwendungsentwickler interessieren? Ein Aspekt könnte darin bestehen, herauszufinden, wer und wie anzurufen ist, übertragene Daten bei Bedarf zu serialisieren und einen Fernanruf zu tätigen. Wenn alles in Bearbeitung wäre, würde der Aspekt nur den Ortsanruf weiterleiten. Auf der Angerufenen-Seite würde der Aspekt die Daten deserialisieren, den Ortsgespräch führen und das Ergebnis zurückgeben.

Lassen Sie mich nun eine kleine Geschichte über "triviale" Dinge wie die Protokollausgabe erzählen: Vor wenigen Wochen habe ich eine komplexe, aber nicht zu große Codebasis (ca. 250.000 Codezeilen) für einen Client überarbeitet. In einigen hundert Klassen wurde eine Art von Protokollierungsframework verwendet, in einigen anderen hundert. Dann gab es mehrere tausend Zeilen vonSystem.out.println(*)wo es eigentlich Protokollausgabe hätte geben sollen. Am Ende habe ich Tausende von Codezeilen repariert, die über die gesamte Codebasis verteilt waren. Glücklicherweise konnte ich in IntelliJ IDEA (strukturelles Suchen und Ersetzen) einige clevere Tricks anwenden, um die gesamte Aktion zu beschleunigen, aber Junge, denkst du nicht, dass es trivial war? Sicher, eine stark kontextabhängige Debug-Protokollierung wird immer innerhalb eines Methodenkörpers stattfinden, aber viele wichtige Arten der Protokollierung, z. B. das Verfolgen von Methodenaufrufen (auch hierarchisch mit einer gut eingerückten Ausgabe), das Protokollieren sowohl behandelter als auch nicht behandelter Ausnahmen, Benutzerüberwachung (Protokollieren von Aufrufen an) eingeschränkte Methoden basierend auf Benutzerrollen) usw. können leicht in Aspekten implementiert werden, ohne dass sie den Quellcode verschmutzen. Der alltägliche Anwendungsentwickler muss nicht darüber nachdenken oder die Logger-Aufrufe über die Codebasis verteilt sehen.

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


0

Querschnittsthemen sind die Szenarien, die unabhängig von der Art der Anwendung immer vorhanden sein sollten.

Zum Beispiel Protokollierung, Sicherheit, Leistungsprofilerstellung, Lokalisierung, Zugänglichkeit, Transaktion usw. Unabhängig von der Software, die wir erstellen, ist eine Protokollierung erforderlich (andernfalls, wie jemand relevante Informationen aus Produktdaten debuggt oder erhält). Sicherheit (Authentifizierung / Autorisierung usw.) ist erforderlich, wenn nur authentische Benutzer mit den richtigen Berechtigungen in die Anwendung eintreten können. Wir müssen wissen, wie Ihre Anwendung funktioniert, und dann müssen wir Profilerstellung durchführen. Wenn die Anwendung von internationalen Benutzern (mit ihrer eigenen lokalisierten Sprache) verwendet wird, müssen wir diese in der Anwendung unterstützen. Barrierefreiheit ist ein Usability-Fall für behinderte Menschen, um unsere Anwendung zu verwenden.

Unabhängig davon, ob unsere Anwendung Desktop-basiert, webbasiert usw. ist. Wenn sie von Endbenutzern geografisch in der Produktionsumgebung verwendet werden muss, sind Querschnitte erforderlich. Bis jetzt habe ich nichts darüber gesagt, worum es bei Anwendungen geht usw., aber angesichts der Liste der Bedenken, die behoben werden sollten, bevor sie für Endbenutzer in der Produktionsumgebung freigegeben werden. und das ist alles über Querschnittsthemen (die von allen Anwendungen / Methoden / Klassen behandelt werden müssen, dh auf verschiedenen Ebenen).

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.