一、背景1。1、时间紧任务重 在之前开发一套公司内部系统时一方面时间紧前期工作准备不充分,另一方面也在业务对接及编码工作的规范上做得不是很好导致了这套系统仅停留在能用的状态下。1。2、拓展不友好 其中最大的问题就是拓展性了。整个开发整体使用的是: SpringBootshiroMyBatiseasyPoiLayuiMysql5。7(后续升级为8。0)RedisRabbitMQ的模式。 前后端无分离。这些其实都是还好的,问题就在于代码中存在不少的硬编码,这就导致了对后续业务拓展支持的不友好! PS:能把锅推到敏捷开发上吗?不!还不是因为自己菜!!!1。3、该来的总归是要来的 最近业务有些许变更,于是这些硬编码部分就整体出问题了:不,我们不支持这样子的! 但是业务是不能停下来等人的,加之项目的重构排期比较靠后,所以暂时只能在原有系统上进行调整。二、关于硬编码2。1、什么是硬编码 这里提到的硬编码不是计算机的硬编码处理,而是软件编程时代码层面的硬编码(简单来说就是死板不支持变通的代码)。2。2、常见的硬编码示例 PS:仅为伪代码示例,意思一下就可以了! 条件处理上的硬编码if(单据检查完成。equals(orderState)){System。out。println(XXX单据检查完成了!);} Java 信息处理上的硬编码if(true){System。out。println(小明已经完成了任务A!);} Java 返回值上的硬编码if(小明。equals(name){return主管职位;} Java 属性值上的硬编码StringorderAddUrlhttp:baigedu。com:8080orderadd; Java 2。3、硬编码所带来的一系列困扰 PS:简单以上述四种情况为例。 容易产生条件不匹配的情况导致无法进入条件 比如:项目换人维护了或与前端对接时,他在调用的时候写的是单机检察完成 这个任务只能是小明完成的?小明在这里只能完成任务A?小华我要完成任务B! 小明:我这辈子就只能是个小主管?瞧谁不起呢! 百个度:我们项目调整了,现在这个接口改成了:Http:baigedu。com:8089orderAdd2。4、综上所述 硬编码的不好之处竟恐怖如斯! PS:同时我们也不能单一的认为硬编码是不好的。在写单元测试时不来个硬编码,在一些定值上(男、女、未知),快速开发时硬编码还是有作用的,只是说正式开发中可能会存在一些坏味道。。。三、应对性处理3。1、遍寻硬编码遗留 因为系统的每一个模块都有经手,所以问题存在之处的整理工作倒是并不复杂。3。2、硬编码模块重构 因为一些客观问题本次也只能消除90的硬编码部分,整个项目的完善就暂时寄托于后续的项目重构了。同时这90的硬编码改造已经能满足当下需求及后续比较友好的拓展性,本着不追求极端完美主义的想法加之整个改进的些许心得遂有此文。三、规避硬编码的一些常用方法3。1、拒绝定值,使用参数传递 以上情景二如果把name和task都作为入参来处理,那很轻易的实现诸如:小花完成了任务C这项功能。3。2、枚举类 枚举类是对拓展友好的,同时也能规范数据。上述场景一中把状态写成枚举类就能很轻松的解决状态错误及状态拓展问题! PS:千万不要把枚举类直接给到前端,因为不讲码德!3。3、配置文件 以SpingBoot为例,我们可以把一些使用比较多且不易该的属性配置的Xml或者Yml中,然后再代码中使用Value注解来使用! 这样场景四种的不管怎么变我们都可以直接在配置文件中修改,而且只修改一处! PS:Value注解不能使用static修饰3。4、数据库配置 在上述场景三种,我们可以把小明的信息配置到数据库中,然后再使用时读取数据库信息。这样小明以后升职加薪出任CEO迎娶白富美都没有问题。 (小明的肯定!)四、后记 其实整体来说这些都是不好的编码习惯或仅考虑到当下而没有对后续的拓展做容错而导致的。 希望我们都能写出一手漂亮的代码,做一个讲码德的好开发! PS:代码整洁之道的熟读都应该提上日程了哈!!!