编码规范之注释、条件语句中限制代码行数和避免硬编码

news2024/11/13 10:15:40

对于软件开发管理来说,制订编码规范是一个历久弥新的话题。每一个大有为开发头目,都强调编码规范。或者程序员也互相攻讦(jie,第二声,阳平),说你写的代码很乱,不规范,很难看懂,很难维护。总之别人写的都不行,自己写的才是好的。

那么,怎么才算编码规范?按照我的经历,大家说编码规范,一般都是聚焦于命名规则,注释。命名现在可能普遍没啥问题了,驼峰命名,英文(而不是拼音缩写);注释,刚开始就一本正经地写上作者,创建时间,更新时间。其实时间一长,经手的人多了,就形同虚设,鸡肋得很。其实,在哪里注释、注释针对对象,注释内容比注释格式要重要得多。

下面我总结一下我自己认为的,编码规范需要注意的地方。

一、注释

1、要有个代码文件说明

项目级有个项目说明;如果项目内有多个子系统,每个子系统也要有个子系统说明。这不是写在代码里面,而是放在项目外面,严格来说不算注释,但这个说明真的很重要。如果是交接工作,后来者接手,或者隔了很长时间以后,自己看到,可以大致知道这份代码是做什么的。
在这里插入图片描述

2、代码文件注释

在文件头部,简要说明本文件的作用。
在这里插入图片描述
在这里插入图片描述

3、重要方法注释

对于一些重要的方法,说明一下
在这里插入图片描述

4、重要或难懂的处理逻辑的注释

在这里插入图片描述

5、小结

注释不是越多越好,太多容易分神。如果注释跟代码不同步,比如复制粘贴,或者代码改了,注释没改,甚至起反作用。只有重要、难懂的地方才需要写注释。

二、条件语句中的代码行数

每个条件判断,处理的代码行数非常多,需要不停地上下滚屏,甚至滚屏滚到手酸,才能看到 else 或结束符。然后想看看开头吧,好于是又一轮滚屏开始了。这样很难从总体上对这个条件判断进行理解。我今年接手的项目,很多这样的情况,简直是噩梦。一时找不到这些代码了,下面这个例子是AI给的,不算最夸张,只是嵌套多一点而已。

public void processUser(User user) {
    if (user != null) {
        if (user.getRole() != null && user.getRole().equals("ADMIN")) {
            if (user.getAge() > 18) {
                if (user.getStatus() != null && user.getStatus().equals("ACTIVE")) {
                    // 处理活跃管理员逻辑,包含大量冗长业务逻辑
                    log("Processing admin user...");
                    
                    performAdminTask1(user);
                    performAdminTask2(user);
                    performAdminTask3(user);

                    // 大量的日志记录和数据处理逻辑
                    for (int i = 0; i < 100; i++) {
                        log("Processing batch task: " + i);
                        performBatchOperation(user, i);
                    }

                    // 更加夸张的文件处理操作
                    for (File file : getAdminFiles(user)) {
                        try {
                            readAndProcessFile(file);
                            log("File processed: " + file.getName());
                            updateFileStatus(file);
                            archiveProcessedFile(file);
                            validateFileIntegrity(file);
                            synchronizeFileWithDatabase(file);
                        } catch (Exception e) {
                            log("Error processing file: " + file.getName() + " - " + e.getMessage());
                        }
                    }

                    // 各种同步任务
                    for (int i = 0; i < 50; i++) {
                        syncTaskWithServer(user, i);
                        log("Sync task with server " + i + " completed.");
                    }

                    // 模拟数据同步和备份逻辑
                    backupAdminData(user);
                    syncAdminDataAcrossServers(user);
                    log("Admin data backup and sync completed.");
                    
                    // 大量的系统调用和日志记录
                    for (int i = 0; i < 200; i++) {
                        systemCallOperation(user, i);
                        log("System call " + i + " executed.");
                    }

                    // 结束逻辑
                    updateLoginRecord(user);
                    log("Finished processing admin user: " + user.getUsername());

                } else {
                    // 处理非活跃管理员
                    log("Admin user is not active. Running inactive admin process...");
                    performInactiveAdminTask1(user);
                    performInactiveAdminTask2(user);
                    sendNotification(user, "Your admin account is not active.");

                    // 更加夸张的日志和数据库清理操作
                    for (int i = 0; i < 1000; i++) {
                        log("Cleaning up inactive admin record " + i);
                        performDatabaseCleanup(user, i);
                    }

                    // 文件操作和数据恢复
                    for (File file : getInactiveAdminFiles(user)) {
                        restoreFileFromBackup(file);
                        validateFileAfterRestore(file);
                        log("Restored and validated file: " + file.getName());
                    }

                    log("Inactive admin cleanup and restoration complete for user: " + user.getUsername());
                }
            } else {
                // 处理未成年人管理员
                log("Admin user is underage. Starting verification process...");
                sendVerificationEmail(user);
                log("Verification email sent.");

                // 冗长的家庭联系操作
                for (int i = 0; i < 10; i++) {
                    updateParentContact(user, i);
                    log("Updated parental contact for underage admin: " + i);
                    generateParentalConsentDocument(user, i);
                    sendParentalConsentRequest(user);
                    log("Parental consent request sent for attempt: " + i);
                }

                // 模拟更多的业务逻辑
                for (int i = 0; i < 50; i++) {
                    performUnderageAdminTask(user, i);
                    log("Underage admin task " + i + " completed.");
                }

                // 最后的日志记录
                log("Underage admin process complete for user: " + user.getUsername());
            }
        } else if (user.getRole() != null && user.getRole().equals("USER")) {
            if (user.getAccountStatus() != null && user.getAccountStatus().equals("ACTIVE")) {
                // 处理普通用户,添加更多的冗长处理逻辑
                log("Processing active user...");
                sendDiscountOffer(user);
                sendPromotionalEmails(user);

                // 模拟复杂的业务操作
                for (int i = 0; i < 500; i++) {
                    performUserActivityLogging(user, i);
                    performUserPreferencesUpdate(user, i);
                    generateUserReport(user, i);
                    log("Processed user activity for batch: " + i);
                }

                // 文件操作
                for (File file : getUserActivityFiles(user)) {
                    processUserActivityFile(file);
                    log("Processed activity file: " + file.getName());
                    archiveUserFile(file);
                    synchronizeUserFileWithCloud(file);
                    validateUserFile(file);
                }

                log("Finished processing active user: " + user.getUsername());

            } else {
                // 处理非活动用户
                log("Inactive user detected. Processing account cleanup...");
                
                for (int i = 0; i < 300; i++) {
                    performAccountDeactivation(user, i);
                    log("Deactivated user account batch: " + i);
                }

                // 数据删除操作
                for (int i = 0; i < 100; i++) {
                    deleteUserData(user, i);
                    log("User data batch " + i + " deleted.");
                }

                log("Inactive user cleanup complete for user: " + user.getUsername());
            }
        } else {
            // 未知角色用户的处理
            log("Unrecognized user role. Handling unknown user...");
            
            for (int i = 0; i < 50; i++) {
                performUnknownRoleTask(user, i);
                log("Processed unknown role task " + i);
            }

            // 结束未知角色处理
            log("Finished processing user with unrecognized role: " + user.getUsername());
        }
    } else {
        // 用户为空的处理逻辑
        log("User object is null. Skipping processing...");
        
        for (int i = 0; i < 10; i++) {
            handleNullUserRecord(i);
            log("Handled null user record " + i);
        }

        // 日志记录
        log("Null user handling completed.");
    }
}

对应这种情况,可以使用函数,将每个条件判断的处理逻辑,放到函数里。一般我们写一个函数,最大的作用是复用;但为了可读性,就算不需要复用,也可以写成函数。比如我将之前的一些代码改写成这样:
在这里插入图片描述
这样利于从整体上观察处理逻辑。

三、避免硬编码

硬编码就是将一些写死到代码里,后期很难修改。常见的如:

1、将地址写到代码里在这里插入图片描述

解决之道是将地址写到配置文件里

2、使用数字作为条件判断的依据

比如 if(type === 1) 之类,大家一定不会陌生,可读性很差,尤其是对接手的人,或者时间久远的项目。解决办法众所周知,后台可以用枚举,前端也可以定义常量来代替。如

// 定义常量
const MAX_LOGIN_ATTEMPTS = 5;
const USER_ROLE_ADMIN = 1;
const USER_ROLE_EDITOR = 2;
const USER_ROLE_VIEWER = 3;
const PASSWORD_MIN_LENGTH = 8;

// 函数用于检查用户登录尝试
function checkLoginAttempts(attempts) {
    if (attempts > MAX_LOGIN_ATTEMPTS) {
        console.log("Too many login attempts. Please try again later.");
    } else {
        console.log("Login attempt successful.");
    }
}

// 函数用于用户权限检查
function checkUserRole(role) {
    switch (role) {
        case USER_ROLE_ADMIN:
            console.log("User has admin privileges.");
            break;
        case USER_ROLE_EDITOR:
            console.log("User has editor privileges.");
            break;
        case USER_ROLE_VIEWER:
            console.log("User has viewer privileges.");
            break;
        default:
            console.log("Unknown user role.");
            break;
    }
}

// 函数用于验证密码长度
function validatePassword(password) {
    if (password.length < PASSWORD_MIN_LENGTH) {
        console.log(`Password must be at least ${PASSWORD_MIN_LENGTH} characters long.`);
    } else {
        console.log("Password is valid.");
    }
}

// 示例调用
checkLoginAttempts(6);
checkUserRole(2);
validatePassword("short");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马JavaWeb开发笔记16——请求(postman、简单参数、实体参数、@RequestParam映射)

文章目录 前言一、postman工具1. 引入2. 介绍3. 安装4. 使用 二、简单参数1. 原始方式&#xff08;仅了解&#xff0c;以后的开发不会使用&#xff09;2. SpringBoot方式3. 参数名不一致(RequestParam映射) 三、实体参数1. 简单实体对象2. 复杂实体对象 总结 前言 本篇文章是2…

[CocosCreator]全栈接入微信支付宝SDK(V3)

原文再续,书接上一回!上一期我介绍了接入支付宝的SDK,本文就来讲讲微信的SDK接入.还是那句话,官方的文档,我只能用一句话形容:一言难尽!本屌还是一如既往,把"恶心的东西"嚼碎了喂给各位宝吃. 一.前言 首先还是要集齐可以召唤神龙的法器,给大家一一列举一下: 1.…

python学习第十节:爬虫基于requests库的方法

python学习第十节&#xff1a;爬虫基于requests库的方法 requests模块的作用&#xff1a; 发送http请求&#xff0c;获取响应数据&#xff0c;requests 库是一个原生的 HTTP 库&#xff0c;比 urllib 库更为容易使用。requests 库发送原生的 HTTP 1.1 请求&#xff0c;无需手动…

Notepad++插件:TextFX 去除重复行

目录 一、下载插件 TextFX Characters 二、去重实操 2.1 选中需要去重的文本 2.2 操作插件 2.3 结果展示 2.3.1 点击 Sort lines case sensitive (at column) 2.3.2 点击 Sort lines case insensitive (at column) 一、下载插件 TextFX Characters 点【插件】-【插件管理…

unity编辑器c#脚本

目录 1.编辑器窗口再介绍 1.1添加对象 1.2文件夹的管理 1.3参数的设置 1.4对象的移动方式 2.对于外形和材质的修改 2.1对于外形的修改 2.2对于材质的修改 3.添加有趣的组件 3.1如何添加组件 3.2添加刚体组件 3.3碰撞器的介绍 3.4添加c#组件 3.5c#脚本代码的说明 1…

通过知识蒸馏提升大模型训练效率

人工智能咨询培训老师叶梓 转载标明出处 随着模型规模的不断扩大&#xff0c;如GPT-4这样的模型拥有约1.7万亿参数&#xff0c;其预训练所需的巨大能源和计算资源引发了对可持续发展AI解决方案的迫切需求。麦吉尔大学的研究团队介绍了一种创新的方法来解决与LLMs预训练相关的效…

MySQL5.7基于mysqldump、xtrbackup、innobackupex工具进行全量备份/恢复、增量备份/恢复

mysql全量备份脚本 文章目录 前言一、数据库备份分类二、为什么需要备份&#xff1f;三、备份工具示例1.逻辑备份工具1.1.使用场景1.2.备份操作示例1.3.恢复操作示例 2.物理备份工具2.1.xtrbackup介绍2.2.使用场景2.3.安装percona-xtrabackup2.4.xtrbackup备份原理2.5.percona-…

西门子PLC读取时间相差8小时

当前时间与PLC读取到的时间相差8小时&#xff0c;如下图所示 原因&#xff1a;指令问题 模块时间总是存储在 CPU 时钟中&#xff0c;而不带因子“本地时区”或“夏令时”。之后&#xff0c;CPU 时钟将基于模块时间计算 CPU 时钟的本地时间。 解决办法&#xff1a;将读取时间指…

leetcode hot100_part01_哈希

1.两数之和 遍历数组&#xff0c;map中存在target - nums[i]就返回结果&#xff0c;不存在就把当前元素存入map; 49.字母异位词分组 分组&#xff0c;怎么分&#xff0c;用hashMap, key为每一组的标识&#xff0c;value为每一组包含的字符串&#xff08;属于同一组的&#xff…

【笔记】第一节. 引言

• 轨道用钢的加工过程 • 钢轨结构及其标准 • 轨道结构特点 • 钢轨的商业化及其发展趋势 轨道用钢的加工过程 钢轨形式及其标准 钢轨的基本结构 轨头、轨腰、轨底。 钢轨的技术标准 • 铁道行业标准《TB/T2344-2003&#xff1a;43&#xff5e;75 kg/m 热轧钢轨订货技术…

腾讯云Ubuntu系统安装宝塔,配置Java环境,运行spring boot项目

致谢 本次学习宝塔部署spring boot项目&#xff0c;参考如下资料 https://www.cnblogs.com/daen/p/15997872.html 系统安装宝塔 直接用的腾讯云云服务器面板上的登录&#xff0c;你可以换成 xshell 进入宝塔官网&#xff1a; https://www.bt.cn/new/download.html 我们采…

【Android】Handler用法及原理解析

文章目录 用处基本用法用法一&#xff1a;使用sendMessage和handleMessage方法用法二&#xff1a;使用post方法 法一工作原理Handler的sendMessageMessage成员变量 MessageQueueLooper主线程自动初始化子线程手动创建**prepare**loop Handler的dispatchMessage 法二工作原理Han…

机器学习中最常见的50个问题(进阶篇)

机器学习中最常见的50个问题 进阶篇 1.解释SVM的工作原理。 SVM&#xff0c;全称支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种有监督学习算法&#xff0c;主要用于解决数据挖掘或模式识别领域中的数据分类问题。 SVM的工作原理是建立一个最…

TypeScript 扩展

扩展 ?:可选参数 可选链事实上并不是TypeScript独有的特性&#xff0c;它是ES11&#xff08;ES2020&#xff09;中增加的特性 可选链使用可选链操作符 ? 作用是当对象的属性不存在时&#xff0c;会短路&#xff0c;直接返回undefined&#xff0c;如果存在&#xff0c;那么…

小程序开发设计-小程序简介①

1.小程序与普通网页开发的区别&#xff1a; 1.运行环境不同&#xff1a; 网页运行在浏览器环境中。 小程序运行在微信环境中。 2.API不同&#xff1a; 由于运行环境不同&#xff0c;所以小程序中&#xff0c;无法调用DOM和BOM的API。但是&#xff0c;小程序中可以调用微信环境提…

摊牌了!一文教会你轻松上手豆包MarsCode 编程助手!

豆包MarsCode 编程助手是豆包旗下的 AI 编程助手&#xff0c;提供以智能代码补全为代表的 AI 功能。豆包MarsCode 编程助手支持主流的编程语言和 IDE&#xff0c;在开发过程中提供单行代码或整个函数的编写建议。此外&#xff0c;它还支持代码解释、单测生成和问题修复等功能&a…

收藏!6个PPT素材模板网站,快速做出好看的PPT

找PPT模板一定要收藏好这6个网站&#xff0c;能让你快速做出好看的PPT&#xff0c;重点十可以免费下载&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都…

时序必读论文05|PatchTST : 时序数据Patch已成趋势【ICLR 2023】

书接上回&#xff0c;我们在之前的文章已经分析了直接把transformer应用到时间序列预测问题的不足&#xff0c;其中我们总结了4个不足&#xff1a;分别是&#xff1a; 注意力机制的计算复杂度高&#xff0c;为 O(N^2)&#xff0c;并且计算得出的权重仅有少部分有用&#xff1b;…

【TCP三次握手+四次挥手(个人理解版本)】

TCP协议介绍 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff08;它是全双工工作模式&#xff09;。以下是对它的具体介绍&#xff1a; 基本概念 定义&#xff1a;TCP是Transmission Control Protocol的缩写&#xff…

PHP无缝对接预订无忧场馆预订系统小程序源码

无缝对接&#xff0c;预订无忧 —— 场馆预订系统&#xff0c;让每一次活动都完美启航&#xff01; 一、告别繁琐流程&#xff0c;预订从未如此简单 你是否曾经为了预订一个合适的场馆而焦头烂额&#xff1f;繁琐的咨询、确认、支付流程&#xff0c;让人心力交瘁。但现在&…