리펙토링Nooslab. | 윤한석2차코드 속 나쁜 냄새(1)
코드 속 나쁜 냄새
나쁜 냄새의 종류들● 중복된 코드● 긴 메소드● 거대한 클래스● 긴 파라미터 리스트● 확산적 변경● 산탄 수술● 기능에 대한 욕심● 데이터 덩어리● 기본 타입에 대한 강박관념● Switch 문● 평행 상속 구조● 게으른...
● 중복된 코드(Duplicated Code)● 같은 클래스에 서로 다른 두 메소드 안에 같은 코드→ Extract Method● 동일한 부모를 가진 두 개의 자식 클래스에서 같은 코드가 나타나는 경우→ Extract ...
● Substitute AlgorithmString foundPerson(String[] people){for(int i=0; i < people.length; i++){if(people[i].equals(“Don”))...
● Extract Class두 개의 클래스가 해야 할 일을 하나의 클래스가 하고 있는 경우PersonnameofficeAreaCodeofficeNumbergetTelephoneNumberTelephone NumberAr...
● 긴 메소드(Long Method)대부분의 경우 Extract Method.파라미터와 임시변수가 많다면,● Replace Temp with Query● Introduce Parameter Object● Preserve...
● 거대한 클래스 (Large Class)클래스 하나가 너무 많은 일을 하려하면 자연스럽게 지나치게 많은인스턴스 변수가 나타난다.→ 중복된 코드가 존재할 확률이 높다.● Extract Class● Extract Subc...
● 긴 파라미터 리스트(Long Parameter List)긴 파라미터 리스트는 이해하기도 어렵고, 일관성이 없거나 사용하기어렵다. 파라미터 리스트는 짧은 것이 좋다.이미 알고 있는 객체에 요청하여 파라미터 데이터를 얻...
● 확산적 변경(Divergent Change)코드를 변경할 때 명확한 한 곳을 집어 변경할 수 없는 경우하나보다는 두개의 객체로 만드는 것이 더 좋은 상황도 있다.변화를 다룰 때는 하나의 클래스를 수정하는 선에서 끝나...
● 산탄총 수술(Shotgun Surgery)확산적 변경과 비슷하지만 정 반대이다.변경이 필요할때 많은 클래스를 조금씩 수정해야 한다면 그것이산탄총 수술의 냄새다.→ 변경해야 할 곳이 여러군데이면 찾기도 어렵고 변경해야...
● 기능에 대한 욕심 (Feature Envy)메소드가 자신이 속한 클래스보다 다른 클래스에 관심을 가지고있는 경우이다.가장 흔한 욕심은 데이터에 대한 욕심이다.가장 기본적인 규칙은 같이 변하는 것을 모으는 것이다.→ ...
● 데이터 덩어리(Data Clump)데이터 아이템은 아이들과 같아서 몰려다니기를 좋아한다.→ 함께 몰려다니는 데이터의 무리는 그들 자신의 객체로 만들어져야한다.
● 기본 타입에 대한 강박관념(Primitive Obsession)객체의 유용한 점 중의 하나는 기본 타입과 클래스를 이용한 커스텀데이터 타입의 경계를 흐리게 하거나 아예 없애버린 다는 것이다.class BloodGro...
● Switch 문(Switch Statements)객체지향 코드의 가장 명확한 특징 중 하나는 switch문이 비교적 적게쓰인다는 것이다.switch문의 본질적인 문제는 코드가 중복된다는 것이다.→ 한 switch문에...
Replace Conditional withPolymorphismfloat getSpeed() {switch(_type){case EUROPEAN:return getBaseSpeed();case AFRICAN:retur...
● 평행 상속 구조(Parallel Inheritance Hierarchies)평행 상속 구조는 실제로 산탄총 수술의 특별한 경우이다.이런 경우 한 클래스의 자식클래스를 만들면, 다른 곳에도 모두자식 클래스를 만들어야 ...
Upcoming SlideShare
Loading in …5
×

리펙토링 2차 코드 속 나쁜 냄새(1) -Nooslab 세미나 윤한석

1,249
-1

Published on

Nooslab 세미나- 윤한석 (2013.06.07 금)
리펙토링 2차, 코드 속 나쁜 냄새(1)

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,249
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
16
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

리펙토링 2차 코드 속 나쁜 냄새(1) -Nooslab 세미나 윤한석

  1. 1. 리펙토링Nooslab. | 윤한석2차코드 속 나쁜 냄새(1)
  2. 2. 코드 속 나쁜 냄새
  3. 3. 나쁜 냄새의 종류들● 중복된 코드● 긴 메소드● 거대한 클래스● 긴 파라미터 리스트● 확산적 변경● 산탄 수술● 기능에 대한 욕심● 데이터 덩어리● 기본 타입에 대한 강박관념● Switch 문● 평행 상속 구조● 게으른 클래스● 추측성 일반화● 임시 필드● 메세지 체인● 미들 맨● 부적절한 친밀● 다른 인터페이스를 가진 대체 클래스● 불완전한 라이브러리를 가진 클래스● 데이터 클래스● 거부된 유산● 주석
  4. 4. ● 중복된 코드(Duplicated Code)● 같은 클래스에 서로 다른 두 메소드 안에 같은 코드→ Extract Method● 동일한 부모를 가진 두 개의 자식 클래스에서 같은 코드가 나타나는 경우→ Extract Method → Pull Up Method→ Form Template Method→ Substitute Algorithm → Extract Class
  5. 5. ● Substitute AlgorithmString foundPerson(String[] people){for(int i=0; i < people.length; i++){if(people[i].equals(“Don”))return “Don”;else if(people[i].equals(“John”))return “John”;else if(people[i].equals(“Kent”))return “Kent”;}}String foundPerson(String[] people){List candidates = Arrays.asList (new String[]{“Don”,”John”,”Kent”});for(int i=0; I < people.length; ++i){if(candidates.contains(people[i]))return people[i];return “”;}}알고리즘 코드의 동작을 동일하게 하면서 더 명확한 코드로 바꾸는것.
  6. 6. ● Extract Class두 개의 클래스가 해야 할 일을 하나의 클래스가 하고 있는 경우PersonnameofficeAreaCodeofficeNumbergetTelephoneNumberTelephone NumberAreaCodeNumbergetTelephoneNumberPersonnameOfficeTelephone: TelephoneNumbergetTelephoneNumber
  7. 7. ● 긴 메소드(Long Method)대부분의 경우 Extract Method.파라미터와 임시변수가 많다면,● Replace Temp with Query● Introduce Parameter Object● Preserve Whole Object그래도 여전히 많다면...● Replace Method with Method Object● 주석은 의미적 거리(semantic distance)→ 주석을 기반으로 뽑아낼 메소드의 이름을 정할수 있음.조건문과 루프를 추출하려면● Decompose Conditional
  8. 8. ● 거대한 클래스 (Large Class)클래스 하나가 너무 많은 일을 하려하면 자연스럽게 지나치게 많은인스턴스 변수가 나타난다.→ 중복된 코드가 존재할 확률이 높다.● Extract Class● Extract Subclass● Extract Interface을 복합적으로 사용하여 책임과 일을 쪼개준다.GUI컨트롤에서데이터의 동기화가 필요할 경우→ Duplicate Observed Data
  9. 9. ● 긴 파라미터 리스트(Long Parameter List)긴 파라미터 리스트는 이해하기도 어렵고, 일관성이 없거나 사용하기어렵다. 파라미터 리스트는 짧은 것이 좋다.이미 알고 있는 객체에 요청하여 파라미터 데이터를 얻을 수 있다면→ Replace Parameter with Method데이터 뭉치를 그 객체 자체로 바꾸려면→ Preserve Whole Object객체와 관계 없는 여러 개의 데이터 아이템이 있다면→ Parameter Object
  10. 10. ● 확산적 변경(Divergent Change)코드를 변경할 때 명확한 한 곳을 집어 변경할 수 없는 경우하나보다는 두개의 객체로 만드는 것이 더 좋은 상황도 있다.변화를 다룰 때는 하나의 클래스를 수정하는 선에서 끝나야 하며,새로운 클래스는 그 변화를 반영하는 것이어야 한다.깔끔하게 하기 위해선 특정 원인에 대해 변해야 하는것을 모두찾은 다음, Extract Class를 사용하여 하나로 묶어야 한다.
  11. 11. ● 산탄총 수술(Shotgun Surgery)확산적 변경과 비슷하지만 정 반대이다.변경이 필요할때 많은 클래스를 조금씩 수정해야 한다면 그것이산탄총 수술의 냄새다.→ 변경해야 할 곳이 여러군데이면 찾기도 어렵고 변경해야 할중요한 사항을 빼먹기도 쉽다.● Move Method● Move Field● Inline Class
  12. 12. ● 기능에 대한 욕심 (Feature Envy)메소드가 자신이 속한 클래스보다 다른 클래스에 관심을 가지고있는 경우이다.가장 흔한 욕심은 데이터에 대한 욕심이다.가장 기본적인 규칙은 같이 변하는 것을 모으는 것이다.→ 데이터와 그 데이터를 이용하는 동작은 보통 같이 변하지만,예외도 있다. 이런 예외의 경우는 동작을 옮겨서 한 곳에서만 변하도록 한다.
  13. 13. ● 데이터 덩어리(Data Clump)데이터 아이템은 아이들과 같아서 몰려다니기를 좋아한다.→ 함께 몰려다니는 데이터의 무리는 그들 자신의 객체로 만들어져야한다.
  14. 14. ● 기본 타입에 대한 강박관념(Primitive Obsession)객체의 유용한 점 중의 하나는 기본 타입과 클래스를 이용한 커스텀데이터 타입의 경계를 흐리게 하거나 아예 없애버린 다는 것이다.class BloodGroup //Replace Type Code with Class{public static final BloodGroup O = new BloodGroup(0);public static final BloodGroup A = new BloodGroup(1);public static final BloodGroup B = new BloodGroup(2);public static final BloodGroup AB = new BloodGroup(3);private static final BloodGroup[] _values = { O,A,B,AB };private final int _code;private BloodGroup(int code){_code = code;}public int getCode(){ //java와 같은 특정 언어는 switch문에 정수형만 쓸 수 있기 때문에.return _code;}public static BloodGroup getBloodObjectByCode(int arg){return _values[arg];}}
  15. 15. ● Switch 문(Switch Statements)객체지향 코드의 가장 명확한 특징 중 하나는 switch문이 비교적 적게쓰인다는 것이다.switch문의 본질적인 문제는 코드가 중복된다는 것이다.→ 한 switch문에 코드를 추가하려면 중복된 모든 switch문을찾아 바꿔 주어야 한다.→ 객체지향 개념중 다형성이 이런 문제를 해결하는데 훌륭한 방법을제공한다.
  16. 16. Replace Conditional withPolymorphismfloat getSpeed() {switch(_type){case EUROPEAN:return getBaseSpeed();case AFRICAN:return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;case NORWEGIAN_BLUE:return (_isNailed)? 0 : getBaseSpeed(_voltage)}}BirdgetSpeedEuropeangetSpeedAfricangetSpeedNorwegian BluegetSpeed
  17. 17. ● 평행 상속 구조(Parallel Inheritance Hierarchies)평행 상속 구조는 실제로 산탄총 수술의 특별한 경우이다.이런 경우 한 클래스의 자식클래스를 만들면, 다른 곳에도 모두자식 클래스를 만들어야 한다.중복을 제거하는 일반적인 전략은 한쪽 상속 구조의 인스턴스가 다른 쪽 구조의 인스턴스를 참조하도록 만드는 것이다.● Move Method● Move Field를 사용하여 참조하는 쪽의 상속구조를 없앨 수 있다.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×