아래 누가 클로저랑 전략패턴이 뭔상관이냐고 물어서 올림
누가 말했는지 아이피가 기억이 안나긴 하는데
클로저랑 전략패턴이랑 직접적인 연관은 없음
단, 전략패턴을 사용하는데 있어 클로저가 유용하게 쓰일수도 있다는 뜻이었다.
그래서 밑에 그래프 모듈 중 하나인 matplotlib(줄여서 plt)를 통해 구체적인 예시를 코드로 좀 더 설명하면
plt에서 그래프를 그릴때 x축 스타일을 정의해주는게 있음
날짜 포맷에 맞춰서 출력할수도 있고 미리 정의된 Formatter들을 사용할수도 있음 <- Strategy pattern의 한 예
이때 위와 같이 나는 모든 tick 뒤에 특정 문자열을 덧붙이고 싶다고 하면
두가지 방법이 있을텐데 하나는 클로저를 사용하지 않고
def foo_fomat~:
...
def bar_format~:
...
를 정의해서 이를 넘길수도 있지만, 코드가 너무 길어진다는 것. 동적인 생성이 불가능 하다는 것. 확장에 닫혀있고 수정에 열려있는 등등 문제가 생김
그래서 대신 클로저 팩토리를 생성해서 'foo' suffix를 가진 formatter를 얻고 싶으면 걍 get_suffix_formatter('foo')로 사용하면 되는거임
이미 한번 얘기했지만 또 다른 얘기가 나올까봐 미리 말하는데 이게 클로저 쓰임새의 전부란건 아님.
물론 내가 잘못알고 있는 부분이 있을수 있다. 그런 점은 바로바로 지적해줘라.
븅신이니?? 저게 클로저니??? 저건 그냥 라이브러리 코드(템플릿)에다 콜백을 넘기는거잖아요? 저게 클로저야? 응? 저게 클로저냐고?
ㅇㅇ 라이브러리 코드에다가 콜백을 넘기는건 맞는데 그 넘길 콜백 함수를 클로저를 통해서 동적으로 생성한거라니까
클로저 개념 없이 저걸 어떻게 할건데 일일이 함수선언 할거냐?
람다를 동적으로 생성하는게 왜 클로저인가요? 넌 클로저를 이해못하고 있다는거야 그래서 ㅇㅇ. 함수가 값으로 취급될 수 있기 때문에 동적으로 생성될 수 있었던거지, 그게 클로저랑 상관있는 건 아니다
람다를 동적으로 생성하는게 위 코드의 핵심이 아니라 outer 함수의 인자 suffix를 내부 익명함수에서 접근하고 있다는게 핵심인거지. 그냥 람다 동적 생성할거면 내가 왜 함수안에 함수 생성 이ㅈㄹ을 왜 햇갯누..
그럴거면 아예 스트래티지 패턴이니 콜백이니 언급하질 말았어야지. 전혀 상관없잖아?
아니 왜 상관이 없는데? 저기서 사용한게 전략패턴이고 이를 위해 콜백을 썼는데
스트래티지 패턴에서 컨텍스트쪽으로 넘길 콜백을 생성하기 위해 이 "콜백이 만들어지는 방법"에서 클로저가 사용된거지, 그렇게 안하고 그 콜백을 동적으로 생성해서 넘기는데 꼭 클로저가 사용되어야 하나? 너는 존나 디테일한걸 가지고 떠들고 있는데 당연히 상관이 없지
내가 얘기했잖아 클로저의 정의를 얘기한게 아니라 쓰임새를 얘기한거라고. 클로저란 전략패턴에서 쓰이는 개념이다라 한것도 아니고 콜백 넘길때 그 콜백함수를 동적으로 정의할때 클로저가 편하다라고 한거임. 물론 클로저의 전체 쓰임새를 생각하면 ㅈㄴ specific한 답변이 되긴 하겠지 근데 미리 짚고 넘어갔는데 이렇게 불편해할게 뭐 있누
팩폭보소ㅎ 여기서도 클로저, 전략패턴이 뭔지 모르고 가오잡으려다가 거짓말이 거짓말을 부르는 화법을 반복했구만.. ㅋ
너가 혼동하고 잇는건
https://kimddochi.tistory.com/71
이거다
그리고 OOP도 가라로 배웠구만~ 난 동적으로 생성하지 않고 저렇게 선언해서 넘기는게 왜 OCP 위반인지 이해 못하겠음. 제네럴한 템플릿쪽은 여전히 외부로부터 콜백을 주입받으니까 OCP 위반 아니고, 사용자 측도 그 니가 콜백을 직접 생성하던 따로 선언해두던 구현은 그대로 들고 있는데 왜 OCP 위반인가요? 위반이라고 할거면 둘다 위반이지. 저렇게 한다고 해서 나아지는건 없음
내가 예를 간단한 suffix formatter로 예를 들었지만 다른 이유로 사용자 입력을 동적으로 받아서 콜백 함수를 넘기고 싶을땐 어떻게 미리 선언할거임? 그리고 이런 수정 사항이 들어올때마다 직접 하나씩 선언한 애들은 계속 추가로 하드 코딩해줘야 하는 반면 동적으로 생성한 콜백은 비교적 변화에 덜 민감하지 않겠음?
장난치세요? get_suffix_formatter('foo')랑 get_suffix_formatter('bar')가 존재한다는 것 자체부터 구현에 커플링되어 있구만. 그럴 거면 이것 자체를 외부에서 주입받아야 했지.
그래 그럼 get_suffix_foramtter(input()) 이렇게 하면 되지? 하나하나 내가 일일이 다 떠먹여 줘야 함?
아니요? 전 그래도 맘에 안드는데요. 전 그 문장 자체를 없앨 수 있다고 보는데요?
그래요? 그럼 보여주셈
그걸 한단계 외부에서 전달받아야 한다니까.
안됨 난 이제 정말 나가야 됨. 결론은 너 ㅂㅅ
이따 오면 더 얘기하자 나도 10시면 시간 될거 같음