2011년 5월 26일 목요일

리펙토링 대상 코드

다음은 켄트백 이라는 유명한 사람(난 여기서 첨 이름을 들었지만^^)이 말한 나쁜 냄새가 나는 코드 즉 리펙토링에 대상이 되는 코드들을 지목한 것입니다.

1.        중복된 코드
●     기능이나 데이터코드가 중복된다.
●     대표적인 리펙토링 : 중복을 제거해야 한다.
2.        긴 메서드
●     메서드의 내부가 너무 길다.
●     대표적인 리펙토링 : 메서드를 적정 수준의 크기로 나누어야 한다.
3.        큰 클래스
●     한 클래스에 너무 많은 속성과 메서드가 존재한다.
●     대표적인 리펙토링 : 클래스의 몸집을 줄여야 한다.
4.        긴 패러미터 리스트
●     메서드의 패러미터 개수가 너무 많다.
●     대표적인 리펙토링 : 패러미터 개수를 줄여야 한다.
5.        두 가지 이상의 이유로 수정되는 클래스
●     한 클래스의 메서드가 2가지 이상의 이유로 수정이 되면 그 클래스는 한가지 종류의 책임만을 수행하는 것이 좋다.
●     대표적인 리펙토링 : 그 클래스가 한 가지 이유만으로 수정되도록 변경해야 한다.
6.        여러 클래스를 동시에 수정
●     특정 클래스를 수정하면 그때마다 관련된 여러 클래스들내에서 자잘한 변경을 해야한다.
●     대표적인 리펙토링 : 여러 클래스에 흩어진 유사한 기능을 한곳에 모이게 해야한다.
7.        다른 클래스를 지나치게 애용
●     특정 클래스가 메서드를 수행할 때 자신의 속성을 기반으로 처리하기보다 주로 다른 클래스로부터 데이터를 얻어와서 기능을 수행한다. 예를 들어 대부분 다른 객첵의 get 메서드를 호출하여 값을 얻는 경우 등이 이에 속한다.
●     대표적인 리펙토링 : 메소드를 그들이 애용하는 데이터가 있는 클래스로 옮긴다.
8.        유사 데이터들의 그룹 중복
●     3갱 이상의 데이터들(속성이나 패러미터 리스트)들이 여러곳에 중복되서 나타난다.
●     대표적인 리펙토링 : 해당 데이터들을 독립된 클래스로 정의한다.
9.        기본 데이터 타입 선호
●     작은 일을 위한 작은 객체를 정의하지 않고, 언어에서 제공하는 기본 데이터 타입만을 사용하려고 고집한다.
●     대표적인 리펙토링 : 기본 데이터들의 그룹이 의미있는 작업을 수행하면 그들을 별도의 클래스로 만든다.
10.     Switch. If 문장
●     지나치게 많은 case를 사용하는 switch 문장은 코드중복의 신호탄이다.
●     대표적인 리펙토링 : 폴리모피즘이나 switch 문장을 사용하여 switch 문장을 제거한다.
11.     병렬 상속 계층도
●     위의 여러 클래스를 동시에 변경 하는것의 특별한 형태로서, 연관있는 여러 클래스계층도가 지나치게 많이 생겨 중복을 유발하는 경우다.
●     대표적인 리펙토링 : 호출하는 쪽의 계층도는 그대로 유지하고 호출당하는 쪽을 변경한다.
12.     게으른 클래스
●     특정한 클래스가 충분한 일을 하지 않는다.
●     대표적인 리펙토링 : 제거하거나 다른 클래스에 합병한다. 만약 하위 클래스가 일을 충분히 하지 않으면 상속을 없애 버린다.
13.     지나친 일반화
●     지금 당장 필요하지 않은 기능을 위해 일부러 미리 상속관계를 만들어 놓는다.
●     대표적인 리펙토링 : 상속을 없애 버린다.
14.     임시속성
●     클래스의 속성들이 특정 메서드에 의해 특정 순간에 한두번만 사용되는 임시변수처럼 사용된다.
●     대표적인 리펙토링 : 그들을 사용하는 메서드 내부로 옮긴다.
15.     메시지 체인
●     특정 객체를 사용하기 위해 지나치게 많은 클래스들을 거쳐야한다.
●     대표적인 리펙토링 : 메시지 체인을 거치지 않고 직접 해당 객체를 사용하도록 코드를 변경한다.
16.     미들맨
●     너무 많은 메서드들이 자신의 기능이 단지 다른 객체에게 책임을 위임하는 경우이다.
●     대표적인 리펙토링 : 미들맨 역할을 하는 객체를 제거한다.
17.     부적절한 친밀성
●     불필요하게 자신의 정보를 다른 클래스에게 노출하며, 또한 다른 객체에 종속적인 정보들을 알내려고 한다.
●     대표적인 리펙토링 : 다른 클래스가 자신의 래퍼런스를 유지하지 못하도록 하며, 다른 객체의 정보를 알지 않고 기능을 처리할 수 있도록 변경한다.
18.     미완선된 라이브러리 클래스
●     다른 사람이 만든 라이브러리용 클래스가 자신의 원하는 일을 다 수행하지 못하는 경우이다.
●     대표적인 리펙토링 : 자신이 만드는 클래스와 라이브러리 클래스간 래핑 클래스를 만들어서 연결한다.
19.     데이터 클래스
●     특정 클래스가 단순히 속성값을 읽거나 쓰기만 하고 아무일도 하지 않는 경우이다.
●     대표적인 리펙토링 : 만약 다른 클래스의 메서드가 이 클래스에 데이터를 주로 사용한다면, 그 메서드를 데이터 클래스 안으로 이동한다.
20.     유산을 거부함
●     상위 클래스의 속성과 메서드가 하위 클래스에서 사용되지 않는다.
●     대표적인 리펙토링 : 상위 클래스와 하위 클래스를 합친다.
21.     주석
●     불필요하게 많을 만큼 주석 처리를 하지 않으면 코드를 이해 할 수 없기 때문에 주석처리를 한다.
●     대표적인 리펙토링 : 주석이 없어도 코드를 이해 할 수 있도록 소스코드를 변경한다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...