Generalisierung constraintbasierter Refaktorisierung
Zusammenfassung der Projektergebnisse
Software unterliegt der ständigen Änderung. Um dem änderungsbedingten Strukturverlust entgegenzuwirken, sind regelmäßig sog. Refaktorisierungen, das sind i. w. funktionserhaltende, strukturverändernde Modifikationen, notwendig. Da aber selbst einfache Refaktorisierungen von nicht offensichtlichen Nebenbedingungen abhängen und umfangreiche Änderungen notwendig machen können, ist ihre manuelle Durchführung ausgesprochen fehleranfällig. Sog. Refaktorisierungswerkzeuge, die Refaktorisierungen automatisch durchführen, können daher einen wesentlichen Beitrag zur Produktivität leisten. Mit diesem Projekt wurde der Ansatz der constraintbasierten Refaktorisierung, der zuvor ausschließlich für typbezogene Refaktorisierungswerkzeuge (wie z. B. die Generalisierung eines in einer Deklaration verwendeten Typs) untersucht worden war, auf beliebige Merkmale von Deklarationen ausgedehnt. Damit konnten neben den bei Refaktorisierungen häufig auftretenden Namensproblemen (die Umbenennung ist selbst eine häufige Refaktorisierung!) insbesondere auch die Probleme gelöst werden, die sich aus der Herauslösung eines Programmelements aus seinem aktuellen Kontext und der Einbettung in einen neuen Kontext (Verschieberefaktorisierungen) ergeben. Als besondere Stärke des constraintbasierten Ansatzes hat sich dabei herausgestellt, dass er neben den mit einer Refaktorisierung unmittelbar verbundenen primären Änderungen auch solche berechnet, die die Refaktorisierung erst möglich machen. Tatsächlich entfällt beim constraintbasierten Refaktorisieren die Formulierung von Vorbedingungen, an deren vollständiger Fassung nahezu alle imperativen Implementierungen von Refaktorisierungswerkzeugen scheitern - stattdessen ergibt sich die Nichtanwendbarkeit einer Refaktorisierung aus der Unlösbarkeit des damit verbundenen Constrainterfüllungsproblems. In aller Regel kann die Erfüllbarkeit aber herbeigeführt werden, indem weitere Merkmale eines Programms für die beabsichtigte Refaktorisierung als änderbar gekennzeichnet werden, wodurch dann aber auch mit der beabsichtigten Refaktorisierung nur mittelbar in Zusammenhang stehende Änderungen durchgeführt werden. Die Refaktorisierungswerkzeuge werden dadurch häufiger anwendbar. Ein weiteres zentrales Ergebnis des Projekts ist die Erkennmis, dass die constraintbasierte Implementierung sprachübergreifender Refaktorisierungen nur eines geringen Aufwandes bedarf, wenn die dazu notwendigen Änderungen in Programmen der beteiligten Sprachen jeweils für sich durch Constraints vollständig abgedeckt sind (also wenn entsprechende constraintbasierte Refaktorisierungen für die beteiligten Sprachen bereits umgesetzt sind). In diesem Fall müssen nur noch die sprachübergreifenden Abhängigkeiten zwischen Programmelementen aufgebrochen werden, indem für jede existierende Abhängigkeit von einem Programmelement in einer anderen Sprache in der eigenen Sprache ein Stellvertreterelement eingeführt wird, dessen Merkmale nach den Regeln der eigenen Sprache durch entsprechende Constraints eingeschränkt werden (und zwar so, als ob es die Abhängigkeit zur anderen Sprache gar nicht gäbe). Die Merkmale dieser Stellvertreterelemente werden dann zusätzlich durch Constraints eingeschränkt, die sie mit den Merkmalen des Programmelements der andern Sprache, das sie vertreten, verbinden. Da Constraints grundsätzlich ungerichtete Beziehungen darstellen, propagieren sich auf diese Weise Änderungen in beide Richtungen über die Sprachgrenze hinweg. Bei den Arbeiten zur sprachübergreifenden Refaktorisierung hat sich gezeigt, dass Änderungen, die sich aus einer Refaktorisierung eines Programmteils in einer Sprache in einem Programmteil der anderen Sprache ergeben, selbst nicht unbedingt einer der bekannten (katalogisierten) Refaktorisierungen entsprechen. Gleichwohl können diese Änderungen mit dem constraintbasierten Ansatz wie Refaktorisierungen durchgeführt werden, sind also insbesondere garantiert bedeutungserhaltend. Dies führte zur Einführung namenloser Ad-hoc-Refaktorisierungen, also von Refaktorisierungen, die keinem bestimmten Muster folgen, sondern für den jeweiligen Anwendungszweck individuell spezifiziert werden. Dazu sind lediglich die zwingend zu ändernden Merkmale (mit ihren neuen Werten) und die optional änderbaren Merkmale, für die der Constraint solver neue Werte berechnen darf, anzugeben. Schließlich wurde in dem Projekt gezeigt, wie sich die für die constraintbasierte Refaktorisierung benötigten Constraintregeln aus existierenden Wohlgeformtheitsregeln einer Sprache ableiten lassen. Damit, und in Verbindung mit dem im Rahmen des Projekts ebenfalls entwickelten Framework zur constraintbasierten Refaktorisierung, sinkt der Entwicklungsaufwand für constraintbasierte Refaktorisierungswerkzeuge erheblich. Eindrucksvoller Beleg für den wissenschaftlichen Erfolg des Projekts ist die Qualität der daraus hervorgegangenen Veröffentlichungen: Nahezu sämtliche Forschungsresultate wurden in anerkannten Organen mit hoher internationaler Sichtbarkeit publiziert.
Projektbezogene Publikationen (Auswahl)
- „A refactoring constraint language and its application to Eiffel" in: Proc. of the 25th European Conference on Object-Oriented Programming (ECOOP 2011) 255-280
F Steimann, C Kollee, J von Pilgrim
- „A comprehensive approach to naming and accessibility in refactoring Java programs" IEEE Transactions on Software Engineering 38:6 (2012) 1233-1257
M Schäfer, A Thies, F Steimann, F Tip
- „Constraint-based refactoring with foresight" in: Proc. of the 26th European Conference on Object-Oriented Programming (ECOOP 2012) 535-559
F Steimann, J von Pilgrim
- „Refactorings without names" in: Proc. of the 27th IEEE/ACM Intemational Conference on Automated Software Engineering (ASE 2012) 290-293
F Steimann, J von Pilgrim
- „From well-formedness to meaning preservation: Model refactoring for almost free" Journal on Software & Systems Modeling (April 2013)
F Steimann
(Siehe online unter https://doi.org/10.1007/s10270-013-0314-z) - „Model/code co-refactoring: An MDE approach" in: Proc. of the 28th lEEE/ACM International Conference on Automated Software Engineering (ASE 2013) 682-687
J von Pilgrim, B Ulke, A Thies, F Steimann