MA ∧ B ∈ MB new B(exp) = ⇒ replace( [new B(exp)], [FB.getB(exp)] ), if FB = factory(B, [exp] ) ∧ can(A, access, FB) new B(exp) = ⇒ replace( [new B(exp)], [FB.getB(exp)] ), if FB = gen_factory(B, [exp] ) ∧ can(A, access, FB) A cannot-declare B B b; S = ⇒ replace( [B], [B ] ), if B ∈ super(B) ∧ typecheck( [B b ; S] ) ∧ B / ∈ MB B b = exp; S = ⇒ propagate( [exp], b, [S] ), if can(A, access, B) A cannot-access B b.f = ⇒ replace( [b.f], [D; c.g] ), if g = delegate(f) ∧ D = gen_decl(type(c), g) ∧ type(c) / ∈ MB b.f = ⇒ g = extract( [b.f] ), move(g, C), if C = suitable_class(g) ∧ can(A, access, C) g { T v = exp_b } = ⇒ promote(g, v, [exp_b] ), if ∀C ∈ call_sites(g), can(C, access, B) A cannot-throw B g (p) throws B { S } = ⇒ remove( [throws B] ), if typecheck( [g (p) { S }] ) g (p) throws B { S } = ⇒ remove( [throws B] ), replace( [S], [try {S} catch (B b){S }] ), if can(A, declare, B) ∧ S = user_code() A cannot-derive B A extends | implements B = ⇒ move(A, M), if M = suitable_module(A) ∧ can(A, extends | implements, B) CSMR ERA, 2012 Recommending Refactorings to Reverse Software Architecture Erosion 7 / 10 We have formalized a set of more than 20 refactoring recommendations!