본문 바로가기

Study/VanillaJS

[개념잡기] 함수형 프로그래밍 - (8) 다형성 높이기

[개념잡기] 함수형 프로그래밍 - (8) 다형성 높이기

서론

이번 포스팅에서는 지금까지 작성했던 함수들의 다형성을 높이는 작업을 해보겠다.

함수형 프로그래밍

each 함수 error 처리

const _each = (list, iter) => {
  for(var i = 0; i < list.length; i++) {
    iter(list[i])
  }
}

_each(null, function(val) {console.log(val)})
// Uncaught TypeError: Cannot read property 'length' of null

each 함수는 리스트로 null 값이 들어가게 되면 error가 발생한다. each 에 get 함수를 이용하여 null 검사를 해보겠다.

const _length = _get("length")

const _each = (list, iter) => {
  for(var i = 0, len = _length(list);  i < len; i++) {
    iter(list[i])
  }
}

함수형 프로그래밍에서는 어떤 예외처리를 할때 try catch문을 작성하기 보다, 예외적인 값이 들어와도 동작할 수 있게 설계한다.

keys

Object.keys 는 해당 오브젝트의 키를 뽑아주는 것인데 null 이 들어갈 시 error 를 발생시킨다. null 이 입력되었을때 빈배열을 리턴하는 keys 함수를 만들어 보겠다.

const _is_object = (obj) => {
  return typeof obj == 'object' && !!obj
}

const _keys = (obj) => {
  return _is_object(obj) ? Object.keys(obj) : []
}

console.log(_keys({"name": "PAPICO", "age": 20})) // (2) ["name", "age"]
console.log(_keys(null)) // []

위 코드와 같이 함수형 프로그래밍은 다형성을 높이는 것이 중요하다.

each 다형성 향상

현재 each 함수는 리스트만 순회가능 하지만 방금 작성하였던 keys 함수를 이용하면 배열형태의 객체도 순회할 수 있도록 변형 가능할 것이다.

const _each = (list, iter) => {
  var keys = _keys(list)
  for(var i = 0, len = keys.length ; i < len; i++) {
    iter(list[keys[i]])
  }
}

_each([1, 2, 3, 4], console.log)
// 1
// 2
// 3
// 4

_each({'user': 'papico', 'age': '20'}, console.log)
// papico
// 20

list의 keys를 뽑아네 배열 형태로 저장한 후 keys의 length를 이용해 list를 순회하는 방법을 사용했다.

each 함수의 다형성을 높였을 뿐인데 each 함수를 사용하는 map, filter 함수도 다형성이 올라갔다.

_go(users, 
  _map(user => user.name),
  _map(name => name.toLowerCase()),
  console.log)

마무리

여러가지 함수들의 다형성을 높이는 작업을 수행했다.