C/C++ 디자인 패턴 (23) — 인터프리터(Interpreter)
로그 뷰어에 "레벨 3 이상이면서 커널에서 왔거나 메시지에 oom이 들어간 줄" 같은 조건을 넣고 싶다. 조건 조합마다 체크박스와 코드를 추가할 수는 없으니, 사용자가 level >= 3 and (src == kernel…
로그 뷰어에 "레벨 3 이상이면서 커널에서 왔거나 메시지에 oom이 들어간 줄" 같은 조건을 넣고 싶다. 조건 조합마다 체크박스와 코드를 추가할 수는 없으니, 사용자가 level >= 3 and (src == kernel…
수식 파서가 만든 구문 트리(AST)에 평가, 출력, 최적화, 타입 검사 같은 연산이 계속 늘어난다고 하자. 연산마다 노드 클래스에 가상 함수를 추가하면, 연산 하나를 넣을 때마다 모든 노드 클래스를 고쳐야 하고…
CSV, JSON, 엑셀에서 데이터를 가져오는 기능은 "읽기 → 걸러내기 → 저장 → 알리기"라는 같은 순서를 따르고, 읽는 방법만 다르다. 형식마다 이 순서를 복사해 두면 단계 하나를 추가할 때 모든 복사본을…
문단을 화면 폭에 맞춰 줄을 바꾸는 방법은 여러 가지다. 빠르고 단순한 탐욕 방식이 있고, 문단 전체를 보고 줄 끝 여백을 고르게 만드는 방식도 있다. 이 알고리즘을 문단 클래스 안에 if로…
TCP 연결 객체는 같은 send() 호출에도 닫힌 상태에서는 오류를, 연결된 상태에서는 전송을 해야 한다. 상태를 열거형 하나로 두고 메서드마다 switch를 쓰면, 상태가 추가될 때마다 모든 메서드의 분기를 찾아 고쳐야 하고…
지역별 매출 데이터가 바뀌면 변경 로그, 막대 차트, 합계 표가 모두 갱신돼야 한다. 데이터 클래스가 이 화면들을 직접 호출하면 새 화면을 추가할 때마다 데이터 클래스를 고쳐야 하고, 화면 없이 데이터만…
게임에서 보스 방 앞에 체크포인트를 만들거나, 설정 화면에서 "취소"를 누르면 이전 값으로 돌아가야 한다. 객체 상태를 바깥에서 저장하려면 private 멤버를 공개하거나 getter/setter를 잔뜩 만들어야 하는데, 그러면 캡슐화가 깨지고 저장하는 쪽이…
가입 화면에서 "약관 동의"를 체크하고, 이메일이 올바르고, "회사 계정"을 체크했다면 회사명까지 입력해야 가입 버튼이 켜진다. 각 위젯이 서로를 직접 참조해 규칙을 처리하면 체크박스가 버튼과 입력란을 알고, 입력란이 버튼을 알고… 위젯…
이진 탐색 트리의 원소를 정렬 순서로 처리하고 싶다. 재귀 함수 하나면 순회는 쉽지만, 두 트리를 한 걸음씩 번갈아 읽으며 병합하거나 원하는 값에서 멈추려면 순회의 "현재 위치"를 함수 밖에서 들고 있어야…
편집기의 "되돌리기", 작업을 백그라운드 스레드에 맡기기, 실행한 작업을 기록했다가 다시 재생하기는 겉보기에 다른 기능이지만 공통 전제가 있다. "무엇을 할지"가 함수 호출로 흘러가 버리지 않고 값으로 남아 있어야 한다는 것이다. 커맨드(Command)는…