No older revisions available
No older revisions available
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, 스프레드시트, 데이터 베이스, 등등)를 갖추자는 것이다. 별로 볼 거 없다.