I'm investigating some technology which might allow one to do some fairly large scale transformations of legacy ABL code more or less automatically. I'm not talking yet about something that would fully modernize an application, but rather about some very specific changes that would move the application in a direction where it was easier to modernize and maintain.
What I am interested in at this point is sharing with you the kinds of transformations that I am looking at and asking for input on variations or additional transformations that might interest you. Things I have thought of so far.
Identify opportunities for creating superprocedure or class-based managers to hold different sets of context. Refactor references to existing shared variables to use these managers instead. Identify unused or unnecessary references and remove them. Identify instances where a shared variable is being used like a parameter and replace it with an explicit parameter. Probably not 100% automated since it probably takes a human to write the managers, but those are simple and hopefully everything else would be automated.
Data Access Layer Separation
Analyze application to determine how data is accessed. Create data access object using generator tool (semi-automated) that provides the needed services. Refactor application to replace all direct references to tables with references to data access objects.
UI Layer Separation
Analyze the application and apply transformations such that existing ABL code with UI is turned into a component which interacts with the UI via an interface. Generate a new UI layer using one of several technologies that will interface with these components. Should include WUI with Ajax and OpenClient at a minimum and could include ABL GUI for .NET if there is sufficient interest. Generated UI layer will fulfill the same basic contract as the existing UI, but will probably need tuning for optimum aesthetics.
None of these are expected to be magic, i.e., some work will be required to make the transformation happen correctly on any given code base and the result will be functionally correct, but may require some additional effort to be aesthetically ideal. But, the costs should be dramatically lower than trying to do the same thing by hand. I can't do any of these things today, but rather am at the point of exploring the technology to see what can be done, but there is reason to believe that all are possible.
So, what else should I be looking at?