Constraint-Based Design Recovery for Software Reengineering