文档章节

2014年 代码总结与疑问

learn_more
 learn_more
发布于 2015/01/25 22:42
字数 1394
阅读 1834
收藏 41

   清楚的记得,2013年6月就开始出来实习,然后2014年3月来到深圳一家企业,6月大学毕业,10月转正直到现在。在工作中一直从事研发,包括 JavaScript、java、Android ,但是由于个人经验不足,总是在自己的代码中会出现些许bug,当然两年下来也积累了不少经验。下面就说说2014年我遇到的一些疑难,希望热心人能够帮助解答,同时也希望能够帮助别人。

问题一:

    关于if语句的使用,有嵌套if,有单分支if...

    然而,在项目中看到许多if-else真的令人作呕,尤其是if嵌套,如果仅仅嵌套两层,代码结构还可以弄懂,如果是嵌套太深,代码肯定晦涩难懂,后期维护成本必然上升。那么,项目中我们应如何减少if的使用呢?或者说如何才能够让我们的代码容易读懂,不受if的干扰。

if(){

}else if(){
    if(){
    
    }else{
    
    }
}else{

}


问题二:

    关于Exception的捕获与抛出

    异常在代码中处处可见,那么对于异常我们具体应该如何处理。问题是这样的,我在某个方法中出现了检查时异常,那么要么我就抛出,要么就捕获。如果是抛出的话,这个方法就成为了一个异常方法,是一个不安全的方法,任何调用这个方法的地方都要重复相同的异常捕获与抛出;如果是捕获的话,这个方法虽然成为了安全的方法,却不知道如何通知调用方我在内部发生了异常。我看过有些代码是捕获后又抛出了自定义异常类的实例给调用方,不知道这样好不好,反正我是觉得这个异常类的代码至少需要维护吧。项目中具体应该如何处理这些异常呢?

public Striing process(){
    
    try{
    
        // some codes
    
    }catch(Exception e){
       
    }finally{
    
    }

}

问题三:

    参数的校验

    为保证程序的健壮性,参数的合法性校验那是必不可少的一个步骤。可是,在程序中参数的校验具体交给谁呢?比如一个操作是新增一条记录,Controller里面的方法会判断参数是否合法,不合法就直接返回,合法执行下一步Service,那么Service方法中还需要对这些参数判断吗?接着执行Dao,那么Dao还需要对参数校验吗?看似Controller已经校验过了,就很安全,所以后续不需要校验,可是你不敢保证你的Service暴露的方法没人调用,同理Dao也是,只要有人调用了你的方法就会出现参数不合法而出现的各种运行时异常。那么,我们应该如何规范参数的合法性校验?

Controller
public String updateMsg(HttpServletRequest request){
    String username = request.getParameter("username");
    if(StringUtils.isBlank(username)){
        return null;
    }
    service.updateMsg(username);
}

Service
public String updateMsg(String username){
   if(StringUitls.isBlank(username)){
       return null;
   }
   // some codes
   return "";
}

Dao 
public String updateMsg(String username){
   if(StringUitls.isBlank(username)){
       return null;
   }
   // some codes
   return "";
}

问题四:

    JSONObject的使用

    JSON是网络数据传输的一种数据格式,同时JSON官网还提供了java相关的jar,json-lib让我们更容易的操作java与json,但是JSONObject有一个操作叫做toBean却差强人意,我相信很多人都遇见了这个问题,只是网上只有提问没有解答和我一样。希望高手可以解答。

JSONObject.toBean(JSONObject.fromObject("{name:dd}",User.class));

问题五:

    JavaBean的使用

    对程序员来说JavaBean并不陌生,Java中编写代码习惯使用JavaBean,觉得这样更加贴切面向对象编程,实质上限定了对象的扩展,尤其是一些业务逻辑经常发生变化的情况,一开始的时候只需要这些属性,后期结果又添加了属性同时又删除了属性,那么JavaBean自然也需要及时更新,这时问题来了,JavaBean更新后,调用JavaBean的set、get方法也会随着更新,从而代码处处需要更新啊!!JavaBean真的有那么好用???

public UserBean{
    private String username;
    
    public void setUsername(String username){
        this.username = username;
    }
    
    public String getUsername(){
        return this.username;
    }
}

问题六:

    JavaScript中方法参数定义问题

    自定义方法不但需要方法名称得当,让人一眼便明白方法的作用,同时方法的参数也要合理定义。项目过程中往往出现这样的情况,一个方法是改了又改。有的人觉得方法需要再添加一个形参,有的人则不需要这么多形参。幸好,JavaScript没有对实参的传递个数有严格要求,但是他对顺序是又要求的。我的问题是:把所有的形参当做一个对象config作为唯一形参会不会更好,这样另外有人想要添加形参,完全不需要改接口,不知道这样好不好?

function fun(config){
    var username = config.username || '';
    var age = config.age || '';
}

function fun(username , age){

}


以上就是我在2014年当中遇到问题的一小部分(基础不扎实扰的祸),

当然对于高手来说这些问题不值一提,

但是我要提出来,

就是希望你们能热心的解决,

本人感激不尽!!!!


© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中

评论(25)

沙罗曼蛇
沙罗曼蛇

引用来自“詹姆斯邦德”的评论

问题一,请阅读 <<重构>>,里面描述了如何解决if嵌套
问题二,请阅读 <<重构>>,里面介绍了两种性质的异常
问题六,请阅读 <<重构>>,对于参数过多的情况,说明函数职责太多,也有相应的解决方案
问题三这个校验是难免的
问题四有很好的解决办法,如FastJSON的反射直接转,不需要写相关转换类型之类的东西。
问题五是你分层没有分好的问题,各层有各自的bean就可以解决到传递的问题了
抛出异常的爱
抛出异常的爱
第一个问题, 我的解决过程. 有关升维与降维的过程
http://loveexception.iteye.com/blog/2293107
第二个问题 , 是工程师与教授的信仰问题
最后runtimeexception 中合了问题但没有解决问题
第三个问题 , 防御性编程用于防御非自己写的代码
如js 对 action 之间必然要防御,因为之间有可能不是自己写的代码
但其它的 防御就没那么多必要.
有此node语言库类让前后台用同一个js 进行验证. 我认为是正当的作法.
第四,没用过. 但 用过 map<String,List<Map<String,String>>>这类的类型......
参考 facebook 的 GraphQL 加 underscore 方式 从redis里计算出结果后返回list或 map 才是方向
又或者 hibernat 的ids 再 n+1 方式 也可能是方向
但深层json 必会被淘汰
5有更好的方向,更好的方案,
但是build / factory / 等设计模式使set get 尽量少对外开放, 只用最少的set get 对外
但是数据库单例 service 让这种设计 .... 不能进一步.

小辞
小辞

引用来自“蛙牛”的评论

1.注释清楚就可以了,如果用if..else代码清晰,逻辑清楚,用着也没有问题
2.关于异常,一些异常如果不影响接下来的业务逻辑,可以自己捕捉了,自己处理。否则的话还是应该抛出异常,
比如事务的异常,你自己捕捉了,事务就出问题了,无法回滚了
3.约定好,比如在controller中验证好,或者都放在service中验证, dao中就不需要验证了
4.你那个json好像格式不太对{"name":"dd"},另外json有很多第三方的类库,可以试试谷歌的Gson
5.javabean大多数的都是之前定义好的,尽量少发生变化,真发生变化了,尽量添加新的,别动旧的
或者采用重构的方法,进行修改,javabean还是有存在的必要的

引用来自“learn_more”的评论

感谢你的回答,首先 if else 自然是不会有问题的,本身业务逻辑就是if else拼接的过程,我的本意是:如何才能在项目中合理避免if else,因为if else在代码结构中确实不那么友好。当然,如果你们觉得if else在程序中并不影响,那么我的问题自然也是毫无意义的。对于第二个问题,我赞同你的说法。第三个的话,我不是很赞同,每个人负责自己的模块,都要保证每个模块的健壮性。第四个问题的话,很感激你能推荐Gson,我相信很多项目中都会使用json-lib,然而我的问题是JSONObject.toBean()这个方法的稳定性,这个可以自己去测试一下就知道问题了。第五个问题,我也赞同,只是我们项目组已经摈弃javaBean,使用List替代,不知道这样是否会好过javaBean,但是至少不需要维护javaBean,不用添加属性。最后再次感谢,我已经关注你。
我来解答你的第一个问题吧,你可以试着在第二层,或者第三层if。。。else写进一个单独的方法里,写一个通俗易懂的方法名称,我感觉会更好,并且,if。。。else中的代码段,你也可以写进一个单独的方法里,用你的方法名,来代替你的注释,我感觉会更好,复杂度也会降低一些
詹姆斯邦德
问题一,请阅读 <<重构>>,里面描述了如何解决if嵌套
问题二,请阅读 <<重构>>,里面介绍了两种性质的异常
问题六,请阅读 <<重构>>,对于参数过多的情况,说明函数职责太多,也有相应的解决方案
蔡佳娃
蔡佳娃

引用来自“learn_more”的评论

引用来自“甩葱哥”的评论

if嵌套的问题单从技术层面优化肯定是合并条件;用switch。

从需求层面来说如果设计上有大量的分支,则实现上是很难避免的。我的解决办法是在关键的分支上增加注释。3层以内其实还可以接受,更深的分支结构我想应该不是实现的问题,而是设计的问题了。
关于if分支的问题,我的建议是:只用单分支if语句,不用else,特别是采用if+return的方式。如遇到不满足条件的直接return掉,这样能够减少if嵌套,但是问题是多了return以及if逻辑判断,不知道你是否明白我的意思。

我就是用你这种方式做的。还有就是把嵌套的代码抽象到一个方法里,也可以。
小帅帅丶
小帅帅丶
不错 。记录的很好 总结的很好
小帅帅丶
小帅帅丶
不错 。记录的很好 总结的很好
南湖船老大
南湖船老大

引用来自“关红福”的评论

问题一:
这个if嵌套的问题可以出现在代码的各种层次上,上边大部都已经说得很全了。如果只是针对当前方法内的逻辑,可以采用反转式的防御式编程:
if(xxx){
return;
}
if(xxx){
return;
}
if(xxx){
return;
}
先一层一层判断不符合条件的直接退出,那么剩下的就是可以正常执行的逻辑了,正好和你嵌套的逻辑判断是相反的,这样会更清晰一些。

问题六:

参数太多的话,可以只传一个config对象,然后for循环处理,多看些JS开源源码就知道了,例如jQuery有个$.extend()方法是专门做这个事情的。

另外JS还有个arguments对象可以定义函数时不加参数,调用时动态获取。

引用来自“learn_more”的评论

感谢你的回答,我也很赞同您对问题一的处理,顺便问一下:return用得太多对代码的可读性是否会降低呢?至于问题六我觉得可能你误会了我的题意。谢过了!

引用来自“关红福”的评论

return的这个是有笑话的,大意是说Java出身的程序员,非常鄙视其它语言中一个方法内随意return,就像上边推荐的那样,所以他们通常这么做: function(xxx){ result = 0; // 一个初始值 if(xxx){ result = 0; } if(xxx){ result = 1; } // 根据逻辑对result进行更改,最后只有一个return return result; }
这不是一个笑话,统一出口是个很好的做法
lr0822
lr0822

引用来自“heihe123”的评论

引用来自“lr0822”的评论

顶一下

交流了
2014年 代码总结与疑问(二)

紧接上一篇博客 http://my.oschina.net/heweipo/blog/371633 ,对提出的六大问题中部分做一个总结,当然首先要感谢各位好友的热心评论,尤其是 关红福 、xia-yongsheng、甩葱哥以及蛙牛等人的...

learn_more
2015/01/26
250
4
信号和线程

万事皆有因 随着公司的业务不断扩大,我们在2013年底开始逐步的进入Java体系的阶段,不过谁都没有Java的经验,我们就决定自己动手丰衣足食的策略,学习,请教和顾问。经过2014年的一年的努力...

通九互联科技
2015/10/23
384
4
Promise实现的基本原理(一)

前言 前几天在项目中遇到回调地狱的情况,但我在刚开始写这个项目的时候还不会用Promise,只知道它可以用来解决回调地狱,所以就用全都用回调函数解决。我是看《深入理解ES6》这本书来学Pro...

Britta
04/14
0
0
iOS runtime(三)runtime之Ivar 详解

1.获取成员变量列表 1.1相关函数 1.2实例代码 1.3打印数据 1.4查漏补缺 实例代码及打印数据: 2.添加成员变量 2.1相关函数 2.2实例代码 People.h People.m 3.实例调用: 总结: 关于这个方法...

奔跑吧小蚂蚁
2018/05/25
0
0
警惕:移动应用App背后的安全危机!

相信每个人在自己的移动设备上安装应用时都会有同样的疑问:为什么这些应用都要读取我的通讯录、获取我的定位信息、读取我的短信、控制我的照相机……天啊,针对手机应用的各种疑惑都快可以写...

科技创造
2014/11/03
153
0

没有更多内容

加载失败,请刷新页面

加载更多

Phpstorm2018 永久激活

1、安装phpstorm,安装包请自行官网下载 http://www.jetbrains.com/phpstorm/download/ 2、下载JetbrainsCrack.jar文件,存放至你的phpstorm执行文件同级目录下 下载JetbrainsCrack.jar 提取...

happyfish319
7分钟前
2
0
谈一谈Android进程间通信的几种方式

###来看一下Android中除了AIDL还有哪些进程间通信的方式: 1、Bundle Bundle实现了Parcelable,所以在Android中我们可以通过Intent在不同进程间传递Bundle数据。 但是在Intent 传输数据的过程...

二营长的意大利炮手
8分钟前
4
0
互联网薪资“高开低走”,你的能力是否真的可以匹配高薪?

对于国内外主流互联网大厂,技术出身似乎已经成为各大掌门人的必备标签。谷歌 CEO 桑达尔·皮查伊、马克·扎克伯格、李彦宏、马化腾、雷军等等皆为技术人出身,都曾参与了公司内部重要产品的...

Java技术剑
10分钟前
2
0
java 多线程

线程声明周期 线程的五个状态:新建,就绪,运行,阻塞,死亡。 其中就绪和运行两个状态客户互相转换,但运行到阻塞,阻塞到就绪,只能单向转换。 刚new出的线程就是【新建】状态,调用start...

雷开你的门
11分钟前
4
0
构造器Constructor是否可被overrid

构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

无名氏的程序员
15分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部