Skip to content

Latest commit

Β 

History

History
173 lines (127 loc) Β· 7.58 KB

template-method.md

File metadata and controls

173 lines (127 loc) Β· 7.58 KB

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄

μž‘μ„±μž : μ •ν¬μž¬

λ³Έ μžλ£ŒλŠ” '파이썬 λ””μžμΈ νŒ¨ν„΄ 2/e (Chetan Giridhar)' 책을 ν† λŒ€λ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“  μ˜ˆμ‹œ μ½”λ“œμ—λŠ” μ €μžλ₯Ό ν‘œμ‹œν•˜λŠ” __author__ = 'Chetan' 이 ν¬ν•¨λ©λ‹ˆλ‹€.

Table of Contents

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄ κ°œμš”

행동 νŒ¨ν„΄μ—μ„œλŠ” 각 객체의 역할이 μ€‘μš”ν•˜λ‹€. κ°μ²΄λŠ” μƒν˜Έ μž‘μš©μ„ 톡해 더 큰 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€. ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€ 행동 νŒ¨ν„΄μ˜ ν•œ μ’…λ₯˜λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΌˆλŒ€λ‚˜ 핡심 μ•Œκ³ λ¦¬μ¦˜μ„ Template MethodλΌλŠ” 곳에 μ •μ˜ν•œλ‹€. ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€ μ•Œκ³ λ¦¬μ¦˜μ˜ 일뢀 단계λ₯Ό μ„œλΈŒν΄λž˜μŠ€ν™”ν•΄ μ•Œκ³ λ¦¬μ¦˜μ˜ 뢀뢄적 μˆ˜μ • 및 μž¬μ •μ˜λ₯Ό μ‰½κ²Œ ν•œλ‹€. 즉 μ„œλΈŒν΄λž˜μŠ€λ₯Ό 자유둭게 μž¬μ •μ˜ν•  수 μžˆλ‹€.

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€ λ‹€μŒκ³Ό 같은 상황에 μ ν•©ν•˜λ‹€.

  1. μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜ λ˜λŠ” 클래슀의 κ΅¬μ‘°λ‚˜ 둜직이 λΉ„μŠ·ν•  λ•Œ
  2. μ•Œκ³ λ¦¬μ¦˜μ„ λ‹¨κ³„λ³„λ‘œ μ„œλΈŒν΄λž˜μŠ€ν™”ν•΄ μ½”λ“œμ˜ 쀑볡을 쀄일 수 μžˆλŠ” 경우
  3. μ„œλΈŒν΄λž˜μŠ€λ₯Ό μ˜€λ²„λΌμ΄λ“œν•΄ μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆλŠ” 경우

ν…œν”Œλ¦Ώ λ§€μ†Œλ“œ νŒ¨ν„΄μ˜ λͺ©μ 

  1. μ•Œκ³ λ¦¬μ¦˜μ˜ λΌˆλŒ€λ₯Ό μ›μ‹œ μ—°μ‚°μœΌλ‘œ κ΅¬ν˜„
  2. μ•Œκ³ λ¦¬μ¦˜μ˜ ꡬ쑰λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  일뢀 μ„œλΈŒν΄λž˜μŠ€λ₯Ό μž¬μ •μ˜
  3. μ½”λ“œμ˜ μž¬μ‚¬μš©κ³Ό 쀑볡 μ΅œμ†Œν™”
  4. 곡톡 μΈν„°νŽ˜μ΄μŠ€ 및 κ΅¬ν˜„ ν™œμš©

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ˜ κ΅¬μ„±μš”μ†Œ

1. AbstractClass

  • μ•Œκ³ λ¦¬μ¦˜μ˜ 단계λ₯Ό μ •μ˜ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€
  • μ•Œκ³ λ¦¬μ¦˜μ˜ 각 단계λ₯Ό μ •μ˜ν•˜λŠ” 좔상 λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
  • ConcreteClassμ—μ„œ μ˜€λ²„λΌμ΄λ“œν•œλ‹€.

2. ConcreteClass

  • 단계별 μ„œλΈŒν΄λž˜μŠ€
  • μ—¬λŸ¬ 좔상 λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λœ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„œλΈŒν΄λž˜μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

3. template_method()

  • 단계별 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ μ •μ˜
  • μ•Œκ³ λ¦¬μ¦˜μ˜ λΌˆλŒ€λ₯Ό μ •μ˜ν•œλ‹€.
  • 전체 μ•Œκ³ λ¦¬μ¦˜μ„ μ •μ˜ν•˜λŠ” μ—¬λŸ¬ 좔상 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄ κ΅¬ν˜„ μ½”λ“œ

__author__ = 'Chetan'

from abc import ABCMeta, abstractmethod

# μ•Œκ³ λ¦¬μ¦˜μ˜ μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
class AbstractClass(metaclass=ABCMeta):
    def __init__(self):
        pass

    @abstractmethod
    def operation1(self):
        pass

    @abstractmethod
    def operation2(self):
        pass
    
    # 단계별 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜ λΌˆλŒ€ μ •μ˜
    def template_method(self):
        print("Defining the Algorithm. Operation1 follows Operation2")
        self.operation2()
        self.operation1()

# μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μ„œλΈŒν΄λž˜μŠ€ κ΅¬ν˜„
class ConcreteClass(AbstractClass):

    def operation1(self):
        print("My Concrete Operation1")

    def operation2(self):
        print("Operation 2 remains same")

# μ‚¬μš© μ˜ˆμ‹œ
class Client:
    def main(self):
        self.concreate = ConcreteClass()
        self.concreate.template_method()

client = Client()
client.main()

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄ μ˜ˆμ‹œ (iOS 컴파일러)

__author__ = 'Chetan'

from abc import  ABCMeta, abstractmethod

# 컴파일러 μ•Œκ³ λ¦¬μ¦˜ μΈν„°νŽ˜μ΄μŠ€
class Compiler(metaclass=ABCMeta):

    # μ†ŒμŠ€ μˆ˜μ§‘
    @abstractmethod
    def collectSource(self):
        pass

    # 객체둜 컴파일
    @abstractmethod
    def compileToObject(self):
        pass

    # μ‹€ν–‰
    @abstractmethod
    def run(self):
        pass

    # 단계별 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 컴파일 κ³Όμ • 섀계
    def compileAndRun(self):
        self.collectSource()
        self.compileToObject()
        self.run()

# μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜ ꡬ체화
class iOSCompiler(Compiler):
    def collectSource(self):
        print("Collecting Swift Source Code")

    def compileToObject(self):
        print("Compiling Swift code to LLVM bitcode")

    def run(self):
        print("Program runing on runtime environment")

# μ‚¬μš© μ˜ˆμ‹œ
iOS = iOSCompiler()
iOS.compileAndRun()

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄ – 후크

ν›„ν¬λŠ” 좔상 클래슀(AbstactClass)에 μ •μ˜λ˜λŠ” λ©”μ†Œλ“œλ‹€. 일반적으둜 κΈ°λ³Έ κ΅¬ν˜„μ„ ν¬ν•¨ν•˜μ—¬ μ •μ˜λœλ‹€. ν›„ν¬λŠ” μ„œλΈŒν΄λž˜μŠ€κ°€ μ•Œκ³ λ¦¬μ¦˜ 쀑간 단계λ₯Ό μ œμ–΄ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 예λ₯Ό λ“€μ–΄ μ•žμ„œ 닀룬 iOS 컴파일러 μ˜ˆμ œμ—μ„œ run() λ©”μ†Œλ“œ μ‹€ν–‰ 전에 μœ μ €μ—κ²Œ μ‹€ν–‰ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” κ°„λ‹¨ν•œ 후크λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€. λ‹€λ§Œ μ„œλΈŒν΄λž˜μŠ€λŠ” 후크λ₯Ό κΌ­ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. μ„œλΈŒν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬ ꡬ체화 ν•΄μ•Όν•˜μ§€λ§Œ ν›„ν¬λŠ” μ„ νƒμ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

ν• λ¦¬μš°λ“œ 원칙과 ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ

ν• λ¦¬μš°λ“œ 원칙은 β€œλ¨Όμ € μ—°λ½ν•˜μ§€ λ§ˆμ„Έμš”. 저희가 연락 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.” 에 κΈ°λ°˜ν•˜λŠ” λ””μžμΈ 철학이닀. ν• λ¦¬μš°λ“œ μ˜ν™” μ œμž‘μ‚¬μ—μ„œ λ°°μš°κ°€ ν•„μš”ν•  λ•Œ μ œμž‘μ‚¬κ°€ λ°°μš°μ—κ²Œ μ—°λ½ν•˜λŠ” κ²ƒμ—μ„œ λΉ„λ‘―λœ 원칙이닀. μƒμœ„ μš”μ†Œκ°€ μ–Έμ œ μ–΄λ–€ ν•˜μœ„ μš”μ†Œκ°€ ν•„μš”ν•œμ§€ κ²°μ •ν•œλ‹€. 즉 μƒμœ„ μš”μ†Œκ°€ ν•˜μœ„ μš”μ†Œμ— λŒ€ν•œ μ ‘κ·Ό 및 ν•„μš”μ„±μ„ 직접 κ²°μ •ν•˜λŠ” κ°œλ…μ΄λ‹€. ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ—μ„œλŠ” μƒμœ„ 좔상 ν΄λž˜μŠ€κ°€ μ•Œκ³ λ¦¬μ¦˜μ— ν•„μš”ν•œ 단계λ₯Ό μ •λ¦¬ν•œλ‹€. μ•Œκ³ λ¦¬μ¦˜μ— 따라 각 단계에 λ§žλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ ν˜ΈμΆœλœλ‹€.


ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ˜ μž₯단점

μž₯점

  1. μ½”λ“œ 쀑볡이 μ—†λ‹€.
  2. μ»΄ν¬μ§€μ…˜μ΄ μ•„λ‹Œ 상속을 μ‚¬μš©ν•˜λ―€λ‘œ μ½”λ“œλ₯Ό μž¬ν™œμš©ν•  수 μžˆλ‹€. μΌλΆ€μ˜ ν•¨μˆ˜λ§Œ μ˜€λ²„λΌμ΄λ“œν•˜λ©΄ λœλ‹€.
  3. μ•Œκ³ λ¦¬μ¦˜μ˜ 각 단계λ₯Ό μ„œλΈŒν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  수 μžˆλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€.

단점

  1. μ½”λ“œ 디버깅 및 이해가 μ–΄λ €μšΈ 수 μžˆλ‹€. 좔상 λ©”μ†Œλ“œμ— κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ 좔상 λ©”μ†Œλ“œλ₯Ό μ•„μ˜ˆ κ΅¬ν˜„ν•˜μ§€ μ•ŠλŠ” μ‹€μˆ˜λ₯Ό 저지λ₯Ό 수 μžˆλ‹€. μ—λŸ¬ 핸듀링과 λ¬Έμ„œν™”κ°€ ν•„μˆ˜μ μ΄λ‹€.
  2. μ–΄λ–€ κ³„μΈ΅μ˜ 클래슀(μƒμœ„ 및 ν•˜μœ„ 클래슀)λ₯Ό μˆ˜μ •ν•œλ‹€λ©΄ 전체 ꡬ쑰 및 κ΅¬ν˜„μ— 영ν–₯을 쀄 수 μžˆμ–΄ μœ μ§€ λ³΄μˆ˜κ°€ μ–΄λ ΅λ‹€.

자주 λ¬»λŠ” 질문

1. ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ 클래슀λ₯Ό ν˜ΈμΆœν•˜λŠ” 것을 막아야 ν•˜λŠ”κ°€? μ•„λ‹ˆλ‹€. ν•˜μœ„ ν΄λž˜μŠ€λŠ” 상속을 톡해 μƒμœ„ 클래슀λ₯Ό ν˜ΈμΆœν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μƒν•˜μœ„ ν΄λž˜μŠ€κ°€ μ„œλ‘œ μ˜μ‘΄ν•˜λŠ” μˆœν™˜ 쒅속성이 없도둝 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

2. μ „λž΅ νŒ¨ν„΄κ³Ό ν…œν”Œλ¦Ώ νŒ¨ν„΄μ˜ 차이점은 무엇인가? 두 νŒ¨ν„΄ λͺ¨λ‘ μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•œλ‹€. ν•˜μ§€λ§Œ ν…œν”Œλ¦Ώ νŒ¨ν„΄μ€ 상속을 μ‚¬μš©ν•˜λŠ” λ°˜λ©΄μ— μ „λž΅ νŒ¨ν„΄μ€ μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•œλ‹€. ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€ μ„œλΈŒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•΄ 컴파일 λ‹¨κ³„μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ„ μ„ νƒν•˜μ§€λ§Œ μ „λž΅ νŒ¨ν„΄μ€ λŸ°νƒ€μž„μ— μ„ νƒν•œλ‹€.