Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

ProgrammingPearls/Column3

From ZeroWiki
Revision as of 05:24, 7 February 2021 by imported>Unknown
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Data Structures Progams

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

A survey program

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

Form-Letter Programming

  • Column1의 이상한 소트와 더불어, 지금까지 본 내용중에서 꽤 신선한 내용이다. 왜 이렇게 하는지는 잘 모르겠지만... 역시 확장성을 위한 것 같다.
  • 예제 : 어느 사이트에 로그인하면 DB에서 사용자 데이터를 긁어와서 보여준다. 이것은 책에 있는 예제고, 이것을 간단히 C++, 그리고 파일 입력으로 변형을 해보면,
    • 출력 양식 : 변하는 것은 Kang-In-Su, Computer, Seoul, Su-saek이다.
Hello, Kang-In-Su.
We'll send a Computer to you.
Address : Seoul, Su-saek
 
// 일반적으로 대부분 이렇게 할 것이다.

#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;
}
 
  • 이렇게 생겼다. 굉장히 해괴망측하다. 아직 이렇게 하는 것에 대한 장점은 잘 모르겠다.

3.3 An Array of Examples

  • 우리의 리팩토링이다. 엄청난 중복이 있는 예제를 보자. 이건 C++로 하기가 좀 그러니, 책에 주어진 대로 VB를 예로 들어보자. 메뉴의 아이템이 10개가 있다. 하나를 클릭할때마다 그 아이템에 체크를 하고 싶다. 중복 짱!인 예제로 다음과 같은 예제가 있을수 있다.
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++로 다시 바꾼다.--; 비베 문법을 잘 몰라서.)
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