소프트웨어 개발자/클린코드 & 디자인 패턴 9

[디자인패턴] 행동 패턴 - 상태(State) 패턴

상태 (State) 패턴이란State 패턴은 행동 패턴 중 하나로 내부 상태가 변경될 때 객체의 행동을 교체한다. 객체가 상태(값)을 변경하여, 행동의 변화를 유발함으로서 클래스 자체가 변경된 것 처럼도 보일 수 있다.  등장 배경[초안, 검토, 출판본]의 상태를 가진 문서 객체가 있다고 가정할 때, 발행(publish)라는 메서드는 각 상태(State) 마다 다르게 작동할 것이다. 초안: 검토 상태로 변경 검토: 공개 상태로 변경 / 관리자만 가능출판본: 이미 발행되었기에, 아무것도 하지 않음  이 처럼 유한한 범위의 상태를 가지고 있는 프로그램에 상태 변화에 따라 다르게 행동할 수 있도록 설계 되는 것이런 변경(transition)이라고 불리는 원칙은 유한한 범위이고, 미리 결정 되어야 한다.  예시..

[디자인패턴] 행동 패턴 - 전략(Strategy) 패턴

전략 (Strategy) 패턴이란행동 패턴 방법 중 하나로 동일한 레벨의 다양한 알고리즘을 정의 및 캡슐화 하고, 런타임시 동적으로 해당 알고리즘을 선택할 수 있게 하는 디자인 패턴이다. 이로서, 복잡한 알고리즘 내용을 비즈니스 로직에서 분리 하여 감출 수 있고, 클라이언트는 런타임 중 자유롭게 알고리즘을 수행하고 변경 할 수 있다. 등장 배경 예시로여행자들이 목적지 까지 가기 위한, 다양한 방법(대중교통, 차량 등등)에 대해 네비게이션을 통해 볼 수 있다고 가정여행자들은 원하는 방법을 선택할 때 마다, 해당 방법으로 목적지 까지 가는 방법을 보여 줄 수 있다.  예시 구조1. 목적지 까지 가기 위한 전략(알고리즘, Strategy) 들은 다 캡슐화를 한다.ex. RouteStrategy 인터페이스를 상..

[디자인패턴] 행동 패턴 - Command 패턴

Command (커맨드) 패턴이란커맨드 패턴은 행동 패턴 중 하나로, 요청을 요청 정보를 가지고 있는 독립 실행 객체로 전환하는 패턴을 말한다. 이 변환을 통해, 요청을 메서드 파라미터로 넘기거나, 요청의 실행을 지연 또는 큐에 넣기, 되돌리기 기능 등을 지원 가능한 패턴한다. 등장 배경텍스트 에디터 앱 제작시 (좌) 각 버튼들에 공통된 기능이 추가가 필요하다고 가정 (ex. 툴 바를 위한 핸들러)  가장 간단한 방법은 버튼 종류 마다 중복된 코드를 작성하는 것. 해결책비즈니스 로직과 UI 분리 처럼, GUI 객체가 요청을 직접 보내는 대신에, 요청 디테일을 추출하고, 호출되는 객체, 메서드 이름, 파라미터 리스트를 해당 요청을 발생 시키는 분리된 커맨드 클래스로 옮겨 진행.  즉 커맨드 객체는 여러 G..

[디자인패턴] 행동 패턴 - 옵저버 패턴

옵저버 패턴 이란?Observer 패턴은 관찰 중인 개체(주제, subject)에 이벤트가 발생시, 다른 개체들(구독자, observer)에 알리는 메커니즘으로 주제에 변화가 있으면 갱신 내용을 observer에 전달한다. 한 객체의 상태가 바뀌었을 때, 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식은 일(주제)대다(구독자)의 의존성을 가진다고도 정의할 수 있다. 이러한 메커니즘을 구독 메커니즘이라고도 하며, Subject, Observer / Subscriber - Publisher 라고도 많이 지칭한다.기술적인 예시는 메세지 큐(Message Queue) 시스템 활용시 / Event-Driven Systems 등에서 사용 될 수 있다.  특징Subscriber(구독자)와..

[디자인패턴] 생성 패턴 - Prototype 패턴

프로토 타입 패턴 이란? 생성 패턴의 한 방법으로, 객체를 생성할 때 클래스를 이용하여 새로운 객체를 생성하는 것이 아닌, 기본 템플릿(이미 존재하는 객체)을 복제하여 생성하는 디자인 패턴주로 객체를 생성하는데 비용이 큰데, 이를 빈번하게 생성해야 하는 경우 주로 사용됨사실 Python에서는 이미 deepcopy() 로 대체가능함. 왜 사용하는가?만약 똑같은 A1 객체, A2 객체를 만든 다고 할 때,A라는 공통의 부모 클래스를 상속 받아, 생성자를 통해 구현하는 것도 가능하다.하지만 만약 필드가 굉장히 많다면 생성자를 통한 초기화 작업은 굉장히 번거로운 일이 될 것이다.따라서 A1 객체를 복제해 A2 객체로 만들면 생성 비용이 적게 든다. 의사코드다음의 관계를 가진 클래스 선언에서, Prototype..

[디자인패턴] 생성 패턴 - 싱글톤 (Singleton) 패턴

싱글톤 패턴 이란?싱글톤 패턴(Singleton Pattern) 이란 클래스에 하나의 객체(인스턴스)로 모든 인스턴스와 공유하는 패턴싱글턴 객체는 맨 처음 요청될 때만 초기화를 진행되며, 해당 인스턴스에 대해 전역 접근 지점이 존재함  객체 생성과 초기화객체의 생성과 초기화에는 __new__와 __init__ 이라는 메서드가 사용 __new__ : 객체의 생성 과정시 호출__init__ : 생성된 객체에 속성(property)을 추가 or 초기화 시 호출__new__ 메소드에 대한 이해사용자가 어떠한 목적을 가지고 클래스의 생성 과정에 관여하고 싶을 때, 직접 __new__ 메서드를 클래스에 추가함으로써 object 최상위 클래스의 __new__를 오버라이딩 하여 사용자의 __new__ 메소드가 호출되도..

[디자인패턴] 생성 패턴 - 빌더 (Builder) 패턴

빌더 패턴 이란? 생성 패턴의 한 방법으로, 복잡한 객체를 단계별로 생성할 수 있도록 하는 디자인 패턴 같은 생성(construction) 코드를 사용하여 다양한 타입과 상태의 객체를 만들 수 있다. 아래 사진 처럼 다양한 종류의 House를 만들기 쉬움 Directory 개념을 추가해, 빌더 단계들에 대한 일련의 호출 순서를 정의 가능 인터페이스 구조 집의 벽, 문, 지붕, 창문, 주차장을 원하는 파라미터로 만드는 함수 집 객체를 리턴하는 함수 예시 코드 # 유저 객체 class User: def __init__(self): self.user_name = None self.password = None self.email = None # 유저 빌더 class UserBuilder: def __init__..

[디자인패턴] 생성 패턴 - 팩토리 (Factory) 패턴

팩토리 패턴 이란? 생성 패턴의 한 방법으로, 여러 객체들을 팩토리로 캡슐화를 통해 다양한 종류의 객체들을 생성 구현 하는 것팩토리(추상) 클래스에 각 객체를 생성 해주는 로직들을 캡슐화 하고 Argument 호출 등을 통해, 가독성을 높인다.팩토리 패턴은 조건에 해당되는 '생성된 객체'를 리턴해 주는 것이 핵심주로 클래스의 생성자의 로직이 복잡해졌을 때 추상화 레벨로 올려 사용함주로 Factory, Creator 와 같은 클래스/함수명이 많이 붙음 추상 팩토리 (Abstract Factory) 패턴 이란?추상 팩토리 (Abstract Factory)는 일반적인 팩토리 패턴보다 좀더 확장한 개념으로, 공통 테마의 여러 팩토리들을 1개의 그룹으로 캡슐화 하여, 관련 객체의 패밀리를 생성하는 방법 팩토리 메..

[클린코드] SOLID 객체 지향 설계 원칙

SOLID 객체 지향 설계 원칙 SOLID는 객체 지향 설계의 다섯가지 원칙을 지칭한다. 클린코드의 한 방법으로 SRP, OCP, LSP, ISP, DIP 원칙이 있다. SRP (Single Responsibility Principle, 단일 책임 원칙) 모든 클래스는 각자 하나의 책임만 가지며 클래스는 그 책임을 완전히 캡슐화 해야 된다는 의미이다. 예로 DB를 1)생성 및 초기화 2) 데이터 삽입, 삭제 역할을 수행하는 A 클래스가 있다고 가정하면, 이를 우리는 SRP 원칙에 따라 A클래스의 역할을 B클래스로 분리할 수 있다. A클래스 : DB 생성 및 초기화 B클래스 : DB 데이터 삽입, 삭제 이렇게 SRP (단일 책임 원칙)을 지킨 경우, 클래스에 대한 외부 영향도를 최소화 할 수 있고, 유지보..