如何优化coding

前言

最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码。如果代码写的好的,不用debug就可以一眼看出来哪里出了问题。实际上,我都要debug好多遍才能差不多理解这个业务逻辑,进而分析原因以及修改修复的代价。这项工作花费了我绝大部分的时间,而且并没有什么意义,因为fix bug之后就再也不会处理这些代码了。

因此,易读性应该放在代码的首要位置,如果长期维护的话。

1.好的命名规范和良好的注释

什么样的命名才是好的?可以表明这个方法的功能,而且名字长度不要太长。如果名字无法完整的表述含义,则应该添加注释。我debug的代码从来没看到过注释。

2.讨厌的if

if用的真不要太多,debug的时候发现一个if又一个if,if里面嵌套if。也许这是为了逻辑的完整性,但是千万要在每个if分支里都给出一个结束的定义,即这个if结束了,主要做了什么。经常debug if之后还没有理解这个分支是干嘛的,然后去看下一个分支。

不应该鄙视if,因为这是业务发展过程中代码的补充。突然换了需求,又不能丢掉原来的代码,只能if。随着时间推移,问题也就出来了。应该想着去换个设计模式去重构这段代码,而不是赶时间加一个if,这个在后期维护中是代价极大。

3.太多的try catch

exception的处理基本都是try catch, 然后基于当时的想法决定是否抛出去。当我重新debug的时候,我不知道这个位置抛出去了对上一级是否有影响,不抛出去又会怎么样。

4.肆无忌惮的重构

遇到大块的代码就提取出来,这是最简单的重构。然而,当你debug从一个方法进入另一个方法再进入另一个方法,回头又跳回来,绝对懵逼。

重构的时候一定要在该方法领域内完整的阐述功能,而不要为了重构而重构,结果语义不完整,代码很分散。

5.处理json数据

项目大了之后,服务分拆成各种微服务。于是,各种调用webservice. webservice返回xml或者json。返回xml的烧了,暂且不提。返回json的,我们明明有jackson/gson等各种json序列化工具,只要建立好model,直接映射过来就好。甚至还有JsonInclude,JsonPropertyIgnore等条件配置。而偏偏很多接口使用一个JsonObject来接收response。然后来一个map方法,调用JsonObject的各个属性的来获取各个值,再手动丢进一个model里。

到这里,项目中使用org.codehaus.jettison.json来处理json数据,这个框架有个问题,JsonObject.get(key)的时候,如果key不存在,则不是返回null,而是抛出一个exception。我最近修改了两个bug都是因为response中没有这个key而抛出的异常。而response之所以没有这个key是因为webservice那边处理返回结果model不一定。正确的则返回这样,失败了则返回其他字段。而client的这端,没有预料到失败的结果映射,或者说以不变应万变,用exception来反映失败。

因此,webservice一定要定义好返回的model,失败了,不要一下是warning,一下是message。这样也可以,但要有文档说明你们返回的结果是什么model,client好做映射。client这边最好还是不要手动映射了,妈的出错了debug也很烦。client可以封装多个model,比如正常的model,失败的model。先序列化为正常的,序列化失败则序列化为失败的model。

如何优化coding的更多相关文章

  1. RSA算法优化

    RSA算法优化 大数乘法 模乗优化 剩余定理(孙子定理) RSA加解密 python的RSA计算优化 #-*- coding: utf-8 -*- ''' /********************* ...

  2. Python2--Pytest_html测试报告优化(解决中文输出问题)

    1.报告的输出: pytest.main(["-s","Auto_test.py","--html=Result_test.html"]) ...

  3. Android内存优化总结【整理】

    http://blog.csdn.net/tiantangrenjian/article/details/39182293 [前段时间接到任务着手进行app的内存优化,从各种各样的渠道搜索相关资料,最 ...

  4. 基于 CODING 轻松搞定持续集成

    点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...

  5. pygame事件之——控制物体(飞机)的移动

    近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...

  6. Python_oldboy_自动化运维之路_线程,进程,协程(十一)

    本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程 ...

  7. Python_oldboy_自动化运维之路_socket编程(十)

    链接:http://www.cnblogs.com/linhaifeng/articles/6129246.html 1.osi七层 引子: 须知一个完整的计算机系统是由硬件.操作系统.应用软件三者组 ...

  8. 'utf-8-sig api_res = r.data.decode('utf-8') json_ = json.loads(api_res)

    东莞市 东莞城市标志 东莞城市标志 1985年,广东省东莞县经国务院批准列为珠江三角洲经济开发区,同年9月撤消东莞县,建立(县级)东莞市,1988年1月升格为地级市.东莞市是全国五个不设市辖区的地级市 ...

  9. Mac App 破解之路八 病毒程序分析

    本人使用MacBooster 7 扫出了几个未知程序. JMJ56 这个程序. 在finder中打开发现是一个shell脚本 调用了python 9NKb0 就是python脚本使用.    只不过是 ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. SQL必备知识点

    经典SQL语句大全 基础 1.说明:创建数据库.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 device.说明:创建新表crea ...

  3. git亲测命令

    一.Git新建本地分支与远程分支关联问题 git checkout -b branch_name origin/branch_name 或者 git branch --set-upstream bra ...

  4. 开始学nodejs——net模块

    net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...

  5. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  6. css选择器

    常用css选择器,希望对大家有所帮助,不喜勿喷. 1.*:通用选择器 * { margin: 0; padding: 0; } 选择页面上的全部元素,通常用于清除浏览器默认样式,不推荐使用. 2.#i ...

  7. Android开发学习——画横线竖线

    画横线/竖线 竖线 <View android:layout_width="1dp" android:layout_height="match_parent&quo ...

  8. Mysql 忘记root密码处理办法

    一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...

  9. ubuntu14.04下安装node.js

    在网上查了下,起初是下载了一个node-v0.12.7-linux-x64.tar.gz,解压在/home/node路径下,然后在/etc/profile中添加如下命令: export NODE_HO ...

  10. Zookeeper常用命令

    http://www.cnblogs.com/chengxin1982/p/3997706.html