함수형 프로그래밍 - 다형성 높이기
var _get = _curryr(function(obj, key) {
return obj == null ? undefined : obj[key];
});
function _each(list , iter) { //iter 는 함수
for (var i = 0; i< list.length; i++ ) {
iter(list[i]);
}
return list ;
}
기존에 값을 가져오는 _get함수를 사용하여 _each함수를 사용할때 input값으로 null값이 들어갈 때 에러가 나는것을 처리해 주는 작업을 해보려고 한다.
null값을 undefined 값으로 처리해주면 에러가 나지 않게 된다.
var _length = _get('length'); // get 함수에 키를 넘겨서 사용
function _each(list , iter) {
for (var i = 0, len = _length(list); i<len ; i++ ) {
iter(list[i]);
}
return list ;
}
실행 : _each(null, console.log); 이렇게 null값을 넣어주어도, undefined 처리가 되어서 에러가 나지 않는다.
이렇게 되면 _map도 _each를 사용하기 때문에 console.log(_map(null, function(v){ return v; } ) ); null값을 넣어도 에러없이 동작하게 된다.
console.log(_filter(null, function(v){ return v; } ) ); 필터함수도 마찬가지이다.
그래서 함수형 프로그래밍에서는 예외가 발생해도 에러가 나지 않도록 많이 처리하고 있다.
그 다음으로 _keys함수를 만들어 보자
console.log( Object.keys({name : 'gsjung ' , age: 33)} );
이렇게 로그를 찍으면 키 값만 리턴한다 . 결과 : ["name", "age"]
그러나 아쉽게도 null값이 인자로 들어가게 되면 에러가 나게 된다.
console.log( Object.keys(null) ); null값까지 다 처리하는 _keys 함수를 만들어 보자.
function _is_object(obj){ //오브젝트인지 체크하는 함수
return typeof obj == 'object' && !!obj;
}
function _keys(obj) {
return _is_object(obj) ? Object.keys(obj) : [];
}
그 다음으로 기존 _each함수의 다형성을 높여보자.
_each({
13 : 'id' ,
19 : 'hd',
25 : 'sg'
}, function(name){ console.log(name); });
이렇게 사용한다고 할 때, 현재 13, 19, 25는 키를 나타내고, 뒤에 id, hd, sg 는 value를 나타낸다.
저 함수를 실행하면 동작하지 않지만 , 뒤에 val값을 꺼낼수 있도록 함수를 바꿔보자.
var _length = _get('length');
function _each(list , iter) {
var keys = _keys(list);
for (var i = 0; i<keys.length ; i++ ) {
iter(list[keys[i]]);
}
return list ;
}
다시 위의 함수를 실행해보면 정상적으로 작동한다.
결국 _each를 사용하는 _map, _filter에서 모두 적용시킬수 있다.
console.log(_map({
13 : 'id' ,
19 : 'hd',
25 : 'sg'
}, function(name){ return name.toLowerCase(); }));
함수형 프로그래밍은 예외적인 데이터를 흘러가는 식으로 다뤄서 함수의 연속실행이 문제가 없도록 처리( null값 처리 등등)
_go({
1 : users[0],
2 : users[1],
3 : users[2]
},
_map(function(user) {
return user.name.toLowerCase();
}),
console.log);
예를들어 이렇게 _go함수를 사용하여 흘러가는 식으로 사용할 수가 있다.
처음에 데이터가 들어오는 형태에 따라서 두번째 함수에서 개발자 마음대로 데이터를 가져다 쓸 수 있다.