这周 Review 代码,发现一段逻辑:
dto.setClientQuoteValue(StringUtil.substring(model.getClientQuoteValue(),CommonConstant.NUM_ZERO,CommonConstant.NUM_SEVEN));
dto.setSpotQuoteValue(StringUtil.substring(model.getSpotQuoteValue(),CommonConstant.NUM_ZERO,CommonConstant.NUM_SEVEN));
dto.setCurrentQuoteValue(StringUtil.substring(model.getCurrentQuoteValue(),CommonConstant.NUM_ZERO,CommonConstant.NUM_SEVEN));
复制代码
这段逻辑清晰么?挺清晰的:汇率保留 7 位的长度,由于页面显示太长会折行对用户也没啥参考意义。
这段逻辑有代码规范上的问题么?好像也没有,没有 magic number,命名上也没太多的瑕疵。
但是看上去,总不是那么回事。
细细品一下,这段逻辑不是实现上有什么问题,而上在设计上,有那么直接翻译需求的意思:
从代码看出,这个是一个 dto 的 conversion,如果是一个 DTO 的话,为什么要管页面上保留几位这个逻辑呢?
如果这段代码输出是一个 VO 或者 ViewModel,在这里做格式化没啥问题。但是,这里是做格式化,不是在做取子字符串。
这段逻辑的复用性和可维护性不高。
如果正确的写法,应该先抽象一个格式化的工具类:
final class RateFormatUtil {
formatRate(String rateValue, int length) {
if (StringUtil.isBlank(rateValue) || rateValue.length() <= length) {
return rateValue;
}
return StringUtil.substring(model.getCurrentQuoteValue(), CommonConstant.NUM_ZERO, length)
}
复制代码
然后,这里只是一个 format:
vo.setClientQuoteValue(RateFormatUtil.formatRate(model.getClientQuoteValue(),CommonConstant.NUM_SEVEN));
vo.setSpotQuoteValue(RateFormatUtil.formatRate(model.getSpotQuoteValue(),CommonConstant.NUM_SEVEN));
vo.setCurrentQuoteValue(RateFormatUtil.formatRate(model.getCurrentQuoteValue(),CommonConstant.NUM_SEVEN));
复制代码
当然,也可以把 Rate 包装成一个对象(包括 rateId 和 rateValue),然后在对象中定义 format 方法。
总之,需求不完全等于设计。我们在设计的时候,还要考虑分层、复用、性能、可读性、可维护性等大量非功能的维度。
评论