요구사항 살펴보기 앞으로의 설명을 위해 '영화'와 '상영'이라는 용어를 구분할 필요가 있을 것 같다. '영화'는 영화에 대한 기본 정보를 표현한다. 제목, 상영시간, 가격 정보와 같이 영화가 가지고 있는 기본적인 정보를 가리킬 때는 '영화'라는 단어를 사용할 것이다. '상영'은 실제로 관객들이 영화를 관람하는 사건을 표현한다. 상영 일자, 시간, 순번 등을 가리키기 위해 '상영'이라는 용어를 사용할 것이다. 두 용어의 차이가 중요한 이유는 사용자가 실제로 예매하는 대상은 영화가 아니라 상영이기 때문이다. 사람들은 영화를 예매한다고 표현하지만 실제로는 특정 시간에 상영되는 영화를 관람할 수 있는 권리를 구매하기 위해 돈을 지불한다. 할인을 받을 수 있는 특정한 조건 할인액을 결정하는 두 가지 규칙이 존재한..
설계가 왜 필요한가 어떤 사람들은 설계가 코드를 작성하는 것보다는 높은 차원의 창조적인 행위라고 생각하는 것 같다. 하지만 설계를 구현과 떨어트려서 이야기하는 것은 불가능하다. 설계는 코드를 작성하는 매 순간 코드를 어떻게 배치할 것인지를 결정하는 과정에서 나온다. 설계는 코드 작성의 일부이며 코드를 작성하지 않고서는 검증할 수 없다. 좋은 설계란 무엇인가? 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다. 변경을 수용할 수 있는 설계가 중요한 이유는 요구사항이 항상 변경되기 때문이다. 그리고 코드를 변경할 때 버그가 추가될 가능성이 높기 때문이다. 요구사항은 필연적으로 코드 수정을 초래하고, 코드 수정은 버그가 발생할 가능성을 높인다. 객체지향 설계 우리가 진정으로..
설계 개선하기 앞 글의 코드는 세 가지 목적 중 한 가지는 만족시키지만 다른 두 조건은 만족시키지 못한다. 기능은 제대로 수행 이해하기 어려움 변경하기가 쉽지 않음 여기서 변경과 의사소통이라는 문제가 서로 엮여 있다는 점에 주목하라. 코드를 이해하기 어려운 이유는 Theater가 관람객의 가방과 판매원의 매표소에 직접 접근하기 때문이다. 이것은 관람객과 판매원이 자신의 일을 스스로 처리해야 한다는 우리의 직관을 벗어난다. 다시 말해서 의도를 정확하게 의사소통하지 못하기 때문에 코드가 이해하기 어려워진 것이다. Theater가 관람객의 가방과 판매원의 매표소에 직접 접근한다는 것은 Theater가 Audience와 TicketSeller에 결합된다는 것을 의미한다. 따라서 Audience와 TicketSe..
무엇이 문제인가 로버트 마틴은 '클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 방법'에서 소프트웨어 모듈이 가져야 하는 세 가지 기능에 관해 설명한다. 모듈 : 크기와 상관 없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소 모든 소프트웨어 모듈에는 세 가지 목적이 있다. 1. 실행 중에 제대로 동작하는 것이다. 이것은 모듈의 존재 이유라고 할 수 있다. 2. 변경을 위해 존재하는 것이다. 대부분의 모듈은 생명주기 동안 변경되기 때문에 간단한 작업만으로도 변경이 가능해야 한다. 3. 코드를 읽는 사람과 의사소통하는 것이다. 모듈은 특별한 훈련 없이도 개발자가 쉽게 읽고 이해할 수 있어야 한다. 읽는 사람과 의사소통할 수 없는 모듈은 개선해야 한다. 앞 글의 애플리케이션에서는 제..
티켓 판매 애플리케이션 구현하기 여러분은 작은 이벤트를 기획하기로 했다. 이벤트의 내용은 추첨을 통해 선정된 관람객에게 공연을 무료로 관람할 수 있는 초대장을 발송하는 것이다. 한 가지 염두에 둬야 할 점이 있는데, 이벤트에 당첨된 관람객과 그렇지 못한 관람객은 다른 방식으로 입장시켜야 한다는 것이다. 이벤트에 당첨된 관람객은 초대장을 티켓으로 교환한 후에 입장할 수 있다. 이벤트에 당첨되지 않은 관람객은 티켓을 구매해야만 입장할 수 있다. 코드 Invitation 공연을 관람할 수 있는 초대일자 (when) 를 인스턴스 변수로 포함하는 간단한 클래스다. public class Invitation { private LocalDateTime when; } Ticket 공연을 관람하기 원하는 모든 사람들은 ..
프로그래밍 패러다임 프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지한다. 또한 프로그래밍 패러다임을 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장할 수 있도록 준비시킬 수 있다. 각 프로그래밍 언어가 제공하는 특징과 프로그래밍 스타일은 해당 언어가 채택하는 프로그래밍 패러다임에 따라 달라진다. C 언어는 절차형 패러다임을 기반으로 하는 언어이며 자바는 객체지향 패러다임을 기반으로 하는 언어다. 함수형 패러다임을 수용한 가장 대표적인 언어는 리스프 (LISP) 이며 프롤로그 (PROLOG) 는 논리형 패러다임을 수용한 대표적인 언어다. 이것이 프로그래밍 언어와 프로그래밍 패러다임을 분리해서 설명할 수 없는 ..
패러다임의 시대 현대를 살아가는 우리는 다양한 패러다임의 홍수 속에 살고 있다. 그러나 20세기 중반을 살아가던 대부분의 사람들에게 패러다임은 낯설고 생소한 단어였다. 심지어 그 당시에 패러다임이라는 단어를 알고 있었던 사람들조차 지금 우리가 사용하는 것과는 전혀 다른 의미로 사용하고 있었다. 패러다임 (Paradigm) 이란? '모델 (model)', '패턴 (Pattern)', '예시 (Example)' 를 의미하는 그리스어인 '파라데이그마 (paradeigma)' 에서 유래됐다. 과거에는 표준적인 모델을 따르거나 모방하는 상황을 가리키는 매주 제한적인 상황에서만 사용했다. 예를 들어, 라틴어를 배울 때 '사랑하다'라는 동사의 활용으로 '나는 사랑한다', '너는 사랑한다', '그는/그녀는/그것은 사랑..