다형성

Steve·2021년 3월 25일
0

map,filter는 이미 js에 있는 함수

[1,2,3,4].map(function(val) {// 이미 array에는 map이라는 함수가있음
  return val *2;
  })
); 

[1,2,3,4].filter(function(val) {// 이미 array에는 filter이라는 함수가있음
  return val %2; // 1,3
  })
); 

map, filter -> 함수가 아니라 메소드(즉 순수함수가 아님)
메소드는 객체의 상태에따라 결과가 달라지는 특징을 지님
메소드는 객체 지향 프로그래밍(oop)

메소드의 특징

  • 해당클래스에 정의돼있기 때문에 해당 클래스의 인스터스에서만 사용 가능
    map, filter는 array가 아니면 사용할 수 없단 얘기
    js에는 array가 아니지만 array로 여겨지는 객체들이 많이 있다.

array_like 객체
$('div')

document.querySelector('*').map(function(node) {
   return node.nodeName; // Error
   })
); // 이것이 만일 배열이라면 map이라는 내장함수가 있을것이다.

다형성을 다루기 어려운 부분이다. 해결책은?

함수형 vs 객체형
함수를 먼저만들고 함수에 맞는 데이터를 구성해서 함수에 적용하는 식의 프로그래밍 ->> 높은 다형성
_map(document.querySelector('*'), function(node) {
return node.nodeName;
});
함수형으로 변경만 했더니 쿼리셀렉터 올의 준비돼있지 않은 map의 역할을 실용적으로 사용 가능

함수가 먼저나오는 프로그래밍

  • 데이터가 나오기 전부터 함수가 있게돼고, 혼자 먼저 존재함
    데이터가 생기지않더라도 함수 자체가 먼저존재함.-->> 평가시점이 상대적으로 유연해짐 즉, 저높은 조합성을 만들수 있게됨

객체(데이터가) 먼저나오는 프로그래밍의 차이가 있다.

  • 데이터가 있어야 메소드가 생긴다-->> 평가의 순서가 중요하게 됨. 반드시 해당하는 객체가 생겨야 기능을 수행할수있게됨

내부 다형성

1) predi, iter, mapper

function _map(list, predi)
function _map(list, mapper)
function _each(list, iter)

2번째 콜백함수가 어떤 역할을 하는 함수인지에 따라 이름을 지어주는것이 중요

_map([1,2,3,4], function(v) { // 2번째로 들어간 함수를 callback함수라 하는 경향이 있음
return v + 10;
}); 

콜백함수는 일을 다 수행하고 나서 다시 돌려줄때 맨끝에서 다시 돌려주는것을 뜻하는 함수로서 콜백함수라함.
predi 어떤 조건을 리턴하는 함수
iter 돌면서 반복하는함수
map 맵핑하는 함수.
각각의 역할에 맞는 보조함수의 이름을 지어주는게 좋다.

외부의 다형성은
순수함수를 만들었고 Array_like(어레이처럼 생긴)면 다돌리수 있게 만는기법은 map, each , filter가 담당하지만,
그 배열안에 어떤값이든 들어있어도 수행할수있게 만드는 그 역할은 보조함수가 함
(2번째로 오는 콜백함수 말함)

개발자가 넘기는 배열과 배열안의 내부값에 대한 개발자의 이해로 두번째 보조함수 안에서 숫자니까 더할거라든지, 안에 들어있는 것이 node니까 node.nodeName을 참조할거라든지 개발자가 동시에 이런것들을 정할 수 있기 때문에 내부에서는 살펴보는거없이 mapper,predi와 같이 위임하기때문에 데이터형에 있어서 자유롭고 다형성을 높이는데 유리함

profile
Front-Dev

0개의 댓글