为什么代码正确但是不运行没输入错误但是出不来结果?

种一棵树最好的时间是十年前,其次是现在

今天是2020的最后一天了,你所经历的总是会给你带来成长!今天和大家一起来学习学习干货,也是勉励自己从2021年开始,自己的代码风格,自己的代码的坏味道少点。嗯!其实我觉得还是很有必要的,所以我和大家一起来看看晓风轻的<程序员你为什么这么累>,我保证,大家肯定会有收获,我希望自己可以从现在开始,从2021年开始,严谨的对待每一行代码,与君共勉!

大家一提到程序员,首先想到的是以下标签:苦逼,加班,熬夜通宵。但是,但凡工作了的同学都知道,其实大部分程序员做的事情都很简单,代码CRUD可以说毫无技术含量,就算什么不懂依葫芦画瓢很多功能也能勉强做出来,做个多线程并发就算高科技了,程序员这行的门槛其实还是比较低的。(这里说的是大部分,有些牛逼的,写算法、jvm等的请自动跳过)

是不是觉得很矛盾,一方面工作不复杂,一方面却累成狗。有没有想过问题出在哪里?有没有想过时间都花在哪里呢?

对于我个人来说,编码还是一个相对轻松的活(我是负责公司it系统的,没有太多技术含量,数据量大,但并发量不大)。从工作到现在,我加班编码的时间还是比较少的,我到现在为止每天还会编码,很少因为编码工作加班。

大家写的东西都是一些crud的业务逻辑代码,为什么大家这么累,加班加点天天都是奋斗者?我从自己带的项目中观察中发现,大部分人的大部分时间都是在 定位问题 + 改代码,真正开发的时间并不多。定位问题包括开发转测试的时候发现问题和上线后发现问题,改代码的包括改bug和因为需求变动修改代码(后面专门开一贴说如何应对需求改动)。

所以说,simple is not easy。很多人就是因为觉得简单,所以功能完成自己测试ok了就算了,没有思考有没有更加好的方式。归根到底是因为编码习惯太糟糕,写的代码太烂,导致无法定位频繁修改频繁出问题。(后面我会详细讲一些我看到的大部分的编码问题。)

其实,对于个人来说,技术很重要,但是对于工作来说,编码的习惯比技术更加主要。工作中你面试的大部分技术都不需要用到的。工作中,因为你的编码习惯不好,写的代码质量差,代码冗余重复多,很多无关的代码和业务代码搅在一起,导致了你疲于奔命应付各种问题。

所以我作为SE,不管接手任何项目组,第一步就是制定代码框架,制定项目组的开发规范,把代码量减下去。事实上证明,这一步之后,大家的代码量能下去最少1/3,后台的问题数下降比较明显,大家的加班会比之前少。

给大家一个直观的例子。下面是controller的一个删除数据的接口,我来之前大家写的这个样子的(其实一开始比这个还差很多),功能很简单,输入一个对象id执行删除返回是否删除成功。大家有没有觉得有什么问题?

一个项目不可能没有工具类,工具类的初衷是良好的,代码重用,但到了后面工具类越来越乱,有些项目工具类有几十个,看的眼花缭乱,还有不少重复。如何编写出好的工具类,我有几点建议:

就是要定义自己的工具类,尽量不要在业务代码里面直接调用第三方的工具类。这也是解耦的一种体现。

如果我们不定义自己的工具类而是直接使用第三方的工具类有2个不好的地方:

  • 不同的人会使用不同的第三方工具库,会比较乱。
  • 将来万一要修改工具类的实现逻辑会很痛苦。

怎么样?6个方法,实际上代码主体只有一份,但提供各种类型的入参,调用起来很方便。开发组长编写的时候,多费一点点时间,就能写来看上去很专业调用起来很方便的代码。如果开发组长不写好,开发人员发现现有的方法只能传String,她要传的是InputStream,她又不敢改原来的代码,就会copy一份然后修改一下,就多了一份重复代码。代码就是这样烂下去了。。。

几乎所有人都知道面向对象的思想有抽象封装,但几个人真正能做到,其实有心的话,处处都能体现出这些思想。编写工具类的时候需要注意参数的优化,而且大型项目里面不要在业务代码里面直接调用第三方的工具类,然后就是多想一步多走一步,考虑各种类型的入参,这样你也能编写出专业灵活的工具类!

傻瓜都能写出计算机可以读懂的代码,只有优秀的程序员才能写出人能读懂的代码!

在我看来,编写简单的函数是一件简单又困难的事情。简单是因为这没有什么技术难点,困难是因为这是一种思维习惯,很难养成,不写个几年代码,很难写出像样的代码。

大部分的程序员写的都是CRUD、一些业务逻辑的代码,谁实现不了?对于我来说,如果业务逻辑的代码评审,需要人来讲每一个代码做了什么,这样的代码就是不合格的,合格的代码写出来应该像人说话那么简单有条理,基本上是业务怎么样描述需求,写出来的代码就是怎么样的。编写出非开发人员都能看懂的代码,才是我们追求的目标。不要以写出了一些非常复杂的代码而沾沾自喜。好的代码应该是看起来平淡无奇觉得很简单自然,而不是看得人云里雾里的觉得很高深很有技术含量。

如果你做好了我前面几篇文章的要求,编写简单的函数就容易的多,如果你觉得我之前说的去掉local,去掉用户参数这些没有什么必要是小题大做,那么我觉得你写不出简单的函数。从个人经验来说,函数编写的建议有以下几点:

不要出现和业务无关的参数

参考我之前的帖子,参数校验和国际化规范,函数参数里面不要出现local,messagesource,request,Response这些参数,第一非常干扰阅读,一堆无关的参数把业务代码都遮掩住了,第二导致你的函数不好测试,如你要构建一个request参数来测试,还是有一定难度的。

避免使用Map,Json这些复杂对象作为参数和结果

这类参数看着灵活方便,但是灵活的同义词(代价)就是复杂,最终的结果是可变数多bug多质量差。就好比刻板的同义词就是严谨,最终的结果就是高质量。千万不要为了偷懒少几行代码,就到处把map,json传来传去。其实定义一个bean也相当简单,加上lombok之后,代码量也没有几行,但代码可读性就不可同日而语了。做过开发的人应该很容易体会,你如果接手一个项目,到处的输入输出都是map的话,request从头传到尾,看到这样的代码你会哭的,我相信你会马上崩溃很快离职的。

还有人说用bean的话后面加字段改起来麻烦,你用map还不是一样要加一个key,不是更加麻烦吗?说到底就是懒!

如果一个项目的所有代码都如下面这样,我是会崩溃的!

有明确的输入输出和方法名

尽量有清晰的输入输出参数,使人一看就知道函数做了啥。举例:

上面的函数,看函数定义你只知道更新了用户对象,但你不知道更新了用户的什么信息。建议写成下面这样:

你就算不看方法名,只看参数就能知道这个函数只更新了nickname一个字段。多好啊!这是一种思路,但并不是说每一个方法都要写成这样。

把可能变化的地方封装成函数

编写函数的总体指导思想是抽象和封装,你要把代码的逻辑抽象出来封装成为一个函数,以应对将来可能的变化。以后代码逻辑有变更的时候,单独修改和测试这个函数即可。

这一点相当重要,否则你会觉得怎么需求老变?改代码烦死了。

如何识别可能变的地方,多思考一下就知道了,工作久了就知道了。比如,开发初期,业务说只有管理员才可以删除某个对象,你就应该考虑到后面可能除了管理员,其他角色也可能可以删除,或者说对象的创建者也可以删除,这就是将来潜在的变化,你写代码的时候就要埋下伏笔,把是否能删除做成一个函数。后面需求变更的时候,你就只需要改一个函数。

举例,删除配置项的逻辑,判断一下只有是自己创建的配置项才可以删除,一开始代码是这样的:

这里我会识别一下,是否可以删除这个地方就有可能会变化,很有可能以后管理员就可以删除任何人的,那么这里就抽成一个函数:

后来想了一下,没有权限应该抛出异常,再次修改为:

这就是简单的抽象和封装的艺术。看这些代码,参数多么的简单,很容易理解吧。

这一点非常重要,做好了这点,大部分的小的需求变更对程序员的伤害就会降到最低了!毕竟需求变更大部分都是这些小逻辑的变更。

这个非常重要,当然很难实现,很多人做技术之前都觉得代码都会做单元测试,实际上和业务相关的代码单元测试是很难做的。

我觉得要编写能测试的函数主要有以下几点:

第一不要出现乱七八糟的参数,如参数里面有request,response就不好测试,

第二你要把函数写小一点。如果一个功能你service代码只有一个函数,那么你想做单元测试是很难做到的。我的习惯是尽量写小一点,力求每一个函数都可以单独测试(用junit测试或者main函数测试都没有关系)。这样会节约大量的时间,尤其是代码频繁改动的时候。我们应用重启一次需要15分钟以上。新手可以写一个功能可能需要重启10几次,我可能只需要重启几次,节约的时候的很可观的。

第三你要有单独测试每一个函数的习惯。不要一上来就测试整个功能,应该一行一行代码、一个一个函数测试,有了这个习惯,自然就会写出能测试的小函数。所以说,只有喜欢编码的人才能写出好代码。

工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,结合强大的spring,效果很不错。

我一上来不会去考虑是用xml还是json还是数据库配置,我会第一步写好对应的配置bean。如上面的需求,就写3个bean。bean和bean之间的包含关系要体现出来。(使用了lombok)

然后找一个地方先用代码产生这个bean:

然后先测试,看看是否ok。为了演示,我就直接在controller里面调用一下

然后进行业务代码编写,等到所有功能测试完毕,就是【开发后期】,再来定义配置文件。中途当然少不了修改格式,字段等各种修改,对于我们来说只是修改bean定义,so easy。

都ok了,再决定使用哪种配置文件。如果是json,我们这样:

然后修改config的bean生成的代码为:

我之前的文章中,我个人观点是加班原因是编码质量占了大部分因素,但是不少同学都不认为是代码质量导致的加班,都认为是不断的需求改动导致的加班。这位同学,说的好像别人的需求就不会变动似的!谁的需求不改动啊?不改动的能叫需求吗?哈哈。

先看个程序员的段子娱乐一下

客户被绑,蒙眼,惊问:“想干什么?”
对方不语,鞭笞之,客户求饶:“别打,要钱?”
又一鞭,“十万够不?”
又一鞭,“一百万?”
又一鞭。客户崩溃:“你们TMD到底要啥?”
“要什么?我帮你做项目,写代码的时候也很想知道你TMD到底想要啥!”

有没有可能存在明确的、不再改动的需求呢?其实很难的。以前我们公司是瀑布开发模式,需求阶段时间较长,需要输出完整的需求规范,还要评审几次然后才进入开发,这个时候,需求变更就比较少,但还是有;后来公司赶时髦改成了敏捷开发模式,文档大量简化,于是需求没有考虑清楚就开始开发,需求是边开发边变动。敏捷开发模式间接变成了加班开发模式。

关于需求变动,不同的角色定义很不一样。BA觉得这个改动很正常,开发人员觉得就是个需求变更,两边各执一词,这种矛盾长期存在。

我列举几种场景,大家觉得算不算需求变更?

一开始只能创建者删除,后面变更为管理员也可以删除,再后面变更了某个角色也可以删除。

一开始使用xml配置,后面修改为json格式,又或者修改为使用数据库配置。

一开始导出为excel格式,后面变更为导出json格式或者pdf格式。或者一开始导出20个字段,后面变更为导出30个字段。

这些当然都是变更了,但这些真的就是我们加班加点的原因吗?!我们就没有办法只能任人宰割吗?!而我的观点刚好是,正是因为需求变更不可避免,所以我们才更应该把代码写简单,以对付各种各样的需求变化。有以下几点心得建议:

最起码的要求,我之前一系列的文章说的就是这个。重要程度不需要再讲了。改1行简单代码和改10行复杂代码,工作量能一样吗?!测试一个20行的函数和测试一个2行的函数工作量能一样吗?!

好比一个房子,你打扫的干干净净收拾得井井有条,将来房子里面的东西搬来搬去都比较简单;但如果你的房子垃圾堆一样,走进去都难(代码无法看),就更加不用说把东西搬动了(改代码)

把可能变化的封装成函数

请阅读:函数编写建议。很重要的习惯,多思考多抽象和封装,小变更将无法伤害到你。主动思考,主动思考将来可能的各种场景。其实这个不难,你只要有这个意识就成功了一大步!

多个功能中先做不会变的功能,一个功能中先做不会变的部分,兵法中叫攻其必救之地。你要知道哪些需求是所有人都明白看上去就很合理的需求,就先开始做,你觉得有争议的需求你可以放后面一点。同样,一个功能中你要知道哪些会变的,哪些是不会变的,不变的先做。

举例:每个系统都有导出功能,我们实现功能之前,先要考虑哪些功能是确定的,哪些功能是很可能变化的?简单分析之后可以知道,从数据库库查询出来然后处理包装数据这是肯定要做的而且不会变的,这个应该先做;而导出为什么格式(xls还是pdf),导出的具体完整字段,字段的格式如何展示这些是会变的,这些你开始甚至都不需要仔细看需求,等要做的时候在确认可能需求都有不同的变化。你完全可以边做前面确定的导出功能边确认其他的细节,确认需求的时间越多,需求就越清晰,变更的概率就越小。

多个功能中,我的习惯是先做最难的功能,最少要开始设计和思考,拉长功能开发周期。有些同学喜欢先做简单的,导致难的问题开发周期不够,后面加班加点也解决不了。加班其实是解决不了太多问题的

个人认为,解耦是编程里面重要的思想,解耦的关键在于:多引入“第三者”,不要直接发生关系。spring的IoC最重要的价值不就是解耦吗?spring的容器不就是“第三者”吗?就像mvc一样,数据和视图要彻底的分离,否则业务代码里面有视图代码改起来是很痛苦的。

我上面的配置规范里面的举例,bean的定义就是第三者,就是为了解耦。如导出功能里面,也要有中介。不要把查询数据,处理数据和导出数据都在一个函数一个循环里面做了。否则导出格式由xls改成pdf的时候,你相当于重写做了一遍功能。jms这些基于消息的都是解耦的思想,架构设计上要多用这些松耦合的设计。

由于是牵涉到表设计的时候,大家都知道改表结构很痛苦。很多时候,由于时间关系,一开始只做简单的功能,后面会慢慢丰富功能。这虽然不是变更,但是如果你一开始的时候不设计好,很可能后面版本需要大改动,数据库表都要推倒重来,比全新做还痛苦,相信大家会有体会。所以,作为开发组长,做任何一个功能都要想到将来的发展,功能现在可以不做,但必须对将来的变化做到了然于胸。

工作量问题当前版本只需要显示总下载量。你要考虑将来会不会要列出所有的下载过的用户?如果不需要,可能用一个字段记录总数就可以;如果需要,那么就要用新表,就算现在做起来麻烦一点也不要后面来推翻数据库表设计。

牵涉到link的,现在是1对1,要考虑将来有没有可能1对n或者n对n。1对1用个外键就可以了,否则一开始就单独用一张link表。

现在只对接一个系统,要考虑将来会不会相同的业务对接多个系统?如果会,你应该直接上jms这种(虽然工作量加大了),不上jms这种的话,也要设计成被动接受的集成方式,那么在增加新系统你都不需要怎么样改。(如果你主动请求的交互方式,多一个系统你就要多一个配置,多测试一遍,如果设计成被动接受的,就不需要什么配置和测试了。而很多时候,2个系统集成设计成主动被动都可以实现需求)

每一个开发人员都应该思考:需求变动真的是我加班的最重要原因吗?我的代码是否写得足够好?需求变更里面,我能控制是什么,我不能控制的是什么?我应该做好什么的准备来拥抱需求的变更?

我觉得这些点,是我们在crud中经常用的到。对应自己的编码能力有很大的帮助。。

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

mumu错误代码50001怎么办?网易mumu错误代码400?网易MuMu模拟器是一款非常好用的电脑安卓模拟器,不过在使用过程中,如果程序出现错误码应该怎么办呢?别着急,下面我们小编给大家整理了网易MuMu模拟器安装及更新过程中常见的错误代码及对应解决方法,内容有些多,小伙伴们可以通过Ctrl+F在右上角弹出窗口直接搜索问题关键词哦!

MuMu模拟器常见错误码大全

安装包退出错误代码及相关解决方案

网易MuMu模拟器不能打字怎么办?有很多网易木木模拟器的小伙伴反映,在程序里面不能输入的问题,网易mumu模拟器不能输入中文怎么办?下面小编带来了网易mumu模拟器不能输入中文的解决方法,希望对大家有所帮助. 网易mumu模拟器不能输入中文的解决方法: 1.打开你的网易MuMu模拟器: 2.Ctrl+空格键呼出电脑的输入法: 3.这样输入文字就可以啦! PS:记得鼠标先点击输入框,再进行输入,或者重启模拟器之后再次输入即可解决. 以上就是网易mumu模拟器不能输入中文怎么办的介绍.相信看完之后对

网易MuMu模拟器内存不足怎么办?有很多用过户表示,在使用网易模拟器时,一启动就显示内存不足的情况,下面小编带来了网易mumu模拟器提示内存不足的解决方法,希望对大家有所帮助. 网易mumu模拟器提示内存不足的解决方法: 1.网易MuMu模拟器发生内存不足的情况,是因为自己使用模拟器一直没有对其系统垃圾进行清理,只要清理内存即可: 2.可以给电脑增加内存条,这样运行时就不会出现内存不足的情况. 以上就是网易mumu模拟器提示内存不足怎么办的介绍.相信看完之后对小伙伴一定有所帮助.更多软件教程请继

网易MuMu模拟器网络异常怎么办?有很多小伙伴在使用网易模拟器的时候,会发现无法连接网络的问题,下面小编带来了网易mumu模拟器连接网络异常的解决方法,希望对大家有所帮助. 网易mumu模拟器连接网络异常解决方法: 1.查看系统目录,是否存在类似c:\windows\yyqg.dll的可疑的dll: 2.用360的系统急救箱工具,使用强力模式扫描并删除:(不一定是yyqt.dll这个文件,如不存在该文件也可以用360系统急救箱扫描一下) 3.删除后再确认步骤1的文件是还存在: 4.重启模拟器,打

网易MuMu模拟器是一款非常好用的手游模拟器,网易mumu模拟器没有声音怎么办,下面小编带来了网易手游模拟器没声音解决方法,希望对大家有所帮助. 网易手游模拟器没声音解决方法: 1.首先,查看模拟器中右下角声音图标,点击进入,是否没有开声音 2.其次,查看电脑声音没有开启. 3.重新下载网易mumu模拟器. 以上就是网易mumu模拟器没声音怎么办,网易手游模拟器游戏没声音解决方法.相信看完之后对小伙伴一定有所帮助.更多软件教程请继续关注我们!

网易MuMu模拟器Mac版启动卡在99%怎么办?应该怎么解决?估计用Mac的童鞋也都遇到过这个的情况,虽说目前给出的办法是是用uninstall.tool 脚本删了再装,估计照样解决不了的人也是一大堆.这里给出Mac版启动卡99%解决方法,一起去看看吧! 问题: 1. 启动之前网络DNS什么的检查好,mumu会检查自动更新 2. mumu必须要VT才能运行,而且似乎要独占,但开发并不检测有没有其他的东西在用VT,所以也没有错误信息就卡99%. 如果出现这个情况,请好好检查有没有同时打开用VT的程

网易MuMu模拟器mac版出现“模拟器端口被其它程序占用,请关闭相关程序后重试”的弹框应该怎么解决?这是很多用户都遇到过的问题,今天小编就给大家简单说说“模拟器端口被占用”解决办法,如果你也遇到了同样的问题,那就赶快按照以上方法试试吧! - 检查22471端口是否被其它程序占用,在关闭MuMu模拟器后可在终端用以下命令检查 sudo lsof -i:22471 - 如果有输出并显示出进程名称,则请先关闭对应的程序. 文章结束,以上就是关于网易MuMu mac版出现“模拟器端口被其它程序占用,请关

8.定位到到刚才下载的jar,点击ok,完成后按提示重启即可.

23.调整idea启动时的内存配置参数

25.每次打开一个新jsp或java文件时,cpu都占用很高,去掉检验即可

每次打开一个新jsp或java文件时,cpu都占用很高,去掉检验即可:

27. IDEA开启类修改后自动编译

我们可以使用【Presentation Mode】,将IDEA弄到最大,可以让你只关注一个类里面的代码,进行毫无干扰的coding。

这个模式的好处就是,可以让你更加专注,因为你只能看到特定某个类的代码。可能读者会问,进入这个模式后,我想看其他类的代码怎么办?这个时候,就要考验你快捷键的熟练程度了。你可以使用CTRL+E弹出最近使用的文件。又或者使用CTRL+N和CTRL+SHIFT+N定位文件。

但是我强烈建议你不要这么做,因为你是可以在Enter Presentation Mode模式下在IDEA里面做任何事情的。当然前提是,你对IDEA足够熟练

如果你使用IDEA在编写JSON字符串的时候,然后要一个一个\去转义双引号的话,就实在太不应该了,又烦又容易出错。

选择后,切记,要直接按下enter回车键,才能弹出inject language列表。在列表中选择 json组件。

选择完后。鼠标焦点自动会定位在双引号里面,这个时候你再次使用alt+enter就可以看到

可以看到IDEA确实帮我们自动转义双引号了。如果要退出编辑JSON信息的视图,只需要使用ctrl+F4快捷键即可。

Inject language可以支持的语言和操作多到你难以想象,读者可以自行研究。

如果你依稀记得某个方法名字几个字母,想在IDEA里面找出来,可以怎么做呢?

解决方式:在桌面右键 - 图形选项 - 快捷键 - 禁止 就可以

我要回帖

更多关于 代码正确但是不运行 的文章

 

随机推荐