来吧

日常编码少不了的事情就是给代码命名,代码中命名的重要性在项目前期不会有太大感受,因为是边做边命名,代码天天见,自然会加深记忆。但到了后期上线后半年一年后,再回过头看的时候,我擦,这个变量是啥意思?这个方法不对呀,不是更新用户状态的吗? 接下来就是各种吐槽,谁写的代码,这么烂,翻一下提交日志,哦?我写的,赶紧悄悄的改过来。

经常性我们吐槽别人的代码烂,那么你是如何定义你认为的烂代码,它们烂在哪里 ?

代码究竟烂在哪里

这个问题说的具体点,可能经常我们在没理清业务逻辑的情况下去直接看别人的代码,相当于通过代码反推业务逻辑,别人的命名、编程思维跟自己的习惯不一致,需要时间去消化理解他的逻辑和习惯,然后加上代码排版乱七八糟,一堆 if else,还掺杂着各种奇怪的命名,魔鬼数字,OMG,简直不要太爽。以上综合起来,大概就是大家眼中认为的烂代码吧。

简要总结下:

  • 自身原因,业务并未完全理解清楚,直接上手看代码

这里是建议先搞懂业务逻辑和相关的实体或数据库表,最好是自己简要画出流程图或时序图辅助理解代码,展开说的话比较多,后面有机会单独写一篇吧

  • 代码风格不规范

体现在各种接口、方法、变量的命名不规范,代码格式排版混乱,过长方法,无注释或不详细等,注释这块最坑的不是没有注释,而是错误的注释。自己脑补下画面

  • 代码逻辑混乱

体现在代码逻辑不清楚、冗余代码、废弃方法、深层的嵌套等,怎么优化,也值得单独写几篇

可以看到命名在里面占有一席之地,那么如何做好代码中的命名,且往下看。

好的命名,看这里

先给出结论,一个好的命名最最最关键的一点,见名知意,见名知意,见名知意,重要的内容重复三遍,并加个底色。

不要怕长

我工作中碰到不少人有个命名习惯,我称为半命名方式,看个例子,定义一个业务需求的实体类,正常见名知意的命名是这样的BusinessRequirement,但是,他们觉得这样太长,他们会这样

BusRequi、(各省一半)

BusinessReq(后面省一半)

BusinessXq(一半英文、一半拼音,洋不洋气)

这样的命名完全不具有可读性,还容易产生歧义。所以,不要怕长,能让人和有道词典读懂是前提。

看个springboot中的命名

SpringApplicationJsonEnvironmentPostProcessor

长吗?但肯定能读懂对吧。

但是有一类是可以简化的,就是行业内大家公认的术语简称,比如你想整个ip工具类,那么你可以这样命名IpUtil,就没必要整成这样InternetProtocolUtil,因为Ip这个词在业内大家都懂,就可以简写。

准确

准确就是命名要符合当下的业务场景,比如我老早之前做的考试类项目中有个题目实体,同事采用的命名是Problem,显然放这里是不合适的,最后纠正为Question。要做到准确,还是比较考验英文功底的。

具体

具体就是能正确表达变量或类所指向的代码含义,例如我们定义了一个代表软件版本号的数组,可能会这样定义

int[] array = new int[] {1,2,3,4,5};

数组倒是能看懂,但是单看这一行代码并不能搞清楚干什么用,放在具体的代码逻辑里结合上下文代码,倒也能推导出来数组中定义的具体是什么,但是增加的阅读代码的难度,好一点的当然是下面这样

int[] versionNumberArray = new int[] {1,2,3,4,5};

说清楚具体含义,表示的是什么数组,而不是只抽象的表达个数组的概念。

额外补充一点

我见过一个项目从代码到数据库整体命名都是拼音简写形式,说实话拼音简写对业务不熟悉人来说很难识别,而且时间一长完全是懵逼的,完全得靠猜。

拿上面的业务需求来说拼音整出来Ywxq,拼音组合可以有很多种解读。项目得以持续维护的关键是他们有详细的字典说明文档,实际上就是上篇文章说的公司或团队有一套自己的标准就行

但是可想而知仍然很痛苦,除非是个别领域内的专业词汇,英文很难表达,可以尝试拼音解决,其他情况还是尽量用英文命名。

总结

好的命名就是做到见名知意,具体遵循以下几点:

1、不要怕长,专业术语行业内有简称,可用简称

2、用词准确
3、表达具体

4、尽量使用英文

5、上面没提到的一点,公司有规范,优先符合公司规范

未入行之前,很多人总是好奇,英文基础对编码到底有没有影响,到底有多大,这里就可以看到,是有影响的,起码命名的时候有障碍,需要借助有道词典或 code if 这样的工具。

而且越往后英语的重要性就愈加明显,比如你可以直接读一手英文资料、文献等。

最后

写完了老感觉烂代码这个词用的很不好,奈何词穷,先这么着吧。

Coding,命名是个技术活的更多相关文章

  1. CSS模块化思想-----命名是个技术活

    CSS模块化思想(一)--------命名是个技术活 引子: 女孩子都喜欢买衣服,而我也不例外,奈何钱包太瘦,买不起高大上的定制,只能买撞衫率极高的休闲衣,不过对于我来说,我还是开心的,毕竟买衣服买的 ...

  2. css模块化思想(一)--------命名是个技术活

    引子: 女孩子都喜欢买衣服,而我也不例外,奈何钱包太瘦,买不起高大上的定制,只能买撞衫率极高的休闲衣,不过对于我来说,我还是开心的,毕竟买衣服买的不仅是衣服,更是一种心情.在web前端的世界里,css ...

  3. 如何优化coding

    如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...

  4. Python新建动态命名txt文件

    # -*- coding: utf-8 -*- import os,sys,time fname=r"D:\01-学习资料\python" def GetNowTime():#获取 ...

  5. Drupal8重命名上传的中文名文件

    完整的模块代码文件在Coding.net上,想直接使用的请前往下载:https://coding.net/u/yamus/p/chinese_rename/git/tree/master 最近吧Dru ...

  6. .NET设计规范————命名规范

    NET设计规范:约定.惯用法与模式———命名规范 前言:          最近在看<.NET设计规范:约定.惯用法与模式>一书,主要还是讲.NET的设计规范,以前对这一块也不是特别在意, ...

  7. 使用VS2010在Coding.net上进行代码托管

    网上有VS2010和Github结合使用办法,但是Github在国内使用太慢,本文使用相同的配置方法稍作改动让VS2010代码托管在coding.net平台上.由于只是稍做记录让自己不会遗忘,所以叙述 ...

  8. python 中变量的命名方法

    从网上找到django中python的命名规范 Python  规范 代码的布局  编码 所有的Python脚本文件都应在文件头标上“# -*- coding:utf-8 -*-”.  缩进 4个空格 ...

  9. 编程风格(Coding Style)要求

    编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份 ...

随机推荐

  1. 微信小程序中的canvas基础应用

    学了东西还是要记录一下,刚入职的小萌新啊,运气好分到一个项目不是很急的组原以为时间多了可以多学一些东西,但是发现好像不知道从哪里开始下手,我太南了.... 看旁边的实习生同事一直在搞canvas,自己 ...

  2. python新式类继承------C3算法

    一.引入 mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类).之前查看了很多资料,说mro是基于深度优先搜索算法的.但不完全正确在Python ...

  3. ASP.NET Core如何使用压缩中间件提高Web应用程序性能

    前言 压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽. 何时使用相应压缩中间件 在IIS,Apache,Nginx中使用基于服务端的响应压缩技术.中间 ...

  4. Android H5混合开发(5):封装Cordova View, 让Fragment、弹框、Activity自由使用Cordova

    近期,有同事咨询如何在Fragment中使用Cordova,看了下Cordova源码,官方并没有提供包含Cordova Webview的Fragment,以供我们继承. 上网查询了一下,也有几篇文章讲 ...

  5. 解决靶机Bee-Box 键盘乱序问题

    Bee-Box介绍 Bee-box官方称呼BWAPP,buggy web Application 这是一个集成了各种常见漏洞和最新漏洞的开源Web应用程序,目的是帮助网络安全爱好者.开发人员和学生发现 ...

  6. Web for pentester_writeup之SQL injections篇

    Web for pentester_writeup之SQL injections篇 SQL injections(SQL注入) Example 1 测试参数,添加 and '1'='1, 'and ' ...

  7. Lost My Music:倍增实现可持久化单调栈维护凸包

    题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值. 那么就是(ci-cj)/(di-dj)的最大值了. 对于每一个点,它的(ci,di)都是二维坐标系里的一个点 要求的就是祖先 ...

  8. matlab中的eval函数使用

    matlab中的eval函数使用 在matlab的命令行窗口中输入help eval命令回车就可以看到eval函数的官方解释,大概的意思就是执行matlab中的表达式,计算expression表示的代 ...

  9. Jquery EasyUI 中ValidateBox验证框使用讲解

    来源素文宅博客:http://blog.yoodb.com/ Validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效.如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警 ...

  10. Groovy单元测试框架spock基础功能Demo

    spock是一款全能型的单元测试框架. 最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock.由于本身使用Groovy的原因,比较钟 ...