同事代码写的很糟糕,该怎么给建议
今天看了同事写的一个周签到的代码,看了之后,心态爆炸了。该怎么给同事建议呢?
/**
* 签到列表
*/
public function getSignStatus(array $params)
{
if (!is_array($params)) return $this->failed();
$this->setRedis($params['gameCode']);
$this->setHashKey($params);
$week = [];
$weekCount = [];
$rewardConfigs = $this->_redis->get($this->_key) ? json_decode($this->_redis->get($this->_key), true) : [];
foreach ($rewardConfigs as $item) {
if ($item['sign_type'] == SignConfig::TYPE_WEEK) {
$dayName = $item['day'] - 1;
$ymd = date('ymd', strtotime("+$dayName day", strtotime(Carbon::now()->startOfWeek())));
if ($this->_week_redis->exists($this->_sign_key)) {
$res = $this->_week_redis->getbit($this->_sign_key, $ymd);
if ($res == 1) {
$sts = SignConfig::SIGN_STATUS_ACQUIRE;
} else {
if (date('ymd') > $ymd) {
$sts = SignConfig::SIGN_STATUS_OVERDUE;
} else if (date('ymd') == $ymd) {
$sts = SignConfig::SIGN_STATUS_RECEIVE;
} else {
$sts = SignConfig::SIGN_STATUS_UNCLAIMED;
}
}
} else {
$sts = (date('ymd') == $ymd) ? SignConfig::SIGN_STATUS_RECEIVE : SignConfig::SIGN_STATUS_UNCLAIMED;
}
$week[] = [
'day' => $item['day'],
'status' => $sts,
];
} else if ($item['sign_type'] == SignConfig::TYPE_WEEKCOUT) {
if ($this->_week_redis->exists($this->_week_sign_key)) {
$sts = $this->_week_redis->getbit($this->_week_sign_key, $item['day']);
} else {
$sts = SignConfig::SIGN_STATUS_UNCLAIMED;
}
$weekCount[] = [
'day' => $item['day'],
'status' => $sts,
];
}
}
$returnData = [];
if ($this->_week_redis->exists($this->_week_sign_key)) {
$returnData['week_count_days'] = $this->_week_redis->bitcount($this->_week_sign_key);
} else {
$returnData['week_count_days'] = 0;
}
if ($this->_week_redis->exists($this->_sign_key)) {
$returnData['week_days'] = ($this->_week_redis->bitcount($this->_sign_key) != 7) ? $this->_week_redis->bitcount($this->_sign_key) : 0;
} else {
$returnData['week_days'] = 0;
}
$returnData['week'] = $week;
$returnData['weekCount'] = $weekCount;
$this->checkSigned();
return $this->success($returnData);
}
仅对这个方法说下我的看法:
- 很多无用的代码
//这段代码没什么用的吧,参数不是已经限制是数组了吗?
if (!is_array($params)) return $this->failed();
//这行代码是不是应该被开除
$rewardConfigs = $this->_redis->get($this->_key) ? json_decode($this->_redis->get($this->_key), true) : [];
//这个if判断是不是没用
if ($this->_week_redis->exists($this->_week_sign_key)) {
$returnData['week_count_days'] = $this->_week_redis->bitcount($this->_week_sign_key);
} else {
$returnData['week_count_days'] = 0;
}
//写成这样就可以了
$weekCount = $this->_week_redis->bitcount($this->_week_sign_key);
- 嵌套是不是太深了? 就不展开说了。我觉得一个好的设计,逻辑是比较简单,代码让人看了很舒服的。
这是一个新项目的,还没上线的,之前同事开发的,因为疫情原因,领导让我暂时接手。
其实我个人非常认同 @Remember 提到的沟通技巧,跟非技术类同事沟通(比如客服产品什么的)我会倾向于使用这些技巧。不过跟技术同事沟通代码相关的问题,我现在都是正面指出错误并展开激烈讨论,注意是讨论,最终得出结论就 OK 了。客套和委婉反而容易让问题更加隐蔽,这些隐患叠加起来可能造成更严重的后果。
当然这样做的前提是,你得提前澄清自己:
要做到以上两点其实挺不容易,需要跟同事有一定默契,如果双方(尤其是自己)没有心理准备,这种日常的讨论很有可能演变为争论,甚至是谩骂。
我现在跟我经常合作的那位同事磨合的差不多了(自认为),之前对方还会有担心我这么激烈的讨论结束后会不会有情绪或者怎样,现在有啥问题我们俩就直接单刀直入,讨论完无论采纳了谁的主张,双方都能了解到对方的思路,从不同的角度看待这个问题。最后还是该开玩笑开玩笑,平时同事关系也没有受到什么影响。这种「平衡」非常难能可贵,只有慢慢磨合才能得来了。
至于楼主贴的那段代码其实我感觉写的还凑合,算不上非常烂😂。如果能加上注释让逻辑更易读或是拆分成多个方法来处理就更清晰了。