Design Architecture 57

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..

Quality Model

구분품질 속성 시스템품질 속성 가용성(Availability) 변경용이성(Modifiability) 성능(Performance) 보안성(Security) 사용편의성(Usability) 시험용이성(Testability) 비즈니스품질 속성 시장 적시성(Time to Market) 비용과 이익(Cost and Benefit) 시스템 프로젝트 생명주기(Projected Lifetime of the System) 목표 시장(Targeted Market) 신규 발매 일정(Rollout Schedule) 노후 시스템과 통합(Integration with Legacy System) 아키텍처품질 속성 개념적 무결성(Conceptual Integrity) 정확성과 안정성(Correctness and Completeness..