• The real contribution of the paper is not in applying useful refactorings (admittedly, this has been done before), but in providing a robust framework based on type constraints capable of proving refactorings safe for any source program.
  • I was a little surprised by the presentation's use of the 'Bad' ('unrefactorable') predicate to define the solution. I was expecting them to find a fixpoint solution to the constraint equations that maximized the type of the type unknowns that are to be refactored. It seems simpler and just as good.
  • For me, the main weakness of the paper is that I didn't come away understanding why this work is useful. Is there empirical evidence that best-practices development techniques lead to programs in need of so much refactoring that automated techniques pay off? Even if the answer is "yes," I'd be tempted to blame this on the use of OO design in domains where it just doesn't work well.
  • These techniques could probably also be used to enforce good coding style. One could ask that there be no chain of inter-related constraints above a certain length. It seems like this might correlate with program complexity, and avoiding large constraint systems could help keep programs understandable by people who didn't write them.
  • I want a way of combining refactorings. As the paper points out, performing one refactoring A may enable refactoring B. Therefore, it would be best to solve refactoring B in a way that incorporates refactoring A. Can this be done systematically in this framework, or in a fixpoint one as I suggested above? Then, given a set of refactorings and a way of combining them, I want goal-oriented refactoring so that a user can specify a change to be made in one place, and the IDE would suggest a sequence of refactorings to reach the goal.
  • First, one should work out the complexity of the algorithm and/or experiments validating the practicality of the algorithm. Also, one should pursue some user studies to see effective the refactoring is for developers.
  • One flaw in the work seems to me to lie in their proof methodology. With the caveat that I don't have much experience in reading PL related proofs, these seemed rather ad-hoc to me. In several instances, they make claims such as "three cases exist" and then go on to show the proof for those cases, with no justification to ensure that the taxonomy is correct.
  • The analysis for extract interface seems to only consider the case where an interface has no supertypes is implemented by only one class. This is the less common case and I’m not sure if it’s simple to extend the authors’ analysis to handle the more general case of multiple subclasses. The pull up members analysis rules are also stated to be imprecise and although sufficient, may produce false negatives even when it’s possible to refactor.
  • My initial impression is that there is too much manual work (proofs, invariance finding, constraint partitioning) for every refactoring that we wish to implement, but this may not be so bad in practice given that #programs >> #refactorings. ... The way refactorings are specified in the paper seemed ad-hoc. For Extract Interface, the refactoring was expressed as a recursive equation, and for Pull Up Members -- something similar to first order logic. Also, the implementation section says nothing about how the system is actually implemented.
  • My main concern with this paper is its lack of measurements of the effectiveness of the algorithm. Although I believe it probably works well, it would be nice to have some sort of user study. The authors could have instrumented Eclipse to track refactorings performed by users in the course of development, and to ask the user if he was happy with the result. Particularly with complex type inference algorithms like this one, it's quite possible for the analysis to generate overly conservative results. In this case, it might simply forbid any changes to the code
  • What I do not like about the paper is that there is no indication about the efficiency of their algorithm either empirically or theoretically.
  • The authors briefly mention that constraints for refactorings and typechecking constraints don't match exactly. It is not immediately obvious why that is.
  • I am still unsure of what the relationship is between the constraints discovered in P and P' (it appears P' is a superset).