前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高效开发的4条原则

高效开发的4条原则

作者头像
dys
发布2019-03-07 10:36:05
3240
发布2019-03-07 10:36:05
举报
文章被收录于专栏:性能与架构性能与架构

遵守下面4条原则会使我们的开发更加踏实、愉悦 ?:

1. 没有测试过的代码就是坏代码

对于我们自己和我们的开发团队,要不断的加强测试意识,形成我们的开发文化。

做好单元测试、集成测试,确保对于核心业务有足够测试。如果你的测试覆盖不足,那么客户早晚会帮你找出bug。

在团队中不断重复“没有测试过的代码就是坏代码”,直到沉淀为基本意识。

2. 方法要小

让我们看一个示例代码(不用细看):

代码语言:javascript
复制
function buildUrl(url, options) {
    var queryString = [];
    var key;
    var builtUrl;

    if (url === null) {
      builtUrl = '';
    } else if (typeof(url) === 'object') {
      builtUrl = '';
      options = url;
    } else {
      builtUrl = url;
    }

    if (options) {
      if (options.path) {
        builtUrl += '/' + options.path;
      }

      if (options.queryParams) {
        for (key in options.queryParams) {
          if (options.queryParams.hasOwnProperty(key)) {
            queryString.push(key + '=' + options.queryParams[key]);
          }
        }
        builtUrl += '?' + queryString.join('&');
      }

      if (options.hash) {
        builtUrl += '#' + options.hash;
      }
    }

    return builtUrl;
};

一眼看去是不是很难马上明白这个方法是干啥的?方法很长,又有那么多的 if else,并且还嵌套,比较混乱。但实际上这段代码并不长,只有35行。

再看下面的改进版本:

主函数:

代码语言:javascript
复制
function buildUrl(url, options) {
  const baseUrl = _getBaseUrl(url);
  const opts = _getOptions(url, options);

  if (!opts) {
    return baseUrl;
  }

  urlWithPath = _appendPath(baseUrl, opts.path);
  urlWithPathAndQueryParams = 
      _appendQueryParams(urlWithPath, 
                         opts.queryParams)
  urlWithPathQueryParamsAndHash = 
      _appendHash(urlWithPathAndQueryParams, 
                  opts.hash);

  return urlWithPathQueryParamsAndHash;
};

子函数:

代码语言:javascript
复制
function _getBaseUrl(url) {
  if (url === null || typeof(url) === 'object') {
    return '';
  }
  return url;
}

function _getOptions(url, options) {
  if (typeof(url) === 'object') {
    return url;
  }
  return options;
}

function _appendPath(baseUrl, path) {
  if (!path) {
    return baseUrl;
  }
  return baseUrl += '/' + path;
}

function _appendQueryParams(urlWithPath, queryParams) {
  if (!queryParams) {
    return urlWithPath
  }

  const keyValueStrings = Object.keys(queryParams).map(key => {
    return `${key}=${queryParams[key]}`;
  });
  const joinedKeyValueStrings = keyValueStrings.join('&');

  return `${urlWithPath}?${joinedKeyValueStrings}`;
}

function _appendHash(urlWithPathAndQueryParams, hash) {
  if (!hash) {
    return urlWithPathAndQueryParams;
  }
  return `${urlWithPathAndQueryParams}#${hash}`;
}

这个是不是就清晰多了,主函数只有14行代码,很容易理解,代码短、命名清晰,剩下的子函数需要时再细看就行了。

我们在开发时要养成好的习惯,方法是:

  1. 规划好主函数的核心步骤流程。
  2. 每个核心步骤定义为子函数。
  3. 子函数如果复杂,再规划核心步骤流程、定义子函数。

3. 方法应该没有副作用

看看下面的代码,看你能不能找出缺点:

代码语言:javascript
复制
function getUserByEmailAndPassword(email, 
                                    password) {                    
  let user = UserService.
        getByEmailAndPassword(email, password);
  if (user) {
      // Log user in, add cookie 
      // (Side effect!!!!)
      LoginService.loginUser(user);  
  }
  return user;
}

从名字来看,这个方法是根据 email/password 来获取用户。再看代码,在获取了用户之后,还执行了一个登录操作,设置cookie。这个“登录”就是副作用

总结下这段代码的缺点:

  1. 不看具体代码的话完全不知道他有2个意思,调用者很容易就误解了,看方法名很明确啊,哪成想还有别的功能。
  2. 给测试增加了难度,如果仅仅是获取用户,测试就很简单,现在增加了登录,又涉及到 cookie,是不是还要 mock HTTP response。
  3. 给后期维护带来麻烦,获取用户、登录这两个操作虽然现在是一体的需求,但以后很有可能有独立的需求,那时是不是还要变动。

4. 起名字要有明确的含义

很多人认为起名字是小事儿,不值一提,但这个小事儿真的意义重大。

例如很多人的命名:data、foobar、myNumber、SomethingManager,他们对于程序的运行是正确的,但会成为团队的维护噩梦

尽量让名字的含义精确,并尽可能简短,这样有利于代码的维护、代码 review,在 IDE 中可以根据名字快速查找代码。

小结

我们是有追求的程序员 ?,牢记这4点:

  • 没有测试过的代码就是坏代码
  • 方法要小
  • 方法应该没有副作用
  • 起名字要有明确的含义

内容翻译整理自:

https://engineering.videoblocks.com/these-four-clean-code-tips-will-dramatically-improve-your-engineering-teams-productivity-b5bd121dd150

点击阅读原文?,查看文章列表

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 没有测试过的代码就是坏代码
  • 2. 方法要小
  • 3. 方法应该没有副作用
  • 4. 起名字要有明确的含义
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档