[[TableOfContents]] == Data Structures Progams == * 주로 Refactoring과 Table Driven Programming을 설명하고 있다. === A survey program === * 별로 볼건 없고... 아무도 하지 않을 상황을 예로 들어놓은 것 같다. 왠만큼 프로그램 배운 사람이라면 당연히 배열로 처리할 것을 몇 백개의 변수로 처리하는 상황을 보여주고 있다. 그러면서 하는 말 : 많은 변수를 쓰고 있으면 관련되는 것으로 묶어서 배열로 처리하라. 이게 주제다. === Form-Letter Programming === * Column1의 이상한 소트와 더불어, 지금까지 본 내용중에서 꽤 신선한 내용이다. 왜 이렇게 하는지는 잘 모르겠지만... 역시 확장성을 위한 것 같다. * 예제 : 어느 사이트에 로그인하면 DB에서 사용자 데이터를 긁어와서 보여준다. 이것은 책에 있는 예제고, 이것을 간단히 C++, 그리고 파일 입력으로 변형을 해보면, * 출력 양식 : 변하는 것은 Kang-In-Su, Computer, Seoul, Su-saek이다. {{{~cpp Hello, Kang-In-Su. We'll send a Computer to you. Address : Seoul, Su-saek }}} {{{~cpp // 일반적으로 대부분 이렇게 할 것이다. #include #include #include using namespace std; int main() { string name, good, dong, city; ifstream fin("data.dat"); getline(fin, name); getline(fin, good); getline(fin, city); getline(fin, dong); cout << "Hello, " << name << ".\nWe'll send a " << good << " to you. \nAddress : " << city << ", " << dong << endl; return 0; } // Programming Pearls에서 제시하는 방법은 #include #include #include using namespace std; int main() { string data[4]; string scheme = "Hello, $0. \nWe'll send a $1 to you. \nAddress : $2, $3\n"; ifstream fin("data.dat"); for(int i = 0 ; i < 4 ; ++i) getline(fin, data[i]); int index = -1; while(1) { ++index; if(scheme[index] != '$') cout << scheme[index]; else { ++index; if(scheme[index] == '$') cout << '$'; else if(scheme[index] >= '0' && scheme[index] <= '3') cout << data[scheme[index] - 48]; else { cout << "scheme error." << endl; break; } } if(scheme[index] == '\0') break; } return 0; } }}} * 이렇게 생겼다. 굉장히 해괴망측하다. 아직 이렇게 하는 것에 대한 장점은 잘 모르겠다. === 3.3 An Array of Examples === * 우리의 리팩토링이다. 엄청난 중복이 있는 예제를 보자. 이건 C++로 하기가 좀 그러니, 책에 주어진 대로 VB를 예로 들어보자. 메뉴의 아이템이 10개가 있다. 하나를 클릭할때마다 그 아이템에 체크를 하고 싶다. 중복 짱!인 예제로 다음과 같은 예제가 있을수 있다. {{{~cpp sub menuitem0_click() menuitem0.checked = 1 menuitem1.checked = 0 menuitem2.checked = 0 menuitem3.checked = 0 menuitem4.checked = 0 menuitem5.checked = 0 menuitem6.checked = 0 menuitem7.checked = 0 menuitem8.checked = 0 menuitem9.checked = 0 sub menuitem1_click() menuitem0.checked = 0 menuitem1.checked = 1 menuitem2.checked = 0 menuitem3.checked = 0 menuitem4.checked = 0 menuitem5.checked = 0 menuitem6.checked = 0 menuitem7.checked = 0 menuitem8.checked = 0 menuitem9.checked = 0 sub menuitem2_click() ... ... }}} * 딱 보면 알겠지만, 굉장히 우울하다. 저런게 10번 반복되는 것이다. 쓰잘데기 없는 코드가 무려 110 줄이나 된다. 하지만 리팩토링을 공부했다면 쉽게 빼낼수가 있을 것이다. 그 방법으로 VB에서는 각각의 메뉴 아이템을 배열로 만들수가 있다. 배열로 만든 다음 메소드 추출을 이용하면, (예제는 C++로 다시 바꾼다.--; 비베 문법을 잘 몰라서.) {{{~cpp const int NUM_ITEMS = 10; void menuitem_click(int choice) { for(int i = 0 ; i < NUM_ITEMS ; ++i) menuitem[i].checked = false; menuitem[choice] = true; } void menuitem0_click() { menuitem_click(0); } void menuitem0_click() { menuitem_click(1); } ... ... }}} * 이런 식으로 가면 된다는 것이다. 간단한 것이니 그냥 넘어가자. === Structuring Data === * 잘 구조화된 데이터의 의미는 계속 변천되어 왔다. * 잘 지어진 변수 이름 -> 함수와 데이터의 분리 -> OOP === Powerful Tools for Specialized Data === * 프로그래밍을 쉽게 하기 위해, 편리한 도구(HTML, Name-Value Pairs, 스프레드시트, 데이터 베이스, 등등)를 갖추자는 것이다. 별로 볼 거 없다. === Principles === * 프로그램을 짤때 생각도 안 해보고 덤비는 짓은 하지 말자. 작게 짤수도 있는 프로그램을 크게 짜버리는 일이 생길지도 모른다. * 자료구조의 중요성을 강조하고 있다. '''자료구조는 소프트웨어를 만든다 : 큰 프로그램을 작은 프로그램으로 줄여준다.''' '''자료구조를 잘짜면, 시간, 공간의 감소와 이식 가능함의 정도와 유지보수의 측면에서 이득을 볼 수 있다.''' * 이러면서 우리의 "The Mythical Man Month"의 구절이 나온다. '''표현은 프로그래밍의 본질이다.''' * 전체적인 요약을 하면 * 반복되는 코드는 배열로 반든 다음 루프를 돌리자 * 복잡한 구조는 캡슐화를 하자 -> 클래스 * 가능하다면 진보된 툴을 사용하자. * 이 컬럼의 주제 : 데이터는 복잡한 코드를 적절한 자료 구조로 바꿈으로써, 프로그램을 구성한다. ---- ["ProgrammingPearls"]