프로그래밍/리팩토링

프로그래밍/리팩토링

[리팩토링] 임수변수 내용 직접 삽입

간단한 수식을 대입받는 임시변수를 사용할때는 임시변수 참조 부분을 수식으로 치환 변경 전 double basePrice = anOrder.basePrice(); return (basePrice > 1000); 변경 후 return (anOrder.basePrice() > 10000); 변경 전 double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.5; else return basePrice * 0.9; 변경 후 A if (getBasePrice() > 1000) return getBasePrice() * 0.5; else return getBasePrice() * 0.9; double getBasePric..

프로그래밍/리팩토링

[리팩토링] 메소드 삽입

호출하는 메소드의 기능이 너무 간단해서 내용이 뻔하다면 메소드 기능을 한개로 병합하고 삭제하자. 변경 전 String getRating() { return (isPassRate())? "Y" : "N"; } boolean isPassRate() { return _score > 5; } 변경 후 String getRating() { return (_score > 5)? "Y" : "N"; }

프로그래밍/리팩토링

[리팩토링] 메소드 추출

리팩토링의 주된 작업은 코드를 포장하는 메소드를 적절히 정리하는 것이다. 핵심적인 리팩토링 기법은 코드 뭉치를 별도의 메소드로 빼내는 메소드 추출, 반대로 메소드를 호출 하는 곳에 메소드 삽입 기법이다. 메소드 추출 메소드 추출시에 가장 힘든 작업은 지역변수 처리, 주로 임시변수로 힘든경우가 많음. 1. 임시변수를 메소드 호출로 전환 후 없어도 되는 임시변수 삭제 2. 임시변수가 여러곳에서 사용된다면 임시변수 분리 3. 임시변수가 너무 얽혀 있다면 자료 객체 클래스로 전환해서 사용 void printOwing(double amound) { printBanner(); print("name : " + _name); print("amount : " + amound); } void printOwing(doubl..

프로그래밍/리팩토링

리팩토링 - 코드 개선 방법

중복 코드 똑같은 코드 구조가 두 군데 이상 있을 때 그 부분을 하나로 통일하면 개선할 수 있다. 단순한 예는 한 클래스의 두 메소드 안에 같은 코드가 들어 있는 경우다. 이럴 때는 메소드 추출 기법을 적용해서 겹치는 코드를 빼내어 별도의 메소드로 만들고 그 메소드를 두 곳에서 호출 또, 한 클래스의 두 하위 클래스에 같은 코드가 들어 있는 경우가 있다. 메소드 추출 기법을 적용해서 중복을 없앤 후 메소드 상향 기법을 적용한다. 코드가 같지 않고 비슷하다면, 같은 부분과 다른 부분을 분리한 다음 템플릿 메소드 형성 기법을 알고리즘만 다르다면, 알고리즘 전환 기법을 중복코드가 중간에 있다면 주변 메소드 추출 기법을 적용한다. 서로 상관없는 두 클래스 안에 중복 코드가 있다면, 모듈 추출로 제3의 클래스로 ..

프로그래밍/리팩토링

[리팩토링] 클래스 멤버변수 이동

어떤 멤버변수 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용 되어질 때 대상 클래스안에 새 필드를 선언하고 그 필드 참조 부분을 새 필드 참조 하도록 수정하자. 시스템이 발전하고 수정되어 앞으로 나아갈수록 새 클래스가 필요해지며 기능이 여기저기서 사용이 많아진다. 따라서 그러한 것들을 여기저기로 옮겨야 하는 상황과 필요가 있다. 지금은 합리적이고 올바르다고 판단해서 설계 및 개발을 했다 해도, 나중에는 그렇지 않을 수 있다. 문제는 그러한 상황에서 아무것도 하지 않는 것이다. 변경전 AccountType 클래스에서 interestRate 필드를 더 많이 사용하는 경우 class Account { private AccountType _accountType; private double _int..

프로그래밍/리팩토링

[리팩토링] 객체간 메소드 이동

메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자 클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다. 옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다. 옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다. 변경전 class Account { private AccountType _accountType; private int _dayOverdrawn; double getOverdraftCharge() { if ( _accountType.is..

프로그래밍/리팩토링

[리팩토링] 메소드를 메소드 객체로 전환

장황한 메소드에서 각 부분을 간결한 메소드로 변경해서 보면 코드가 이해하기 쉬워 진다. ...는데 짧고 간단한 소스예제라 잘 모르겠음 ㅋ 이 방법 길고 복잡한 소스에서는 어떨까? 1. 전환할 메소드의 이름과 같은 새 클래스(Gamma)를 생성 2. 새 클래스에 final 필드로 클래스와 멤버변수를 속성 추가 3. 생성자로 필요 변수들을 받을수 있도록 함 4. 복잡한 계산 로직을 나눔 5. 메소드 객체로 전환할 클래스에서 새로 만든 클래스와 메소드를 호출 변경 전 Class Account { int gamma(int inputVal, int quantity, int yearToDate) { int importantValue_1 = (inputVal*quantity) + getDelta(); int impo..

프로그래밍/리팩토링

[리팩토링] 매개변수로의 값 대입 제거

Parameter(매개변수)는 Method 호출 시 argument 로 넘어간 변수를 칭한다. 여기서 매개변수로의 값 대입은 Parameter로 받은 변수의 값을 호출한 Method에서 어떠한 값을 대입 하는 경우를 말한다. 전달받은 매개변수에 특정 Object나 Variable등을 참조 대입시에 코드의 명료성과 코드를 보는 이에게 Call by value 인지 Call by reference 인지 혼동을 불러 일으킬수 있다. 따라서, 매개변수로의 값 대입을 코드 작성할 시 지양해야 하며, 발견시에 해당 내용을 수정할 수 있도록 하자. 변경 전 int discount (int inputVal) { if (inputVal > 50) inputVal -= 10; // below code blah blah }..

프로그래밍/리팩토링

[리팩토링] 직관적 임시변수 사용

사용된 수식이 봅잡할때 수식의 결과나 일부분을 직관적 이름의 임시변수에 대입 위에 조건문과 같은 경우에 논리조건문이 복잡해져서 코드를 보는 사람이 한번에 이해 하기 어려울때 사용하지만, 임시변수를 사용하면 메소드가 복잡해진다. 따라서, 더 좋은 방법이 없는지 생각해본 뒤 사용하자. 변경 전 if ( (platform.toUpperCase().indexOf('MAC') > -1) && (browser.toUpperCase.indexOf('IE') > -1) && wasInitialized() && (resize > 0) ) { // code blah blah } 변경 후 boolean isMac = platform.toUpperCase().indexOf('MAC'); boolean isIE = browse..

상쾌한기분
'프로그래밍/리팩토링' 카테고리의 글 목록