javaScript&jQuery

함수형 프로그래밍 - 다형성 높이기

BrightestBulb 2017. 10. 5. 10:27

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함수를 사용하여 흘러가는 식으로 사용할 수가 있다.

처음에 데이터가 들어오는 형태에 따라서 두번째 함수에서 개발자 마음대로 데이터를 가져다 쓸 수 있다.