条件分支简化

  1. // 打印错误日志的一个demo
  2. // 为啥这个需要重构?我咋感觉还挺不错的。。。。
  3. // 怎么简化?
  4. {
  5. if (user_result == SUCCESS) {
  6. if (permission_result != SUCCESS) {
  7. reply.WriteErrors('error reading permission');
  8. reply.Done();// 失败了就没必要往下了
  9. return;
  10. }
  11. reply.WriteErrors('') // 可以不打印吗
  12. }
  13. else {
  14. reply.WriteErrors(user_result)
  15. }
  16. reply.Done();
  17. }
  18. // 嵌套的条件判断扁平化 一般是将最少情况的分支放在最前
  19. {
  20. if (user_result != SUCCESS ) {
  21. reply.WriteErrors(user_result)
  22. }
  23. // 成功 但 没有权限
  24. else if (permission_result != SUCCESS) {
  25. reply.WriteErrors('error reading permission');
  26. }
  27. // 成功
  28. else {
  29. reply.WriteErrors('')
  30. }
  31. reply.Done();
  32. }
  33. // 提前返回
  34. {
  35. if (user_result != SUCCESS ) {
  36. reply.WriteErrors(user_result)
  37. reply.Done();
  38. return ;
  39. }
  40. // 能到这一步代表 user_result 是成功的
  41. if (permission_result != SUCCESS) {
  42. reply.WriteErrors('error reading permission');
  43. reply.Done();
  44. return ;
  45. }
  46. reply.WriteErrors('')
  47. reply.Done();
  48. }

投票

点赞点踩的计分功能,一篇文章对同一个用户有三种状态:已被点赞、已被点踩、无,三种形态互斥
点赞+1,点踩-1,无
现在响应用户的动作对文章进行计分,已知oldvote和newvote

第一版代码:

  1. function vote_change(oldvote,newvote) {
  2. let score = get_score();
  3. if (newvote != oldvote) {
  4. if (newvote == 'up') {
  5. score += (oldvote == 'down'?2:1);
  6. }
  7. else if (newvote == 'down') {
  8. score -= (oldvote == 'up'?2:1);
  9. }
  10. else if (newvote == ''){
  11. score += (oldvote == 'up'?-1:1);
  12. }
  13. }
  14. set_score(score);
  15. }

代码逻辑思路如图:

image.png

代码存在的问题:
1、使用的相对计分,严重依赖于old与new之间的联系
2、2,1,-1等存在耦合,应该单独计算出来

  1. // 拆分:投票计分值 + 改变计分算法
  2. function vote_change(oldvote,newvote) {
  3. let score = get_score();
  4. score -= vote_value(oldvote);
  5. score += vote_value(newvote);
  6. set_score(score);
  7. function vote_value(vote) {
  8. if (vote === 'down') return -1;
  9. if (vote === 'up') return 1;
  10. return 0;
  11. }
  12. }