Ist aspektorientierte Programmierung eine Fehlbezeichnung?


8

Nach allem, was ich über "aspektorientierte Programmierung" oder "aspektorientierte Softwareentwicklung" gelernt habe, scheint es ungenau zu sein, es als Programmierparadigma oder -methode zu bezeichnen. Soweit ich das beurteilen kann, handelt es sich nicht um eine grundlegende Programmiertechnik.

Um herauszufinden, was unter "Paradigma" und "Methodik" zu verstehen ist, beziehen Sie sich bitte auf die folgenden Definitionen aus dem American Heritage Dictionary. Vergleichen Sie, wie gut oder schlecht "objektorientierte Programmierung" für jede Anwendung gilt und wie gut AOP passt.

Paradigma: Eine Reihe von Annahmen, Konzepten, Werten und Praktiken, die eine Sichtweise auf die Realität für die Gemeinschaft darstellen, die sie teilt, insbesondere in einer intellektuellen Disziplin.

Methodik: Eine Reihe von Praktiken, Verfahren und Regeln, die von Personen angewendet werden, die in einer Disziplin arbeiten oder sich an einer Untersuchung beteiligen. eine Reihe von Arbeitsmethoden.

"Evidenzbasierte Medizin" erfüllt die Definition des Paradigmas, aber "Hysterektomie-basierte Medizin" wäre eine Fehlbezeichnung, da der Problemraum zu eng ist.

Ich habe den Eindruck, dass AOP möglicherweise falsch benannt ist, weil AOP auf der Grundlage des Suffixes "Orientierte Programmierung" behauptet, sowohl ein Paradigma als auch eine Methodik zu sein, wie es "Objektorientierte Programmierung" ist.

Beide Begriffe (Paradigma und Methodik) weisen auf eine grundlegende Technik hin, bei der ich unter Aspekten eine Technologie zur Lösung eines engen Problembereichs verstehe, deren Größe möglicherweise mit der statischen Variablenfunktion von Java vergleichbar ist.

Wenn es stimmt, dass Aspekte eine enge Reihe von Problemen lösen und AOP keine Fehlbezeichnung ist, warum sollten dann nicht alle Programmiertechniken das Suffix "Orientierte Programmierung" erhalten, wie "Vererbungsorientierte Programmierung", "Abhängigkeit"? orientierte Programmierung "oder" bereichsorientierte Programmierung? "


Haben Sie ein Beispiel für eine tatsächliche Softwareentwicklungsmethode?
back2dos

Antworten:


3

Ich denke, dies ist ein wirklich zweifelhaftes Thema, da die Definition einer "Methodik" und eines "Paradigmas" und einer "-orientierten Programmierung" in diesem Zusammenhang möglicherweise etwas locker ist, aber ich werde Devil's Advocate spielen und mit " Ja, es ist eine Fehlbezeichnung ".

Selbst wenn Sie keine AOP- oder AOP-Funktionen zur Lösung eines Problems verwendet hätten, würden Sie immer noch über diese Aspekte nachdenken - Sie könnten sie irgendwo als Dokumentation schreiben lassen oder Sie könnten einen Codegenerator verwenden - so oder so, das Konzept von Aspekten ist immer noch da. Das könnte auch zu jedem Paradigma passen; Obwohl es ziemlich hässlich wäre, könnten Sie in C immer noch OOP machen.

Würde das nicht bedeuten, dass AOP genauso eine Methodik ist wie OOP? Ich denke, da steckt noch mehr dahinter.

Der Grund ist, dass eine Methodik eine Lösung für eine bestimmte Art von Problem bietet . Sie verwenden nicht mehr als eine Methode, um ein konzeptionelles Problem zu lösen, obwohl Sie im größeren Schema möglicherweise zwei oder mehr verwenden. Sie können OOP und Prozedur verwenden, um eine Dateneingabe-Benutzeroberfläche zu schreiben, aber Sie verwenden nur OOP, um die abstrakte Struktur der Benutzeroberfläche zu beschreiben, und Sie verwenden nur Prozeduren (genauer Methoden), um deren Verhalten zu beschreiben. In den Kernbestandteilen eines Problems schließen sich Methoden gegenseitig aus - und AOP kann weiterhin an der Lösung eines Problems mit Funktions-, OOP- oder Verfahrenscode teilnehmen.

AOP löst Probleme in dem Sinne, dass es die Menge an wiederholtem Code reduziert, aber das liegt gut in der Jobbeschreibung eines Sprachfeatures. Sie haben kein wirkliches Problem konzeptionell gelöst, indem Sie gesagt haben, dass Sie den Compiler oder die Laufzeit dazu bringen, Code einzufügen, den Sie nicht explizit schreiben mussten. Sie haben Ihren Code gerade etwas übersichtlicher gestaltet. Zu erklären, dass "alle meine Funktionen ihre Start- und Endzeiten protokollieren", ist keine Lösung für ein Problem. Es ist nur eine Problemstellung.

Ich denke, es wäre angemessener, wenn sie einfach als Sprachmerkmale "Aspekte" genannt würden.


2
AOP ist definitiv nicht die gleiche Kategorie wie OOP. Ich denke, was passiert ist, ist, dass jemand sagte: "Aspekte sind ein Sprachkonstrukt; Objekte sind ein Sprachkonstrukt; wenn Sie Objekte verwenden, machen Sie OOP; DAHER, wenn Sie Aspekte verwenden, machen Sie AOP". In Wirklichkeit wäre ein mit einem Aspekt vergleichbares Konstrukt eine Ausnahme oder ein Funktionszeiger oder etwas anderes, und niemand sagt "ausnahmeorientierte Programmierung".
Tom Anderson

@ Tom Das ist eine wirklich überzeugende Art, es zu betrachten.
Rei Miyasaka

5

Alle Entwicklungsmethoden sind lediglich Denkweisen zur Organisation von Code. Jede Entwicklungsmethode kann sehr unterschiedlich aussehenden Code oder ähnlichen Code erzeugen. Sie benötigen möglicherweise auch Bibliotheken oder Sprachfunktionen zur Unterstützung.

In C ++ wird AOP beispielsweise normalerweise mithilfe von Merkmalsklassen und Polymorphismus zur Kompilierungszeit implementiert. Es ist überhaupt keine Sprachfunktion - Sie erstellen die verschiedenen Aspekte Ihres Typs und kombinieren sie mit Vorlagen, wie Sie möchten.

In Sprachen wie Java, die keine Vorlagen haben, müssen Sie am Ende dedizierte Sprachfunktionen verwenden, die von Präprozessoren (z. B. AspectJ) bereitgestellt werden, um aspektorientiert zu programmieren, einfach weil die Originalsprache nicht über die entsprechenden Funktionen verfügt Implementierung von True AOP selbst.

Infolgedessen sehen AOP-Programme in C ++ im Vergleich zu Java ganz anders aus. Am wichtigsten ist jedoch, wie der Programmierer über sein Design denkt und nicht darüber, wie der Code aussieht.

Daher ist AOP sicherlich eine Entwicklungsmethode.


1
+1. Noam Chomsky sagt, dass Sprache das ist, was Erkenntnis definiert, und sie ist sowohl eingeschränkt als auch basiert auf der Art und Weise, wie Sie Ihre Gedanken formulieren. Mit anderen Worten, Sie können alles als Sprachfunktion betrachten, aber es ist nicht nützlich.
P Shved

Sie verwenden den Ausdruck "Entwicklungsmethode" und sagen dann, dass es um das Organisieren von Code geht. Das stimmt nicht - die Entwicklungsmethodik bezieht sich speziell auf den Prozess. Beispiele für Entwicklungsmethoden sind iterativ, inkrementell, sequentiell, agil usw. AOP ist keine Entwicklungsmethode. Es ist jedoch ein Programmierparadigma.
Thomas Owens

@ Thomas: Ich denke, wir können uns darauf einigen, da nicht zuzustimmen. :)
Billy ONeal

Ich denke, das Problem hierbei ist, dass bei der Softwareentwicklung viele Aspekte berücksichtigt werden müssen: Fehlerbehandlung, Umfang, Kapselung usw. Jede dieser eng fokussierten Dimensionen stellt kein eigenes Paradigma oder keine eigene Methodik dar. Meine Frage versucht wirklich aufzudecken, "sind Aspekte ein enger Bereich" wie diese Funktionen? Wenn ja, ist AOP falsch benannt.
Glenviewjeff

1

Hier spielen zwei Dinge eine Rolle - das Programmierparadigma im Vergleich zur Softwareentwicklungsmethode .

Ja, aspektorientierte Programmierung ist ein Programmierparadigma. Es nutzt bestimmte Sprachfunktionen, um die Konstrukte darzustellen, die entweder zur Ausführung einer Aufgabe oder zur besseren Lesbarkeit des Codes erforderlich sind. Es ist eine Technik, die von einem Programmierer angewendet werden kann. Häufig wird AOP neben der objektorientierten Programmierung verwendet, um Querschnittsthemen zu beseitigen. Sie können jedoch auch eine aspektorientierte Programmierung über eine funktionale Sprache hinaus implementieren. Es ist nicht unbedingt ein völlig neues Paradigma, sondern eine Erweiterung von OOP und funktionaler Programmierung, um bekannte Probleme zu lindern. Der Hauptgrund, warum ich glaube, dass es als Paradigma betrachtet werden sollte, ist, dass es die Art und Weise ändert, wie Sie über eine Lösung des Problems nachdenken. Genau wie die funktionale Programmierung, die prozedurale Programmierung, die Logikprogrammierung und die objektorientierte Programmierung drastisch unterschiedliche Lösungen für dasselbe Problem haben, fügt die aspektorientierte Programmierung dem Problemsatz eine weitere Lösung hinzu.

Nein, aspektorientierte Programmierung ist keine Entwicklungsmethode. Eine Entwicklungsmethode ist ein Framework, mit dem Sie ein Softwaresystem erstellen können. Es gibt an, welche Aufgaben Sie ausführen und wie Sie sie ausführen, von den Anforderungen bis zum Ende der Lebensdauer. AOP sagt nichts darüber. Einige Programmierparadigmen haben jedoch zu entwicklungsmethodischen Ansätzen für den Software-Lebenszyklus geführt. Es gab einen Ansatz namens Object-Oriented Software Engineering, der von Ivar Jacobson entwickelt wurdeDas Unternehmen hat einen vollständigen Lebenszyklus für das Entwerfen und Entwickeln objektorientierter Systeme festgelegt, ist jedoch in Ungnade gefallen und wurde durch UML und den Rational Unified Process ersetzt. Ich sehe ehrlich gesagt nicht, dass AOP die Methoden so beeinflusst wie OOP. Tatsächlich scheint ein Blick auf Trends darauf hinzudeuten, dass Methoden die Sprache und Paradigmen überschreiten sollten, die zum Erstellen der Software verwendet wurden. Es gibt möglicherweise AOP-fokussierte Modellierungstechniken und Vokabeln, die während des Entwurfs und der Entwicklung verwendet werden, aber ich sehe keine vollständige Methodik, die sich auf AOP konzentriert.


Das American Heritage Dictionary definiert das Paradigma als "eine Reihe von Annahmen, Konzepten, Werten und Praktiken, die eine Sichtweise auf die Realität für die Gemeinschaft darstellen, die sie teilt, insbesondere in einer intellektuellen Disziplin." Objektorientierte Programmierung fühlt sich für mich eindeutig wie eine Technik zur Modellierung der Realität an. In meiner Codierungserfahrung habe ich noch keinen geeigneten Anwendungsfall für die AOP-Sprachunterstützung gefunden, und so aufgeschlossen ich mich selbst sehe, scheint es mir an dieser Stelle ein enormer Sprung zu sein, das Paradigmenlabel auf Aspekte anzuwenden.
Glenviewjeff

@glenviewjeff So wird der Begriff "Paradigma" nicht definiert, wenn auf ein Programmierparadigma Bezug genommen wird. In diesem Zusammenhang ist ein Paradigma eine Methode zur Lösung eines Problems. Aspektorientierung ist genau das - Sie verwenden Aspekte, um ein Problem zu lösen. Wenn Sie nach der Definition des Programmierparadigmas suchen, stimmen die ersten Seiten der Google-Suche mit meiner Definition überein. Insbesondere im technischen Bereich ist es sehr häufig, dass Wörter ihre Bedeutung von ihrer allgemeinen Verwendung ändern.
Thomas Owens

1
AOP ist kein Paradigma. Es ist eine nützliche Einrichtung, aber es ist ein Merkmal in einer Landschaft, keine Landschaft für sich.
Tom Anderson

Nicht, dass ein Wikipedia-Satz ohne Quellenangabe eine verlässliche Referenz ist, aber er entspricht mit Sicherheit einer Sammlung von Google-Ergebnissen ohne Quellenangabe. Der erste Satz im Wikipedia-Artikel zum Thema "Programmierparadigma" lautet: "Ein Programmierparadigma ist ein grundlegender Stil der Computerprogrammierung." Ich glaube, dass dies völlig im Einklang mit der Definition eines Paradigmas durch das American Heritage Dictionary steht.
Glenviewjeff

1
@ Tom Anderson @ glenviewjeff Der Grund, warum es sich tatsächlich um ein Paradigma handelt, ist, dass es die Art und Weise verändert, wie Sie über ein Problem denken. Eine Funktion erleichtert die Lösung eines Problems, ändert jedoch nichts an Ihrer Denkweise. Ein Beispiel für eine Funktion ist eine for-each-Schleife. Sie ändert nichts an Ihrer Meinung zu einem Problem, bei dem eine Sammlung durchlaufen wird, macht dies jedoch einfacher. Ein Paradigma ändert drastisch, wie Sie zu Ihrer Lösung gelangen, und ich glaube, dass AOP dies tut. Ohne AOP wäre Ihre Lösung sehr, sehr anders als mit AOP.
Thomas Owens
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.