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

注解的艺术:精简代码与优雅验证
本文探讨了如何运用注解提高代码质量,包括减少重复校验、简化参数验证,以及通过自定义注解实现特定业务逻辑。文章通过实例展示了注解在实际项目中的应用,并提供了实用的代码技巧。

鲁迅说:嬉笑怒骂里充满了无奈和妥协。 

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

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

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

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

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

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

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

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

举个栗子:

再举个栗子:

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

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

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

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

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

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

莫急,容我慢慢讲来。

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

举个栗子

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

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

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

import java.lang.annotation.*;


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

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

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

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) {
                }
            }
        }
    }
}

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

程序输出:

20020:需要进行验证

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

3. 寄语写最后

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

好了,代码修炼的系列分享,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

 

### 如何在达梦数据库中设置模式为大小不敏感 要在达梦数据库中实现大小不敏感的配置,可以通过调整数据库初始化参数以及合理设计 SQL 查询方式完成。以下是具体的方法: #### 1. 初始化数据库时禁用大小敏感 当通过 Docker 安装并初始化达梦数据库实例时,可以利用环境变量 `CASE_SENSITIVE` 来控制数据库的大小敏感性。将该值设为 `0` 即可关闭大小敏感功能。 ```bash docker run \ -e CASE_SENSITIVE=0 \ # 关闭大小敏感 -e UNICODE_FLAG=1 \ # 启用 Unicode 支持 -e CHARSET=1 \ # 设置字符集 -e PAGE_SIZE=16 \ # 数据库页面大小 -e LD_LIBRARY_PATH=/opt/dmdbms/bin \ -e INSTANCE_NAME=dm8 \ # 实例名称 -d dameng/database:latest ``` 上述命令中的 `-e CASE_SENSITIVE=0` 是核心部分,用于指定数据库运行时不区分大小[^2]。 #### 2. 表对象默认转换为大 如果未显式开启大小敏感模式,则达梦数据库会自动将表名和字段名统一转换为大字母形式存储。这意味着,在执行查询操作时无需考虑原始定义中的大小差异,只需按照大的约定书即可正常访问数据[^3]。 例如: ```sql SELECT NAME, AGE FROM STUDENT; ``` 即使实际创建的是小表名 `student` 和字段名 `(name, age)` ,以上语句仍能成功执行,因为内部已标准化为全部大处理[^1]。 #### 3. 使用双引号强制保留原样命名 需要注意的是,一旦某张表或者某个字段被用带双引号的方式声明过之后,再对其进行引用就必须严格匹配原来的大小状态,并且继续包裹于双引号之中;否则将会引发错误提示找不到对应的目标实体[^4]。因此建议除非必要情况下才采用这种方式设定特殊的名字格式,否则一般推荐让系统自行管理好这些细节从而简化日常维护工作量。 综上所述,要使整个模式变为完全忽略字母case的区别对待的话,最简单有效途径就是在最初部署阶段就明确指定了非sensitive选项即`CASE_SENSITIVE=0`,这样后续所有的交互过程都不必额外顾虑这方面因素影响效率与准确性了。 ```python # Python连接示例代码片段展示如何基于已经配置好的无Case区别的DM Server来进行基本的数据检索活动。 import pymssql conn = pymssql.connect(server='localhost', user='sa', password='your_password', database='testdb') cursor = conn.cursor() try: cursor.execute("SELECT name, age FROM Student") # 不需关心 student 或者 Name/AGE 的确切拼法 row = cursor.fetchone() while row: print(f"Name={row[0]} Age={row[1]}") row = cursor.fetchone() finally: conn.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值