写点什么

架构误区 8:需求 === 架构设计

作者:agnostic
  • 2022-12-18
    上海
  • 本文字数:886 字

    阅读完需:约 3 分钟

这周 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,命名上也没太多的瑕疵。

但是看上去,总不是那么回事。


细细品一下,这段逻辑不是实现上有什么问题,而上在设计上,有那么直接翻译需求的意思:

  1. 从代码看出,这个是一个 dto 的 conversion,如果是一个 DTO 的话,为什么要管页面上保留几位这个逻辑呢?

  2. 如果这段代码输出是一个 VO 或者 ViewModel,在这里做格式化没啥问题。但是,这里是做格式化,不是在做取子字符串。

  3. 这段逻辑的复用性和可维护性不高。


如果正确的写法,应该先抽象一个格式化的工具类:

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 方法。


总之,需求不完全等于设计。我们在设计的时候,还要考虑分层、复用、性能、可读性、可维护性等大量非功能的维度。


发布于: 刚刚阅读数: 8
用户头像

agnostic

关注

常识、KISS、高可用、合规架构、架构治理 2019-02-14 加入

二十年架构经验,互联网金融专业架构师。Open Group Master Certified Architect

评论

发布
暂无评论
架构误区8:需求===架构设计_agnostic_InfoQ写作社区