条件分支简化
// 打印错误日志的一个demo
// 为啥这个需要重构?我咋感觉还挺不错的。。。。
// 怎么简化?
{
if (user_result == SUCCESS) {
if (permission_result != SUCCESS) {
reply.WriteErrors('error reading permission');
reply.Done();// 失败了就没必要往下了
return;
}
reply.WriteErrors('') // 可以不打印吗
}
else {
reply.WriteErrors(user_result)
}
reply.Done();
}
// 嵌套的条件判断扁平化 一般是将最少情况的分支放在最前
{
if (user_result != SUCCESS ) {
reply.WriteErrors(user_result)
}
// 成功 但 没有权限
else if (permission_result != SUCCESS) {
reply.WriteErrors('error reading permission');
}
// 成功
else {
reply.WriteErrors('')
}
reply.Done();
}
// 提前返回
{
if (user_result != SUCCESS ) {
reply.WriteErrors(user_result)
reply.Done();
return ;
}
// 能到这一步代表 user_result 是成功的
if (permission_result != SUCCESS) {
reply.WriteErrors('error reading permission');
reply.Done();
return ;
}
reply.WriteErrors('')
reply.Done();
}
投票
点赞点踩的计分功能,一篇文章对同一个用户有三种状态:已被点赞、已被点踩、无,三种形态互斥
点赞+1,点踩-1,无
现在响应用户的动作对文章进行计分,已知oldvote和newvote
第一版代码:
function vote_change(oldvote,newvote) {
let score = get_score();
if (newvote != oldvote) {
if (newvote == 'up') {
score += (oldvote == 'down'?2:1);
}
else if (newvote == 'down') {
score -= (oldvote == 'up'?2:1);
}
else if (newvote == ''){
score += (oldvote == 'up'?-1:1);
}
}
set_score(score);
}
代码存在的问题:
1、使用的相对计分,严重依赖于old与new之间的联系
2、2,1,-1等存在耦合,应该单独计算出来
// 拆分:投票计分值 + 改变计分算法
function vote_change(oldvote,newvote) {
let score = get_score();
score -= vote_value(oldvote);
score += vote_value(newvote);
set_score(score);
function vote_value(vote) {
if (vote === 'down') return -1;
if (vote === 'up') return 1;
return 0;
}
}