Ein wesentlich anderer Ansatz mit ähnlicher allgemeiner Zielsetzung ist die AspektOrientierteProgrammierung.
In der aspekt-orientierten Programmierung strebt man dieses Ziel an, indem man separat definierte Codefragmente zur Compilierzeit nach vorgeschriebenen formalen Regeln an bestimmten Stellen (z.B. am Beginn oder Ende des Rumpfes bestimmter oder aller Methoden einer Klasse) "einwebt", z.B. wenn man jeden Aufruf einer oder aller Methoden protokollieren oder auf Zulässigkeit (Erfüllung von Vorbedingungen) prüfen möchte.
Die merkmals-orientierte Programmierung arbeitet im Unterschied dazu nicht mit Codefragmenten unterhalb der Methoden-Ebene, sondern zielt darauf, Anwendungsklassen aus einem Basis-Feature durch Hinzufügen weiterer, wählbarer Features zusammenzusetzen. Dabei wird ein Merkmal/Feature i.a. ähnlich wie ein Interface in Java beschrieben.
Die Features können nach dem Zusammensetzen miteinander interagieren, was i.a. die Notwendigkeit mit sich bringt, die betroffenen Methoden der beteiligten Features zu re-implementieren. Deshalb sind i.a. nicht nur spezielle Ausdrucksmittel vorgesehen, die das Zusammensetzen von Merkmalen/Features beschreiben, sondern auch solche, die das Auflösen von Feature-Interaktionen spezifizieren.
Beispiel:
Basis-Feature: Die elementare Funktionalität eines Stacks mit den üblichen push- und pop-Methoden.
Hinzugefügtes Feature: Ein Zähler/Counter, der die aktuelle Zahl der Stack-Elemente zurückgibt.
Es ist klar, dass die push/pop-Methoden re-implementiert werden müssen, damit der Counter immer den aktuellen Zählerstand wiedergibt.
In der aktuellen Fachdiskussion geht es hauptsächlich um sprachliche Ausdrucksmittel für die Feature-Spezifikation und -Zusammensetzung und um Verfahren, dies alles übersichtlich, handhabbar und fehlerunempfindlich zu machen. Siehe z.B.
wo auch das Stack-Beispiel ausführlicher dargestellt wird.
Darüber hinaus gibt es Versuche, aspekt- und merkmals-orientierte Programmierung miteinander zu "verheiraten". Siehe z.B.