Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(五)改掉这些坏习惯,还怕写不出精简的代码?

(五)改掉这些坏习惯,还怕写不出精简的代码?

作者头像
一猿小讲
发布于 2020-06-23 15:50:11
发布于 2020-06-23 15:50:11
62600
代码可运行
举报
文章被收录于专栏:一猿小讲一猿小讲
运行总次数:0
代码可运行

鲁迅说:嬉笑怒骂里充满了无奈和妥协。 小猿说:先生说的不对,在程序员的世界里,编写代码处处充满了无奈和妥协。

Code Review 是一场苦涩但有意思的修行。

(一)改掉这些坏习惯,还怕写不出健壮的代码

(二)改掉这些坏习惯,还怕写不出优雅的代码?

(三)改掉这些坏习惯,还怕写不出优雅的代码?

(四)改掉这些坏习惯,还怕写不出健壮的代码?

代码修炼的系列分享,书接上篇,本次探讨一下:该如何利用注解写出精简的代码?

1

编码时:重复的校验,随处可见。

举个栗子?:

再举个栗子?:

如栗子示意,项目中参数校验随处可见,面对如此简单而又繁琐的工作量,你有何高见?

小猿招式一:七夕,带你生撸一个验证框架

小猿招式二:API参数如何验证?别纠结,拿去用就是

招式一不多说,徒手造轮子而已;重点说说招式二,引用 Hibernate Validator 类库替换参数校验,如下图示意,只需通过注解就轻松实现参数的基本验证。

建议:参数校验直接引用三方的类库实现,例如引用 Hibernate Validator,能让业务代码简化不少,代码 B 格略有提升。

敢问,你会用注解吗?注解还能怎么用?

莫急,容我慢慢讲来。

2

编码时:注解还可以这么用。

举个栗子?:

系统要根据上面常量类中的商户号来判断:是否需要进行校验账户信息、是否需要进行通知商户 ... ...

实现方式有很多种,看看项目中采用注解怎么实现的。

首先定义 PayAccInfoValidator 注解,用来标注是否需要校验账户信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface PayAccInfoValidator {
    
    boolean verify() default true;
}

然后在商户号属性上加入注解标识。

采用反射+注解,编写验证工具类,主要关注代码中的关注点一、关注点二。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class BusinessUtil {

    private static final MerIdConstant MERID_CONSTANT = new MerIdConstant();

    /**
     * 存放要验证支付账户信息的商户号
     */
    public static final Map<String, Boolean> VERIFY_MERID_MAP = new HashMap<String, Boolean>();

    static {
        Class<?> clazz = MERID_CONSTANT.getClass();
        for (Field field : clazz.getFields()) {
            // 关注点一
            PayAccInfoValidator validator = field.getAnnotation(PayAccInfoValidator.class);
            if (validator != null) {
                try {
                    // 关注点二
                    VERIFY_MERID_MAP.put(field.get(MERID_CONSTANT).toString(), validator.verify());
                } catch (IllegalAccessException e) {
                }
            }
        }
    }
}

代码不做详细解释,工具类用起来很简单,简易示例如下。

程序输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
20020:需要进行验证

另外,校验是否需要通知商户该怎么实现呢?其实套路是一样的,照葫芦画瓢而已,拿去先用起来体会体会。

3

寄语写最后

在程序员的世界里,编写代码处处充满了无奈和妥协。不过还是那句话:我等采石之人当心怀大教堂之愿景

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一猿小讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(六)改掉这些坏习惯,还怕写不出精简的代码?
上次讨论了一下如何借助注解来精简代码,代码修炼的系列分享,书接上篇,本次继续探讨一下:还有哪些奇淫技巧,能助力写出精简的代码?
一猿小讲
2020/06/23
7300
编码时易忽略的坏习惯-优化编码(仅用于个人学习,不喜勿喷--持续更新)
解惑:使用 Long.valueOf(long) 代替 new Long(long),可以提高性能。
botkenni
2022/12/07
5900
编码时易忽略的坏习惯-优化编码(仅用于个人学习,不喜勿喷--持续更新)
(四)改掉这些坏习惯,还怕写不出健壮的代码?
摘一段跑在生产环境上的代码,代码咋一看没啥问题,主要功能是获取请求参数;然后完成数据校验。
一猿小讲
2020/06/16
4510
(四)改掉这些坏习惯,还怕写不出健壮的代码?
(一)改掉这些坏习惯,还怕写不出健壮的代码?
近期对团队负责的项目,进行了一次 Code Review,代码评审过程中遇到的那些编码坏习惯,笑的合不拢嘴。不过,评审中很多代码编写问题,以往都多次提及过,所以气还是不打一处来。
一猿小讲
2020/06/02
6180
(一)改掉这些坏习惯,还怕写不出健壮的代码?
(三)改掉这些坏习惯,还怕写不出优雅的代码?
类似上面这种写法,if/else 就显得有点高射炮打蚊子,有的同学就会按照下面方式进行简化。
一猿小讲
2020/06/09
5700
(三)改掉这些坏习惯,还怕写不出优雅的代码?
这么写参数校验(validator)就不会被劝退了~
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,在代码中相当冗长,充满了if-else这种校验代码,今天我们就来学习spring的javax.validation 注解式参数校验。
良月柒
2019/10/28
1.1K0
这么写参数校验(validator)就不会被劝退了~
记一次离谱的内存马 GetShell
朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全“设为星标”,否则可能就看不到了啦
亿人安全
2024/06/17
3240
记一次离谱的内存马 GetShell
一个优秀的程序员应该养成哪些好的习惯?
多次担任技术面试官,遇到很多优秀的名校毕业生。凡此种种,从自己和别人身上总结出如下一些好的习惯。
范蠡
2023/01/04
1.4K2
一个优秀的程序员应该养成哪些好的习惯?
万字详文阐释程序员修炼之道
作者:cheaterlin,腾讯 PCG 后台开发工程师 综述 我写过一篇《Code Review 我都 CR 些什么》,讲解了 Code Review 对团队有什么价值,我认为 CR 最重要的原则有哪些。最近我在团队工作中还发现了: 原则不清晰。对于代码架构的原则,编码的追求,我的骨干员工对它的认识也不是很全面。当前还是在 review 过程中我对他们口口相传,总有遗漏。 从知道到会做需要时间。我需要反复跟他们补充 review 他们漏掉的点,他们才能完成吸收、内化,在后续的 review 过程中,能自己
博文视点Broadview
2023/05/19
2990
万字详文阐释程序员修炼之道
《编写高质量代码》学习笔记(2)
写着写着发现简书提醒我文章接近字数极限,建议我换一篇写了。 ---- 建议52:推荐使用String直接量赋值 一般对象都是通过new关键字生成的,但是String还有第二种生成方式,也就是我们经常使用的直接声明方式,这种方式是极力推荐的,但不建议使用new String("A")的方式赋值。为什么呢?我们看如下代码: public class Client58 { public static void main(String[] args) { String str1 = "詹姆
我没有三颗心脏
2018/04/26
1.8K0
《编写高质量代码》学习笔记(2)
深入理解 JVM 之——字节码指令与执行引擎
对于 C 语言从程序到运行需要经过编译的过程,只有经历了编译后,我们所编写的代码才能够翻译为机器可以直接运行的二进制代码,并且在不同的操作系统下,我们的代码都需要进行一次编译之后才能运行。
浪漫主义狗
2023/09/07
5690
深入理解 JVM 之——字节码指令与执行引擎
程序员“起名”头痛根治指南
作者:marinewu,腾讯 PCG 客户端开发工程师 There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton 软件开发中一个著名的反直觉就是“起名儿”,这个看上去很平凡的任务实际上很有难度。身边统计学显示,越是有经验的程序员,越为起名头痛,给小孩起名儿都没这么费劲。 命名的困难可能来自于以下几个方面: 信息压缩:命名的本质是把类/方法的信息提炼成一个或
腾讯技术工程官方号
2023/04/01
1.2K0
程序员“起名”头痛根治指南
美团外卖Android Crash治理之路
Crash率是衡量一个App好坏的重要指标之一。如果你忽略了它的存在,它就会得寸进尺,愈演愈烈,最后造成大量用户的流失,进而给公司带来无法估量的损失。本文讲述美团外卖Android客户端团队在将App的Crash率从千分之三做到万分之二过程中所做的大量实践工作,抛砖引玉,希望能够为其他团队提供一些经验和启发。
美团技术团队
2018/08/01
1.2K0
美团外卖Android Crash治理之路
Java开发手册——嵩山版(清幽现云山,虚静出内功)
《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一
红目香薰
2022/11/29
1.7K0
Java开发手册——嵩山版(清幽现云山,虚静出内功)
java面试常见知识点
JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
BUG弄潮儿
2020/06/12
5370
大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例
  每一台 host 上面可以并行 N 个 worker,每一个 worker 下面可以并行 M 个 executor,task 们会被分配到 executor 上面去执行。stage 指的是一组并行运行的 task,stage 内部是不能出现 shuffle 的,因为 shuffle 就像篱笆一样阻止了并行 task 的运行,遇到 shuffle 就意味着到了 stage 的边界。   CPU 的 core 数量,每个 executor 可以占用一个或多个 core,可以通过观察 CPU 的使用率变化来了解计算资源的使用情况,例如,很常见的一种浪费是一个 executor 占用了多个 core,但是总的 CPU 使用率却不高(因为一个 executor 并不总能充分利用多核的能力),这个时候可以考虑让一个 executor 占用更少的 core,同时 worker 下面增加更多的 executor,或者一台 host 上面增加更多的 worker 来增加并行执行的 executor 的数量,从而增加 CPU 利用率。但是增加 executor 的时候需要考虑好内存消耗,因为一台机器的内存分配给越多的 executor,每个 executor 的内存就越小,以致出现过多的数据 spill over 甚至 out of memory 的情况。   partition 和 parallelism,partition 指的就是数据分片的数量,每一次 task 只能处理一个 partition 的数据,这个值太小了会导致每片数据量太大,导致内存压力,或者诸多 executor 的计算能力无法利用充分;但是如果太大了则会导致分片太多,执行效率降低。在执行 action 类型操作的时候(比如各种 reduce 操作),partition 的数量会选择 parent RDD 中最大的那一个。而 parallelism 则指的是在 RDD 进行 reduce 类操作的时候,默认返回数据的 paritition 数量(而在进行 map 类操作的时候,partition 数量通常取自 parent RDD 中较大的一个,而且也不会涉及 shuffle,因此这个 parallelism 的参数没有影响)。所以说,这两个概念密切相关,都是涉及到数据分片的,作用方式其实是统一的。通过 spark.default.parallelism 可以设置默认的分片数量,而很多 RDD 的操作都可以指定一个 partition 参数来显式控制具体的分片数量。   看这样几个例子:   (1)实践中跑的 Spark job,有的特别慢,查看 CPU 利用率很低,可以尝试减少每个 executor 占用 CPU core 的数量,增加并行的 executor 数量,同时配合增加分片,整体上增加了 CPU 的利用率,加快数据处理速度。   (2)发现某 job 很容易发生内存溢出,我们就增大分片数量,从而减少了每片数据的规模,同时还减少并行的 executor 数量,这样相同的内存资源分配给数量更少的 executor,相当于增加了每个 task 的内存分配,这样运行速度可能慢了些,但是总比 OOM 强。   (3)数据量特别少,有大量的小文件生成,就减少文件分片,没必要创建那么多 task,这种情况,如果只是最原始的 input 比较小,一般都能被注意到;但是,如果是在运算过程中,比如应用某个 reduceBy 或者某个 filter 以后,数据大量减少,这种低效情况就很少被留意到。   最后再补充一点,随着参数和配置的变化,性能的瓶颈是变化的,在分析问题的时候不要忘记。例如在每台机器上部署的 executor 数量增加的时候,性能一开始是增加的,同时也观察到 CPU 的平均使用率在增加;但是随着单台机器上的 executor 越来越多,性能下降了,因为随着 executor 的数量增加,被分配到每个 executor 的内存数量减小,在内存里直接操作的越来越少,spill over 到磁盘上的数据越来越多,自然性能就变差了。   下面给这样一个直观的例子,当前总的 cpu 利用率并不高:
黑泽君
2019/05/14
3K0
大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例
构建安全可靠的系统:第六章到第十章
由 Julien Boeuf‎、Christoph Kern‎和 John Reese‎
ApacheCN_飞龙
2024/01/11
3160
构建安全可靠的系统:第六章到第十章
软件测试总结——常见的面试问题(一)
单元测试:单元测试是对软件组成单元进行测试。其目的是检验软件基本组成单位的正确性。测试的对象是软件设计的最小单位:模块。Findyou又称为模块测试,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。(测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试)
全栈程序员站长
2022/09/02
1.2K0
springcloudAlibaba&rancher【后端专题】
DevOps即Development和Operations的组合词,是一组过程、方法与系统的统称,用于促进开发应用程序或软件工程、技术运营和质量保障QA部门之间的沟通、协作与整合。
高大北
2022/12/20
2.4K0
springcloudAlibaba&rancher【后端专题】
FastAI 之书(面向程序员的 FastAI)(一)
在很短的时间内,深度学习已经成为一种广泛应用的技术,解决和自动化计算机视觉、机器人技术、医疗保健、物理学、生物学等领域的问题。深度学习的一大乐趣在于其相对简单性。强大的深度学习软件已经构建起来,使得快速入门变得快速简单。在几周内,你就可以理解基础知识并熟悉技术。
ApacheCN_飞龙
2024/02/17
6510
FastAI 之书(面向程序员的 FastAI)(一)
推荐阅读
相关推荐
(六)改掉这些坏习惯,还怕写不出精简的代码?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验