在单独的函数中执行相同逻辑但具有不同数据的更好方法

时间:2015-09-09 14:26:06

标签: angularjs refactoring dry

我有两个几乎相同的功能,有些东西基本上只是被其他名称所取代。如果可以的话,我想干这个,但我找不到比这更有意义的解决方案,同时仍然保持可读性。

这些功能的目的是喜欢和不喜欢,如果你愿意,那么一个项目将被从不喜欢中删除,反之亦然。

优选地,其重构函数应适用于需要在一个地方删除某些内容并在另一个地方添加某些内容的其他情况。同时跟踪用户做出的选择。

是否有一个常用的模式来制作这样的功能,或者你们中的任何人都有更好的解决方案,使这些功能不那么可重复并适用于其他场景?

我猜我过去尝试过的一种方法是使用参数。然而,这感觉非常笨重,最终使用和阅读变得更加痛苦。我觉得必须有更好的方式来执行这样的事情。

$scope.like = function(review) {

  review.likesBy ? review.likesBy : review.likesBy = [];
  review.dislikesBy ? review.dislikesBy : review.dislikesBy = [];

  if (review.likesBy.indexOf(uid) !== -1) {
    review.likes--;
    review.likesBy.pop(uid);
  }
  else if (review.likesBy.indexOf(uid) === -1) {
    review.likes++;
    review.likesBy.push(uid);

    if (review.dislikesBy.indexOf(uid) !== -1) {
      review.dislikes--;
      review.dislikesBy.pop(uid);
    }
  }

  reviews.$save(review);
};

$scope.dislike = function(review) {

    review.likesBy ? review.likesBy : review.likesBy = [];
    review.dislikesBy ? review.dislikesBy : review.dislikesBy = [];

    if (review.dislikesBy.indexOf(uid) !== -1) {
      review.dislikes--;
      review.dislikesBy.pop(uid);
    }
    else if (review.dislikesBy.indexOf(uid) === -1) {
      review.dislikes++;
      review.dislikesBy.push(uid);

      if (review.likesBy.indexOf(uid) !== -1) {
        review.likes--;
        review.likesBy.pop(uid);
      }
    }

    reviews.$save(review);
};

0 个答案:

没有答案