본문 바로가기

java/java 리팩토링11

08. 상속을 위임으로 바꾸기 IS-A 관계와 HAS-A 관계 IS-A 관계 일반적인 클래스와 구체적인 클래스의 관계 클래스간의 상속은 종속성이 강하므로 꼭 필요한 경우 사용하는 것이 좋다. 상속은 코드 재사용을 위한 방법이 아니다. HAS-A 관계 이미 잘 만들어진 라이브러리나 클래스를 재사용하는 방법 사용할 클래스를 포함하여 그 기능을 해당 클래스로 위임한다. 클래스간의 종속성이 약하다. 이미 잘 만들어진 클래스를 재사용하기 위해서는 상속이 아닌 위임을 사용한다. IS-A 관계가 아닌 클래스간의 상속은 HAS-A로 리팩토링 한다. 상속 상속은 좀 더 일반적인 클래스에서 그보다 구체적인 클래스가 여러개 생길 수 있는 경우에 사용한다. 상속을 통한 방법은 결합도가 강하기 때문에, 코드의 재사용의 목적으로는 사용하지 않는 것이 좋다. .. 2023. 2. 12.
07. 전략, 상태패턴 적용하기 상태 패턴 클래스 내의 여러 메서드가 하나의 상태(멤버 변수)에 의존하여 switch 문이 만들어지는 경우 하나의 메서드에서 각 상태에 따라 수행하는 로직이 다른 경우 각 상태를 클래스로 만들고 수행하는 로직은 각 클래스에 작성한다. 여러 상태가 추가되는 경우 확장이 용이하고, 상태의 전환에 대해 인스턴스를 바꾸어주면 되므로 유지보수가 쉽다. 전략 패턴 어떤 로직에 대해 여러 알고리즘(전략, 정책)이 있을 수 있는 경우 상황에 따라 전략을 교체할 수 있고, 선택이 추가될 수 있음 각 전략이 해결해야 하는 동일한 메서드가 존재함 메서드에 전략에 따른 다른 수행이 있음 전략마다 클래스로 만들고, 각 클래스에서 해당하는 로직을 수행하도록 하는 메서드 구현 상태 패턴과 전략 패턴 두 패턴 모두 상속과 오버라이딩.. 2023. 2. 11.
06. 생성자를 팩토리 메서드로 바꾸기 생성자로 인스턴스를 생성하고 싶지 않을 때 new 키워드로 객체를 생성하면 클래스의 이름이 노출됨 (되면 안되나?) Employee employee = new Employee(); 생성되는 클래스의 이름을 숨기거나, 상황에 따라 인스턴스의 생성이 가능하도록 하고자 할 때 컴파일 시간이 아닌 실행시간에 생성되는 인스턴스가 결정되어야 할 때 리팩토링과 디자인 패턴이 정답은 아니다. 이렇게 하면 좋고, 이렇게 하면 좀 더 객체지향적이고 이렇게 하면 좀 더 유지보수가 쉽다. 이 프로그램을 계속 써야 할 경우 어떻게 하면 좀 더 유연하게 만들어서 업그레이드 하는데 시간을 덜 들이는게 목적. 그러기 위하여 객체지향적으로 만들고 리팩토링을 해서 좀 더 코드를 유지보수를 쉽게 하는 것 고객 등급이 계속 늘어날 것으로 .. 2023. 2. 10.
05. if-else, if-switch 문의 분류 코드를 하위 클래스로 만들기 특정 조건(상태)에 따라, 값을 다르게 응답해줘야 하는 메서드가 많은 경우 리팩토링 가능한 방법 if문으로 분기치는 것이 아닌 특정 조건(상태)에 따른 하위 클래스를 작성하고, 하위클래스에 메서드의 로직을 구현하여 if문 없는 로직으로 구현 가능함. 새로운 조건(상태, 아래 예시에서는 VIP Customer)가 추가되면 다른 java 파일에 상속받은 하위 클래스를 생성하고 로직 구현하면 되어서 확장성은 좋고 기존 코드에서의 변경에는 닫혀있는 방법임. if - else if, switch 문으로 분류 코드를 사용할 때 발생 가능한 문제점 조건 추가 시 조건에 따른 if 문 지속 추가 필요 특정 조건일 때 로직 수정/추가 되는 경우 해당 타입 관련있는 여러 메서드 if문 분기 부분 에서 해당 내용 수정해야 .. 2023. 2. 8.