소프트웨어 공학

    [Design Go] 원형 패턴

    들어가기에 앞서... 예제는 전과 마찬가지로 지난 글의 예제를 이용했다. 원형 패턴 원형 패턴은 미리 만들어진 객체(prototype)의 복사를 통해 새로운 객체를 생성하는 패턴이다. prototype 객체는 보통 팩토리 객체(factory) 내부의 인스턴스로 존재하며, factory 객체는 요청한 prototype 객체의 복사본을 반환한다. prototype 객체를 복사할 때에는 깊은 복사를 이용해야 한다. 장점 런타임 단계에서 새로운 객체의 생성자를 만들 수 있다. 이는 컴파일 단계에서 생성할 객체의 클래스를 정해야 하는 다른 생성 패턴에 비해 유연성이 보장된다. 클래스의 개수가 줄어든다. 다른 생성 패턴은 인터페이스를 만족하는 다양한 클래스들을 생성해야 하지만 원형 패턴은 하나의 클래스에 내부의 p..

    [Design Go] 팩토리 메소드 패턴

    들어가기에 앞서... 이번 패턴의 설명 역시 지난 패턴의 예제를 이용했다. 팩토리 메소드 패턴 팩토리 메소드 패턴은 함수에게 다른 객체(product)의 생성을 맡기는 디자인 패턴이다. creator 함수는 product 객체의 일종의 생성자 역할을 한다고 볼 수 있다. 장점 객체의 생성과 구현을 분리해낸다. 이전의 생성 패턴들과 같다. 코드의 가독성이 높아진다. 빌더 패턴과 비슷한 이유이다. 빌더 패턴이 거대한 객체의 생성을 목적으로 한다면 팩토리 메소드는 작은 객체의 생성을 목적으로 한다. 다른 패턴과 쉽게 연동된다. 기존의 클래스에 해당 메소드만 추가하면 되는 만큼 다른 패턴에 적용하기 쉽다. 추상 팩토리 패턴은 여러 팩토리 메소드를 묶어 객체화한 패턴이다. 단점 코드가 난잡해질 수 있다. 팩토리 ..

    [Design Go] 추상 팩토리 패턴

    들어가기에 앞서... 이번 패턴의 예제는 지난 글을 참조하자. 추상 팩토리 패턴 추상 팩토리 패턴은 한 객체(factory)에게 서로 연관되어 있는 각 객체(product)들의 생성을 맡기는 패턴이다. 우선 factory 객체가 상속할 인터페이스(Factory)에는 하나 이상의 product 객체들을 생성하는 메소드가 정의되어 있어야 한다. factory 객체는 Factory 인터페이스를 상속하여 해당 인터페이스의 메소드를 구현한다. 사용자는 factory 객체를 생성하고 해당 객체의 메소드를 통해 product 객체들을 생성한다. 장점 연관된 객체들(객체군)끼리 생성할 때 문제의 여지가 없어진다. 추상 팩토리 패턴을 사용하는 가장 큰 이유이다. 예를 들어 여러 사이즈의 나사와 볼트가 있을 때 추상 팩토..

    [Design Go] 빌더 패턴

    들어가기에 앞서... 지난 글에서 언급했듯 해당 시리즈의 이번 글부터는 각 디자인 패턴에 대해 설명하면서 Go언어로 만들어보도록 하겠다. 책 'GoF의 디자인 패턴'에서는 생성 패턴들을 설명할 때 아래의 미로를 만드는 예제를 사용했다. 이 시리즈도 해당 예제를 이용할 예정이다. package main import "fmt" type Direction int const ( East Direction = iota West South North ) type MapSite interface { Enter() } type Room interface { MapSite GetSide(d Direction) MapSite SetSide(d Direction, s MapSite) GetNo() int } type roo..

    [Design Go] 좋은 코드와 디자인 패턴

    좋은 코드? 농부는 좋은 작물을 얻기 위해 노력한다. 책 저자는 좋은 책을 쓰기 위해 노력한다. 프로그래머는 좋은 코드를 짜기 위해 노력한다. 그렇다면 '좋은 코드'라는 것은 대체 무엇일까? 좋은 코드란? 다양한 의견이 있을 수 있다. 일단 성능이 좋을 수록 좋은 코드이다. 블로그 이름처럼 단순하고 깔끔한 코드는 대부분 좋은 코드이다. 이런 맥락으로 가독성이 높은 코드는 좋은 코드이다. 하지만, 혼자서든 여러 사람과 함께든 작업을 이어가다 보면, 유지보수하기 쉬운 코드는 좋은 코드의 필요 조건이라는 것을 알게 된다. 왜 유지보수하기 쉬운 코드인가? 프로젝트를 진행하다 보면 당연히 처음에는 새로운 기능을 추가하는 데에 시간을 많이 쓰게된다. 그렇게 그 프로젝트의 기본적인 요구 기능들이 완성되고 배포까지 완..

    [Go with TDD] TDD란?

    소프트웨어 공학, 개발 방법론 등에 관해 조금이라도 알고 있다면 TDD(Test-driven development, 테스트 주도 개발)라는 용어를 들어봤을 것이다. 잘 아는 사람도 많겠지만 모르는 사람들을 위해서 우선 용어부터 정리해보자. TDD 단어 그대로 테스트를 통해서 개발하는 방식이다. 즉, 테스트 케이스를 작성한 후 그 테스트를 통과하기 위한 코드를 짜는 방식을 TDD라고 부른다. 회귀 테스트 회귀 테스트는 이전에 동작 했던 기능 및 함수가 다른 부분의 코드 수정 후에도 일관성 있게 동작하는 것을 검증하는 테스트이다. 회귀 테스트는 일단 작성되면 새로운 기능을 테스트할 때마다 실행된다. 회귀 테스트의 핵심은 기존의 코드가 새로운 기능에 의해 문제를 일으키지 않는다는 것을 검증하고 보증하는 것에 ..