U E D R , A S I H C RSS

Programming Pearls/Column3


1. Data Structures Progams

  • 주로 Refactoring과 Table Driven Programming을 설명하고 있다.

1.1. A survey program

  • 별로 볼건 없고... 아무도 하지 않을 상황을 예로 들어놓은 것 같다. 왠만큼 프로그램 배운 사람이라면 당연히 배열로 처리할 것을 몇 백개의 변수로 처리하는 상황을 보여주고 있다. 그러면서 하는 말 : 많은 변수를 쓰고 있으면 관련되는 것으로 묶어서 배열로 처리하라. 이게 주제다.

1.2. 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 <iostream>
    #include <fstream>
    #include <string>
    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 <iostream>
    #include <string>
    #include <fstream>
    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;
    }
     

  • 이렇게 생겼다. 굉장히 해괴망측하다. 아직 이렇게 하는 것에 대한 장점은 잘 모르겠다.

1.3. 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);
    }
    ...
    ...
     
  • 이런 식으로 가면 된다는 것이다. 간단한 것이니 그냥 넘어가자.

1.4. Structuring Data

  • 잘 구조화된 데이터의 의미는 계속 변천되어 왔다.
  • 잘 지어진 변수 이름 -> 함수와 데이터의 분리 -> OOP

1.5. Powerful Tools for Specialized Data

  • 프로그래밍을 쉽게 하기 위해, 편리한 도구(HTML, Name-Value Pairs, 스프레드시트, 데이터 베이스, 등등)를 갖추자는 것이다. 별로 볼 거 없다.

1.6. Principles

  • 프로그램을 짤때 생각도 안 해보고 덤비는 짓은 하지 말자. 작게 짤수도 있는 프로그램을 크게 짜버리는 일이 생길지도 모른다.
  • 자료구조의 중요성을 강조하고 있다.
    자료구조는 소프트웨어를 만든다 : 큰 프로그램을 작은 프로그램으로 줄여준다.
    자료구조를 잘짜면, 시간, 공간의 감소와 이식 가능함의 정도와 유지보수의 측면에서 이득을 볼 수 있다.
  • 이러면서 우리의 "The Mythical Man Month"의 구절이 나온다.
    표현은 프로그래밍의 본질이다.
  • 전체적인 요약을 하면
    • 반복되는 코드는 배열로 반든 다음 루프를 돌리자
    • 복잡한 구조는 캡슐화를 하자 -> 클래스
    • 가능하다면 진보된 툴을 사용하자.
    • 이 컬럼의 주제 : 데이터는 복잡한 코드를 적절한 자료 구조로 바꿈으로써, 프로그램을 구성한다.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0949 sec