본문 바로가기
Development/Free Topic

디자인 패턴(Design Pattern)

by IMCOMKING 2014. 6. 11.

좋은 코딩이란

어렵게 생각할 것 전혀 없다. 그냥 아래의 원칙에 맞게 합리적으로 잘 짜면 된디. 필자는 전략 패턴이나 팩토리 패턴이 뭔지도 몰랐는데, 그냥 계속해서 리팩토링을 하다보니 본능적으로 만들어서 쓰고 있었다.(물론 그 문법은 매우 원시적이었지만)

1. 리팩토링을 자주해서 끊임없이 코드의 중복을 제거한다.
2. 처음보는 사람도 쉽게 이해할 수 있도록 코드를 잘 정리 정돈한다.
3. 계속해서 더 나은 구조를 고민한다.





싱글톤(Singleton Pattern)

class SingletonInstance:
__instance = None

@classmethod
def __getInstance(cls):
return cls.__instance

@classmethod
def instance(cls, *args, **kargs):
cls.__instance = cls(*args, **kargs)
cls.instance = cls.__getInstance
return cls.__instance

class MyClass(BaseClass, SingletonInstance):
pass

c = MyClass.instance()

여러가지 싱글톤 구현 방법:

팩토리 패턴(Factory Pattern)

내가 지금쓰는 builder 구조랑 같음. 즉 main flow에서 실행하는 변수들을 생성할 때, 직접 생성자를 호출하지 않고 한 단계 wrapping된 factory class에서 생성한다. 모든 instance의 생성을 class의 생성자에에 의해서 전달 받겠다는 것임.



전략 패턴(Strategy Pattern)

새로운 클래스를 정의할 때, 필요한 class/interface들을 골라서 상속받아서 쉽게 정의한다.


간단히 정리하면, 몇가지 option에 해당하는 method들을 interface class들을 여러개 만들어 놓고, 새로운 class를 정의할 때 여러 선택지 들 중에서 골라서 상속 받아 method로 사용하는 것이다.

한마디로 자식이 부모의 각각의 method에 대해, 여러가지 선택가능한 옵션 중 하나를 골라서 상속받음.(여러개의 method중에서 골라서 상속받는게 아니라, 1개의 method마다 옵션이 N개씩 존재하는 것임. 한마디로 5지선다로 1개를 고르는 것임)


- 부연설명

한마디로 부모 클래스에서 자속이 상속을 할 때, 모든 method를 그냥 상속 받으면 나중에 이걸 일일이 overriding시켜야하는 문제가 생길 수 있음.


그래서 아이에 method 5개를 interface로 만들어 놓고, 부모 클래스를 상속받은 자식 클래스가, 이 5개의 interface 중에서 1개를 골라서 전략적으로 "장착"하는 것임.


예를 들어 character 클래스의 이동방식에 걷기, 뛰기, 날기, 구르기 등 4가지 선택가능한 method가 있다면 이거를 각각 overriding하는게 아니라, 4가지 method를 interface로 만든다음, character 클래스를 상속받은 자식 클래스가 이 4개 중에서 1개를 골라서 장착해서 사용함.


아래 블로그에 완벽히 설명되어있음.

http://blog.naver.com/asuraiv1/50193647631





Python Coding Tip

metaclass=Singleton

__call__ 과 같은 함수들을 상속받겠다.



Decorator

__call__을 이용하면 @~~와 같은 decorator를 만들 수 있음.

https://github.com/naver/claf/blob/master/claf/decorator/register.py



Mixin

interface class만 상속 것을 의미함. 만약 멤버변수까지 상속하면 다중상속이 되어버림. 다중상속을 하게되면 super로 부모의 생성자 호출 시 어떤 것을 호출해야하는 지 불분명해서 에러가 날 수 있음. 따라서 다중상속 보다는 Mixin을 하는 것이 코드를 유지보수하기 좋다.







나만의 코딩 철학

Exception 처리를 잘 하는 것 보단, 오히려 잘못된 상황에 대한 적절한 raise나 assert가 훨씬 중요하다.
Exception은 에러가 나야하는 상황에서 에러가 나지 않아, 디버깅이 안되서 오히려 매우 위험할 수 있다.


댓글