대체로 DI로 할 수 있는걸 더 느리게 하는거 아닌가?싶어서(한번 더 호출해야하니)
어떤 함수가 어떤 행동을 하는 것과, 어떤 함수가 어떤 행동을 할 수 있는 함수를 반환하는게 실질적으로 그리 큰 차이가 있나?
그 반환된 함수로 다른 곳에서 그걸 써서 조합을 한다고 하는데, 그럼 그냥 따로 함수를 반환하지 않고 이 함수 자체를 거기 들고가서 조합하면 되는거 아닌가?
가져간 곳에서는 그 콜백을 부르는 함수를 반환하는게 아니라 그냥 호출해서 반환하면되는거고
시스템에서 그걸 요구하는거면 그렇게 함수를 업그레이드해서 해주면 이점은 있을거같은데(리액트 함수형 컴포넌트처럼)
그게 아니면 그냥 한번 더 호출하기만 하는거 아닌가?
오늘 이거 써서 뭐 만들어보려다가 갑자기 그런 의문이 들어가지고 ...
어떤거 만들어보려고 하시는데요?
원래 "아 함수를 추상화시켜서 만든다고? 그럼 업그레이드가 정말 많이 가능하겠구나" 이런 생각에서 착안해서 만들다보니까요, "그냥 이걸 하는 함수를 또 반환할게 아니라 그냥 이 함수를 쓰면되는거아니야? 성능도 더 빠르고"라는 생각이 들었어요
어떤 함수를 받아서 전후에 디버그를 한다고 치면요, 그냥 콜백을 받고 Debug(...)callback()Debug(...)하는게 return () => { Debug(...) callback() Debug(...)}하는거랑 이게 쓰는 곳에서 차이가 있을까? 하는 생각이 들어요
언어는 자바스크립트인가요?
타입스크립트에요
inc = add 1
진짜 이 편하고 좋은걸 설명해줘야 안다는게 개웃기네ㅋㅋ
근데 DI로 대체안되는 예시가 그래서 뭐임?
그냥 기계적으로 쓰면 "어 함수 조립이니까 편해"이렇게 생각하는데, 막상 커링 아닌 예시로 그거 대체할 수 있냐고하면 대체로 대체가능함. add multiply예시 많이 들고오는데, 그냥 add(multiply(3, 5), 3)으로 대체가능한거랑 똑같음
내가 지금까지 생각한게, 결국 커링이란게 콜백 여러개 파라미터로 받아서 뭔가 합성 어쩌고 하는 과정에서 결국 콜백으로 받은 함수의 구현부를 조작을 못함. 그럼 결국엔 그냥 그 함수를 부른 결과로 연산하는거랑 별반 차이가 없는데 그냥 호출 한번 더 해서 더 어렵고 성능 떨어지게 만든다는게 내 생각임
const add3 = add(3); const willBe5 = add3(2) const willBe9 = add3(6) 처럼 로직 추상화가 꿀인데 자바스크립트에서 함수 호출 비용이 병목인 경우는 많지 않을거임
이게 그러니까 제가 보기엔 커링인 add(3)(2)를 하는거나, const willBe5 = (x) => add(3, add(2, x))를 하는거나 실제로 할 수 있는 일이 크게 늘어나지 않는데 함수호출만 한번 더 하는 상황을 만드는거 아닐까 싶어서요. 그리고 아무리 병목인 경우가 적다고 해도 모든 함수를 커링으로 떡칠하면 로우앤드에선 영향이 없다고는 보기 힘들지 않을까요. 어찌됬건 커링의 컨셉이 말씀하신대로 추상화인데, 딱히 이해하기 쉬워진 것도 아니고, 문제를 쉽게 만들지도 못했다는 생각이 들어서요.
add3이란걸 못봤네요. 수정하면 const add3 = (x) => add(3, x) const willBe5 = (x) => add3(2, x)가 되겠네요.
제 예는 단순한 예이고, 실제에서는 함수 인수에 대한 추상화가 가능해지니 유용하죠 함수호출비용은 제가 알기로 그렇게 비싸지 않습니다 자바스크립트면 차라리 인라인캐싱과 히든클래스를 어떻게 활용할지 고민하는케 좋습니다.
그게 커링을 523배 활용할 수 있도록 api나 그런게 잘 안되있으면 편의성 잘 못느낄 수 있긴 함
커링 잘 쓰는 언어들은 ㄹㅇ 별 기묘한 방식으로 함수 쥐어짜서 쓰다보니까 크게 와닿는데 아닌 언어들은 그냥 그저 그럼
아 안그래도 언어차이가 있다는 얘길 방금 본 것 같읍니다. 좋은 의견 감사합니다.