E D R , A S I H C RSS

Refactoring Discussion

Refactoring 과 관련된 ��론, 문/답변�� ����로 ������다.

�� 게������ 는 글�������다.(��� ���) ����� 맞�� ��는 부��� �� 바랍�다.


refactoring �� �� �����, Refactoring �� 결과가 같�� ��다. 라는 것��다.

Martin Folwer�� Refactoring p326(���), 10���� Parameterize Method 를 ����보면 다��과 같�� 내���� 나��다.


~cpp 
protected Dollars baseCharge() {
  double result = Math.min(lastUsage(),100) * 0.03;
  if (lastUsage() > 100) {
    result += (Math.min (lastUsage(),200) - 100) * 0.05;
  };
  if (lastUsage() > 200) {
    result += (lastUsage() - 200) * 0.07;
  };
  return new Dollars (result);
}


��것�� 다��과 같�� 대��될 다.

protected Dollars baseCharge() {
  double result = usageInRange(0, 100) * 0.03;      //--(1)
  result += usageInRange (100,200) - 100) * 0.05;
  result += usageInRange (200, Integer.MAX_VALUE) * 0.07;
  return new Dollars (result);
}

protected int usageInRange(int start, int end) {
  if (lastUsage() > start) return Math.min(lastUsage(),end) - start;
  else return 0;
}


(1) �� ��드를 ����보면 ���� 달라�� �� 다. ������ ��드는 더 ���� 값 �� 뿐��데, �� ��드���는 0 보다 ���� 값�� 가 ��게 되��다. (를 들�� lastUsage() ���값 ���면 결과가 달라다)

"MatrinFowler�� ������들�� lastUsage()가 0 ������ 값�� 대�� 동����는것����� (��드를 보고 ������면 그렇다) 당�����냐?" 라고 ����를 ��기����는 모르��만, ���� Refactoring ����결같�� ��구던 "���를 명����게"라는 부� Refactoring��라는 ��� 끼�맞��다보� ���를 �����게 �� 결과를 낳��것 같다. (������류)

�� (1)� ��드는 �래��럼 그대로 두��나, usageInRange(Integer.MIN_VALUE, 100)��로 ������는게 맞��다.

����만 ��것� �� 방����뿐, ���� ������다. lastUsage()�� 값�� Integer.MIN_VALUE ����나, Integer.MAX_VALUE 라면? (��런���� 결�� ����날 ��다고 ��담�� 는가?)

-- ����


  • ��드�� �����렸느냐�� 대�� 검�� - 만�� 로그램 내���� �����바가 맞는���� 대�� 검���� UnitTest Code ����로 ��기는게 나 것 같다고 ��각�� 드���. 글�� 내��� 결국�� �� Context 내���������� ���까. �������된다면 Test Code 는 �겠��. (��기�� '���'는 각 모� input �� 대�� output ���로 바꿔��각����� ��듯)

���� 달라������ 대�� 검���� 대���는, Refactoring �� Test Code 를 만들것��고, 로���� 따른 �� ��부는 ������ ��드����� 결론�� �������� 될 것��라는 ��각�� 듭�다. ( ����� 벗��난 ��드로 바뀌�����렸다면 Test Code ��� 검��되겠��.) ��드 ����만 보고 바로 ��못된 ��드라고 단����기 보단 �� 로그램 내������� 따르는 ��드����를 ��각���� 될 것 같다는 ��각.

  • �� ��드로 ��느냐 - �� 더 ��게 ����� 맞게 Refactoring 되���� �� �� 바로 �� Raise ��긴 ����만. 그리 ���� 닌듯 ��다. usageInRange 로 빼내기 �� ��� ��부러 ��반�� 공�� 만들다고 ���� ��까��. 그 덕�� ��드 ����만��로 뜻 ������기가 �� 모������다는 부���는 동감.

  • Refactoring�� Motivation - Pattern ���� Refactoring ���� 'Motivation' 부��� ��. ��, 무�� ������� ��러��러��게 ��드를 ��는가���다. Parameterize Method �� ���는 'couple of methods that do similar things but vary depending on a few values'�� 대�� ��리����. ��, ����� �� ��는 메��드들��긴 ��데 ��부 값들�� �������드들�� 대���는, 그 �������는 값들 parameter 로 �����게끔 ��고, 같�� �� ��는 부��� 대��� 묶����로��복 ��고, �� ��복�� 될 부��� �����������는 것��겠��. -- ��


�� 글�� ��라기보다는 ����과 ����� 듯 ���다.

���� ��� �������다.

����링�� ��드�� ��부�� ��동 바꾸�� ����면� 내부�� 구��를 변����는 것���다. ��기������ "��부�� ��동"�� ���다. ��는 �� "��부�� ��동" "��미는/�����는 ��부�� ��동"��로 봅�다 -- ������ ��리��겐 ��드 ����가 궁극�� 고 그 ��드가 ���� 드러내는 "������"�� 궁극��기 때문��.

그렇다면, 모든 ���� 공��� ����되���� ��는 것�� 닙�다. ������ �래 ��드 ����가 ����� ��디��를 "��게" ���� 낸 것��고, ��기�부��미 ���� 공��� ��������나, 늘려�����다.

����만 ��런 논��를 떠나� ��� �� 리����링 ��는가 ��각��볼 ��가 ���다. ��리는 리����링 "리����링��라는 것�� ��다 그르다"를 따��기 �� ������는 것�� 고, ��리�� 로그래밍�� ��� 되기 �� �������다.

����링��라는 ����는 논리����로 ����나 ��린 부� ��내려고 노력��는 것보다, 나��게 ��� 되면 ����고 그렇�� ��다면 나������는 것�� "로그래머"��게 득�� 되는 듯 ���다.

물론, ��론 공부��는 ��������게는 �� 다르겠����. ����만, �군가 말��듯�� "�� ��론"�� �����는 �� 가��가 ��기 ����다. ��는 리����링��� "�� ��론"보다 "������ ��론" �����다.

ps. ������말 모든 ���� 공�/기�가 고대로 ����되는 리����링�� �����다. 가�� 대������ Extract a Method ����� 모든 경���� 동���� ��동 ����를 보���� �는 �����다. 1+2가 2+1과 같�� ��다고 말�� ���다. ����만 ��리��게 ��미�������� �로 같다고 말�� �� ���다 -- 물론 ���� 따라 ����를 구��� �� ����겠��만, ��� 답 ������ 1+2, 2+1 �� ��느 것�� ���를 �� 고민�� ��는 ��겠��.

~cpp 
> { Refactoring(by Martin Fowler)�� ��못된 refactoring }
> { ��(guest),  }

[snip]

> 
> 
> �� (1)� ��드는 �래��럼 그대로 두��나, usageInRange(Integer.MIN_VALUE, 100)��로
> ������는게 맞��다.
> 
> ����만 ��것� �� 방����뿐, ���� ������다.
> 
> lastUsage()�� 값�� Integer.MIN_VALUE ����나, Integer.MAX_VALUE 라면?
> (��런���� 결�� ����날 ��다고 ��담�� 는가?)
> 

��리��겐 로그램�� ����(correctness)�� ���������다. ��것�� UnitTest나 Eiffel 같�� DBC ����로 ��당�� ����� 보�� 가능 ���다.

그 다���� ��� 리����링�� ���� ����가 ���다. ��린/��릴 로그램 "��게 리����링"��면 ���� ��린/��릴 로그램�� 나���다.

-- 김����
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:52
Processing time 0.0963 sec