如何优化coding
如何优化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的更多相关文章
- RSA算法优化
RSA算法优化 大数乘法 模乗优化 剩余定理(孙子定理) RSA加解密 python的RSA计算优化 #-*- coding: utf-8 -*- ''' /********************* ...
- Python2--Pytest_html测试报告优化(解决中文输出问题)
1.报告的输出: pytest.main(["-s","Auto_test.py","--html=Result_test.html"]) ...
- Android内存优化总结【整理】
http://blog.csdn.net/tiantangrenjian/article/details/39182293 [前段时间接到任务着手进行app的内存优化,从各种各样的渠道搜索相关资料,最 ...
- 基于 CODING 轻松搞定持续集成
点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...
- pygame事件之——控制物体(飞机)的移动
近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...
- Python_oldboy_自动化运维之路_线程,进程,协程(十一)
本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程 ...
- Python_oldboy_自动化运维之路_socket编程(十)
链接:http://www.cnblogs.com/linhaifeng/articles/6129246.html 1.osi七层 引子: 须知一个完整的计算机系统是由硬件.操作系统.应用软件三者组 ...
- 'utf-8-sig api_res = r.data.decode('utf-8') json_ = json.loads(api_res)
东莞市 东莞城市标志 东莞城市标志 1985年,广东省东莞县经国务院批准列为珠江三角洲经济开发区,同年9月撤消东莞县,建立(县级)东莞市,1988年1月升格为地级市.东莞市是全国五个不设市辖区的地级市 ...
- Mac App 破解之路八 病毒程序分析
本人使用MacBooster 7 扫出了几个未知程序. JMJ56 这个程序. 在finder中打开发现是一个shell脚本 调用了python 9NKb0 就是python脚本使用. 只不过是 ...
随机推荐
- Linux 江湖系列阶段性总结
引言 我使用 Linux 已经有很多年了,最开始接触 Linux 的时候是从 RedHat 9(没有 Enterprise),中途换过 N 个不同的发行版.多年前,我在 BlogJava 上面分享 J ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- .NET Core的日志[4]:将日志写入EventLog
面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针对各种事件的日志,我们的应用 ...
- 使用mybatis-generator在自动生成Model类和Mapper文件
使用mybatis-generator插件可以很轻松的实现mybatis的逆向工程,即,能通过表结构自动生成对应的java类及mapper文件,可以大大提高工作效率,并且它提供了很多自定义的设置可以应 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- Flexible 弹性盒子模型之CSS flex-shrink 属性
实例 让第二个元素收缩到其他元素的三分之一: 效果预览 div:nth-of-type(2){flex-shrink:3;} 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟在 - ...
- AFNetworking报错"_UTTypeCopyPreferredTagWithClass", referenced from: _AFContentTypeForPathExtens
问题: 在和Unity交互的过程中,从Unity开发工具打包出来的项目文件,在添加AFNetworking库,运行时报出以下错误: Undefined symbols for architecture ...
- Android的Kotlin秘方(I):OnGlobalLayoutListener
春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://an ...
- handlebars自定义helper的写法
handlebars相对来讲算一个轻量级.高性能的模板引擎,因其简单.直观.不污染HTML的特性,我个人特别喜欢.另一方面,handlebars作为一个logicless的模板,不支持特别复杂的表达式 ...
- CSharpGL(28)得到高精度可定制字形贴图的极简方法
CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...