명령

매일 공부(ML)·2022년 12월 12일
0

Fluent Python

목록 보기
40/130

객체로서의 함수

일급 함수의 디자인 패턴

명령

함수를 인수로 전달하는 기법을 사용하면 명령 디자인 패턴도 구현을 단순하게 만들 수 있다.

명령 패턴의 목적은 연산을 실행하는 객체(호출자)의 연산을 구현하는 객체(수신자)를 분리하는 것으로 그래픽 애플리케이션의 메뉴 항목이 호출자며, 편집되고 있는 문서나 애플리케이션 자신이 수신자다.


기본 개념은 명령 객체를 수신자와 호출자 사이에 놓고, 명령은 execute()라는 단 하나의 메서드로 인터페이스를 구현하고, 원하는 연산을 수행하기 위해서 수신자가 갖고 있는 메서드를 호출한다.

이를 통해, 호출자는 수신자의 인터페이스를 알 필요가 없고, 명령의ㅣ 서브클래스를 통해 서로 다른 수신자를 추가할 수 있다.

호출자는 구체적인 명령으로 설정되며, 연산을 실행하기 위해 execute() 메서드를 호출하므로 MacroCommand 명령 객체는 일련의 명령을 저장할 수 있기에 execute()메서드는 저장된 각 명령의 execute() 메서드를 호출한다.


호출자에 Command 객체 대신 간단히 함수로 바로 지정이 가능하므로 command.execute()를 호출하는 대신, 호출자는 단지 command()를 호출하면 되고, MacroCommand는 call()메서드를 가진 클래스로 구현할 수 있다.

MacroCommand의 객체는 콜러블이 되며, 향후에 호출한 함수들의 리스트를 가진다.

#각각의 MacroCommand 객체는 내부에 영향 리스트를 갖고 있다.

class MacroCommand:
	"""명령 리스트를 실행하는 명령"""
    def __init__(self, commands):
    	self.commands = list(commands)
        
    def __call__(self):
    	for command in self.commands:
        	command()

"""
실행 취소 지원 등 고급 기능의 명령 패턴을 구현하려면 단순한 콜백 함수로는 어려울 수 있고, 파이썬에선 다음과 같은 두 가지 대안을 제시한다.

MacroCommand와 같은 콜러블 객체는 필요한 상태를 보관함으로써 __call__() 메서드 이외의 메서드로 제공할 수 있다.

함수가 호출된 후의 상태를 내부에 보관하기 위해 클로저를 사용할 수 있다.

"""

profile
성장을 도울 아카이빙 블로그

0개의 댓글