- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
大家好,我是木宛哥;在 10余年的工作经历让我深刻体会到软件开发不仅仅是写代码,更是一个系统化的交付过程。 为此我总结了20条编程感悟,涵盖了代码规范、设计原则、测试方法与交付流程等多个方面;通过遵循代码规范,让代码更加可读与可维护,同时合理的设计能够有效应对需求变化,模块化的单元测试又确保了产品的可靠性,顾全的交付流程最后提升了项目质量。 希望这些感悟更多程序员提供参考,帮助大家在编程的道路上不断进步.
● 原则:代码应该易于阅读和理解;例如:变量、函数和类的名称应能清楚表达其意图; 。
● 示例
// 明确表示学生数量
int numberOfStudents = 30;
/**
* 计算圆面积
* @param radius 半径
* @return 面积
*/
public double calculateAreaOfCircle(double radius) {
return Math.PI * radius * radius;
}
● 原则:在复杂或重要的代码段添加注释,帮助他人理解; 。
● 示例:
/**
* 计算给定列表的平均值
*
* @param numbers 要计算的数字列表
* @return 返回数字的平均值,如果列表为空则返回0
*/
public static double calculateAverage(List<Double> numbers) {
if (numbers == null || numbers.isEmpty()) {
return 0;
}
double sum = 0.0; // 用于保存数字的总和
int count = 0; // 用于记录有效数字的数量
// 遍历列表中的每个数字并计算总和
//【注意】:检查列表中的每个元素是否为 null,需要过滤
for (Double num : numbers) {
if (num != null) {
sum += num;
count++;
}
}
if (count == 0) {
return 0;
}
double average = sum / count;
return average;
}
● 原则:遵循团队的编码标准,保持代码风格一致; 。
● 示例:使用统一的缩进和大括号位置。例如 IDEA 等 IDE 中配置统一的 CodeStyle:Alibaba-CodeStyle 、Google-CodeStyle 等; 。
● 原则:将功能分解成小模块,增加重用性; 。
● 示例:
public class Calculator {
/**
* 加
* @param a
* @param b
* @return
*/
public int add(int a, int b) {
return a + b;
}
/**
* 减
* @param a
* @param b
* @return
*/
public int subtract(int a, int b) {
return a - b;
}
}
● 原则:遵循DRY原则(Don’t Repeat Yourself); 。
● 示例:
//不好的实践:重复
public class Calculator {
public void addAndPrint(int a, int b) {
int result = a + b;
System.out.println("Result: " + result);
}
public void addAndPrintAnother(int x, int y) {
int result = x + y;
System.out.println("Result: " + result);
}
}
//好的实践:我们可以提取出一个公共方法来遵循DRY原则:
public class Calculator {
public void addAndPrint(int a, int b) {
printResult(add(a, b));
}
public int add(int a, int b) {
return a + b;
}
private void printResult(int result) {
System.out.println("Result: " + result);
}
}
● 原则:依赖接口而不是具体的实现,增强灵活性; 。
● 示例:
public interface Shape {
double area();
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public class Square implements Shape {
private double sideLength;
public Square(double sideLength) {
this.sideLength = sideLength;
}
@Override
public double area() {
return sideLength * sideLength;
}
}
//依赖接口而不是具体的实现
void printf(Shape shape);
● 原则:使用常量代替魔法数字; 。
● 示例:
final double FIXED_RATE = 3
double area = FIXED_NO * radius
● 原则:避免复杂的条件逻辑。用快速 return 来减少 if 嵌套层次; 。
● 示例:
//不推荐:嵌套太深
public void checkUser(User user) {
if (user != null) {
if (user.getAge() > 18) {
if (user.isActive()) {
// 允许访问
System.out.println("Access granted");
} else {
System.out.println("User is not active");
}
} else {
System.out.println("User is underage");
}
} else {
System.out.println("User is null");
}
}
//推荐:快速失败返回
public void checkUser(User user) {
if (user == null) {
System.out.println("User is null");
return;
}
if (user.getAge() <= 18) {
System.out.println("User is underage");
return;
}
if (!user.isActive()) {
System.out.println("User is not active");
return;
}
// 允许访问
System.out.println("Access granted");
}
● 原则:通过适当的异常处理提高程序的健壮性; 。
● 示例:
//异常
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
log.error("非法参数,不能被零除");
}
//熔断
try (Entry entry = SphU.entry("resourceName")) {
// 你的业务逻辑
} catch (BlockException ex) {
// 处理被阻止的请求
}
● 原则:统一错误处理的方式和日志记录。方便日志采集和告警配置; 。
● 示例:
public void logError(String message) {
log.error("ERROR|Trace:{0}|Msg:{1} " Context.getTrace(), message);
}
● 原则:方法参数应尽量少,避免混乱,超过3个推荐封装成模型; 。
● 示例:
//不推荐
void createUser(String name,int age,String email);
//推荐
public class UserService {
public void createUser(User user) {
}
}
class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Getters and Setters
}
● 原则:优先使用现有工具类 如apache.commons来简化操作 。
● 示例:
StringUtils.isNotEmpty("");
CollectionUtils.isNotEmpty()
● 原则:使用final关键字声明不可变的变量,提高代码的可靠性; 。
● 示例:
final int MAX_VALUE = 100;
ImmutableList.of();
● 原则:先写测试,再写代码,确保代码的可测试性; 。
● 示例:
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3));
}
● 原则:优先考虑代码的可读性,优化通常是在识别出性能问题后进行的; 。
● 原则:使用版本控制工具(git)管理代码变化; 。
● 原则:
○ 开发前,考虑清楚为什么要做这个需求。从背景及现状分析->为什么要做(why)->要做什么(what)->如何去做(how) 体系化思考; 。
○ 再从业务用例分析->系统依赖分析->领域模型分析->架构设计分析->时序图分析等落地最终的系分; 。
● 原则:定期进行代码评审,提高代码质量,提高团队研发意识; 。
● 原则:
○ 事前锁定资源,上下游达成一致,明确里程碑计划; 。
○ 事中按需推进,每周项目进度同步,及时通晒风险; 。
○ 事后组织复盘以及关注业务数据(关注价值) 。
● 原则:新功能需多考虑灰度验证 。
○ 后端服务:可按分组进行灰度验证(gray 分组->default 分组) 。
○ 客户端:小范围升级验证无问题后,逐步放量升级; 。
欢迎关注我的公众号:编程启示录,第一时间获取最新消息; 。
微信 | 公众号 |
---|---|
最后此篇关于代码背后的智慧:20条编程感悟的文章就讲到这里了,如果你想了解更多关于代码背后的智慧:20条编程感悟的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
又到年底了,总结下2022吧,今年还是蛮多收获和感悟的,感觉越发活的通透了些,有些事情我们无法把握,有些事情我们能把握。淡然面对无法把握的,积极把握能把握的。 工作 工作上面今年除了日常
我是一名优秀的程序员,十分优秀!