다형성 높이기, _keys, error

each함수 null 대응

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

기존 each 함수의 경우 list가 null일 경우 에러가 발생한다. null error 발생을 대비하여 _get 함수를 이용해보자.

function _get(obj, key) {
  return obj === null ? undefined : obj[key];
}

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

list.length부분에 undefined가 들어가게 되면 에러가 발생하지 않고 false로 떨어지기 때문에 바로 for문이 종료하게 된다.

var _length = _get('length');
function _each(list, iter) {
  for (var i = 0; len = _length(list); i < len; i++) {
    iter(list[i]);
  }
  return list;
}

_each함수를 이렇게 변경하게 되면 _each함수를 사용하는 _map과 _filter함수도 null에 대응할 수 있게 된다.

_map(null, function(v) {return v;}); //[]

_filter(null, function(v) {return v;}); //[]

_go(null,
  _filter(function(v) { return v;}),
  _map(function(v) { return v * v;}),
  console.log); // []

이렇게 매번 null체크를 할 필요 없이 에러를 흘려보내는 방식을 사용하면 훨씬 유연한 프로그래밍이 가능하다.

//_keys만들기
console.log( Object.keys({ name: 'ID', age: 33 }) );
console.log( Object.keys([1, 2, 3, 4]) );
console.log( Object.keys(null) ); //error

function _is_object(obj) {
  return typeof obj == 'object' && !!obj;
}

//!! 명시적 형변환을 위해(to Boolean)

function _keys(obj) {
  return _is_object(obj) ? Object.keys(obj) : [];
}

//_keys를 이용하여 키값 확인
console.log( _keys({ name: 'ID', age: 33 }) );
console.log( _keys(null) ); 

_each함수의 외부 다형성 높이기

_each({
  13: 'ID',
  19: 'HD',
  29: 'YD'
}, function(name) {
  console.log(name);
});

위 each함수는 length가 없기 때문에 name이 나오지 않고 아무일도 일어나지 않는다.

length가 없어도 반복이 가능한 each함수로 만들어보자

function _each(list, iter) {
  var keys = _keys(list);

  for (var i = 0; len = keys.length; i < len; i++) {
    iter(list[i]);
  }
  return list;
}

each함수 내부에 받은 list로 keys함수를 실행하게 되면 Object 여부를 확인하면서 배열을 반환하기 때문에 어떠한 형이 들어와도 반복문이 실행된다.

_map({
  13: 'ID',
  19: 'HD',
  29: 'YD'
}, function(name) {
  return name.toLowerCase();
});

_go(users,
  _map(function(user) {
    return user.name;
  }),
  _map(function(name) {
    return name.toLowerCase();
  }));

이렇게 map 함수를 사용할 때에 객체를 값으로 던져도 내부에서 배열로 변경되기 때문에 정상적으로 작동하는 걸 확인할 수 있다.

좋은 웹페이지 즐겨찾기