Alarmnummer: Ik denk zelfs dat je aan de hand van metadata allerlei code kan genereren.
Dat is inderdaad een sterk punt van het annotatie systeem. Het is een goede zet om hier een standaard constructie voor op te nemen en niet vaag en ongestructureerd info in commentaar op te nemen. Het hele idee is dat je methode/klassen etc kan annoteren met informatie. Deze informatie kan at runtime gebruikt worden door API's, maar ook voor het genereren van code met behulp van tools (is in feite te vergelijken met interpretatie/compilatie onderscheid). Attributen zijn niets anders dan gegevens die zich richten op bepaalde tools. De tools hebben kennis van deze gegevens en kunnen daar dus iets mee gaan doen.
Voorbeelden van tools:
- compiler
- web-service of andere remoting libraries
- code of documentatie generator
- instrumentatie tool (waarbij er code toegevoegd wordt aan de bestaande code)
- verifieren van bepaalde zaken.
Het centrale idee is dat niet alle metadata in een taal kan zitten. Op dit moment zie je in vrijwel alle talen al vormen van metadata die gericht is op de compiler. Denk bijvoorbeeld eens aan de access modifiers. Deze zou je ook kunnen zien als attributen van een klasse/methoden die zich richten op de compiler. Ook een type aanduiding zou je al als een attribuut kunnen zien, die zich met name richt op de type checker. Je zou zelfs pre- en post condities als attributen kunnen zien.
Het is dus een sublieme zet om in deze tijd met attributen te komen. Code generatie en diverse meta-tools zijn behoorlijk hot aan het worden en attributen kunnen hier zeer goed bij helpen om een standaard manier van metadata te bieden ipv gerommel in commentaar.
Alarmnummer: Het heeft ook wel wat eigenschappen volgens mij van OAP (Aspect Oriented Programming) omdat meer in aspecten van je systeem kan denken en ook makkelijk een aspect kan toevoegen.
Er zijn inderdaad wel wat parallellen, maar er zijn ook wel verschillen: een centraal idee van AOP is dat je code (aspecten) kan invoegen zonder dat je op al deze plaatsen precies aangeeft dat je deze code wilt hebben. Met attributen ligt dit wel wat anders: je kan in feite alleen maar abstraheren. Ik denk dat er nog het meeste overeenkomst is als je ervan uit gaat dat de code wordt geinstrumenteerd door een AOP-achtig tool die instructies in attributen gebruikt. Ik denk dat deze aanpak echter lastig te vergelijken is met de aanpak van echte AOP tools als AspectJ.
Overigens had ik zelf misschien nog wel liever attributen in de vorm van XML gezien: pure data bij methoden. Je ziet dat attributen in feite ook zo gebruikt worden, waarbij je dan in feite klassen gaat implementeren om de data op te slaan. Ik vind dit een onhandige werkwijze.
Ook is het jammer dat er (AFAIK) geen gestandaardiseerde methode om is om
buiten een CompilationUnit (file) metadata over de hele CompilationUnit te specificeren. Dit zou nog wat interessante mogelijkheden bieden omdat je deze metadata dan kan raadplegen voordat je uberhaupt de CompilationUnit gaat proberen te begrijpen (parsen bijvoorbeeld).
Dit idee zie je terug in
Stratego waarbij er meta files zijn bij Stratego modules. Op dit moment worden deze meta files alleen nog gebruikt om de gebruikte syntax van een Stratego module te specificeren ten behoeve van
Meta Programming with Concrete Object Syntax. Er kan echter willekeurige data (in XML achtige vorm) in worden opgenomen, die dan door andere tools benut kan worden. Overigens kent Stratego nog geen metadata in Stratego modules zelf, dat is zeker iets waar aan gewerkt moet worden.
Ik neem aan dat je al weet dat er voor Java ook een JSR loopt voor metadata:
JSR 175: A Metadata Facility for the Java Programming Language