Design Architecture/Refactoring 10

Separate Query From Modifier

매소드가 값도 반환하고 상태도 변화시킨다 ->둘로 쪼갬 before public class SeparateQueryFromModifier_before { static void checkSecurity(String[] people) { String found = foundMiscreant(people); someLaterCode(found); } static String foundMiscreant(String[] people) { for (int i = 0; i < people.length; i++) { if (people[i].equals("Don")) { sendAlert(); return "Don"; } if (people[i].equals("John")) { sendAlert(); return "J..

Replace Nested Conditional With Guard Clauses

여러 겹의 조건문을 감시 절로 전환 (Replace Nested Conditional with Guard Clauses) 메서드에 조건문이 있어서 정상적인 실행 경로를 파악하기 힘들 땐 모든 특수한 경우에 감시 절을 사용하자. 조건식은 주로 두 가지 형태를 띤다. 첫째는 어느 한 경로가 정상적인 동작의 일부인지 검사하는 형태이고, 둘째는 조건식 판별의 한 결과만 정상적인 동작을 나타내고 나머지는 비정상적인 동작을 나타내는 형태다. 만약 둘다 정상 동작의 일부분이라면 if 절과 else 절로 구성된 조건문을 사용하고, 조건문이 특이한 조건이라면 그 조건을 검사해서 조건이 true 일 경우 반환하자. 이런 식의 검사를 감시절이라고 한다. 여러 겹의 조건문을 감시 절로 전환기법의 핵심은 강조 부분이다. if-..

Decompose Conditional

조건문 분해하기 if조건문이 주절주절이면 의미를 확인하기 어려우므로, 매소드로 빼내는 것. 이건 원래 하던거네.. before import java.time.LocalDate; public class DecomposeConditional_before { static class Stadium { //... public double summerRate; public double winterRate; public double winterServiceCharge; public Stadium(double summerRate, double winterRate, double winterServiceCharge) { super(); this.summerRate = summerRate; this.winterRate = ..

Replace type Code with Class

Replace Type Code with Class – 어떤 field type(예를 들어, String 또는 int 등)이 부적합한 값의대입이나 유효하지 않은 동일성 검사(비교)를 방지하지 못한다면,field type 을 클래스로 바꿔 값의 대입과 동일성 검사에 제약조건을 부여한다 – 동기 • Type code를 리팩토링하는 주된 이유는 코드의 타입 안정성을 보장하려는 것이다. – 장점 • 부적절한 값의 대입이나 유효하지 않은 동일성 검사로부터 코드를보호한다. – 단점 • 타입 안정성이 결여된 경우보다 더 많은 코드가 필요하다. 기능에 영향을 주지않는 숫자형 type code가 있는 클래스가 있을 때 새 클래스로 바꾼다. • type code를 사용하는 method들은 상징적인 이름이 아닌 숫자만을 인..

Encapsulate Collection

메소드가 collection을 반환할 때 • 그 메소드가 읽기전용 view를 반환하게 수정하고 add() 와 delete() 메소드를 작성한다. Before import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class EncapsulateCollection_before { static class Course { String name; boolean isAdvanced; public Course(String name, boolean isAdvanced) { this.name = name; this.isAdvanced = isAdvanced; }; public boolean isAdvanced() { return..

Replace Data Value with Object

데이터의 기능이 복잡해지면 객체로 만든다. Before public class ReplaceDataValueWithObject_before { static public class Order { private String customer; public Order(String customer) { this.customer = customer; } public String getCustomer() { return this.customer; } public void setCustomer(String arg) { this.customer = arg; } } public static void main(String[] args) { Order order = new Order("david"); System.out.pr..