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; }
"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 되������ 것��� ��� ������ 바로 ������ 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 ������로 ���당��� �����까��� 보��� 가능 �����다.
그 다������ ��로��� 리������링��� ��������� 따��� ������가 ��������다. ���린/���릴 ��� ���는 ���로그램��� "���게 리������링"���면 ������ ���린/���릴 ��� ���는 ���로그램��� 나�����다.
-- 김������