丑陋的代码

本文探讨了如何撰写清晰、可维护的代码,强调了命名规范、代码复用、异常处理和接口设计的重要性。建议使用业务语言编写代码,遵循英语语法规则,并建立统一的业务术语词汇表。提倡编写小而简洁的类和函数,避免全局变量和静态函数,注重代码评审和异常考虑。同时,提出了模型设计原则,如区分变化数据和静态数据,以及封装行为。
摘要由CSDN通过智能技术生成

命名

  • 描述意图,而非细节
  • 用业务语言写代码
  • 类名:名词,表示一个对象
  • 方法名:动词或者动宾短语,表示一个动作
  • 和业务方共同确定一个词汇表,包含业务术语的中英文表达
  • 编写符合英语语法规则的代码

好代码

  • 不要复制粘贴。提取函数,在需要的地方调用这个函数。
  • 能够发现重复
  • 类似含义的代码应该有一致的名字
  • 不一致的名字表示不同的含义
  • 把类写小,越小越好
  • 把函数写短,越短越好
  • 按职责拆分不同的大类
  • 消除长参数列表,将参数列表封装成对象
  • controller层承载一些校验和对象转换的角色,而service层的参数是不需要关心这些的
  • controller层请求对象的字段主要是基本类型,而service的参数对象,需要全部转换为业务对象
  • 业务代码中任何与业务无关的东西都是潜在的坏味道
  • 可能为null的返回值返回optional,以此减少犯错的几率
  • 不断学习新的代码风格,不断改善自己的代码
  • 尽可能多暴露问题,尽可能多做代码评审,每天评审一次
  • 异常情况要考虑充分
  • 对新增接口保持谨慎,对外提供的接口越少越好
  • 从业务上判断需要新增还是复用
  • ”I“打头给接口命名,用”Impl“给实现类结尾是不好的编程习惯
  • 一个接口只有一个实现类,可以不需要这个层次关系,命名可以是DefaultXXX;一个接口有多个实现类,需要把不同实现类的特点描述出来,如FileXXX,DbXXX等等
  • 尽量规避全局函数和全局变量;尽量不用static函数;尽可能不用单例模式
  • 好的程序员要学会表达,不仅仅用代码表达,也要会用文字表达

模型

  • 出现技术名词(如kafka),往往缺失了一个应有的模型
  • 识别一个东西是业务的一部分,还是一个替换的实现,如果不是它,是否还有其它的选择?
  • 模型封装以行为为基础
  • 典型的动数据(变化)和静数据(无变化)是不同的关注点,应该分离开来
  • 变化频率相同,则封装成一个类
  • 少暴漏细节
  • 尽量使用final,限制变量的赋值
  • 对象一次性完成初始化,guava的集合工具类
  • setter只在初始化过程中用到,可以用更完整的构造函数替换掉它
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Kruskal算法求解最小丑陋值问题的Java代码示例: ``` import java.util.*; // 定义边 class Edge implements Comparable<Edge> { int src, dest, weight; public int compareTo(Edge edge) { return this.weight - edge.weight; } } class MinimumUglinessValue { // 获取顶点的父节点 int find(int parent[], int i) { if (parent[i] == -1) { return i; } return find(parent, parent[i]); } // 合并两个顶点的集合 void union(int parent[], int x, int y) { int xset = find(parent, x); int yset = find(parent, y); parent[xset] = yset; } // 使用Kruskal算法求解最小生成树 void kruskalMST(int ugliness[], int V, Edge[] edges) { // 对边按权值从小到大排序 Arrays.sort(edges); int parent[] = new int[V]; Arrays.fill(parent, -1); int e = 0, i = 0; while (e < V - 1 && i < edges.length) { Edge edge = edges[i++]; int x = find(parent, edge.src); int y = find(parent, edge.dest); // 如果该边的两个顶点不在同一个集合中,则选择该边,并将两个集合合并 if (x != y) { union(parent, x, y); e++; ugliness[e] = edge.weight; } } } public static void main(String[] args) { int V = 4; // 顶点数 int E = 5; // 边数 Edge[] edges = new Edge[E]; edges[0] = new Edge(0, 1, 10); edges[1] = new Edge(0, 2, 6); edges[2] = new Edge(0, 3, 5); edges[3] = new Edge(1, 3, 15); edges[4] = new Edge(2, 3, 4); int[] ugliness = new int[V]; MinimumUglinessValue mst = new MinimumUglinessValue(); mst.kruskalMST(ugliness, V, edges); // 输出最小丑陋值 int minUgliness = Integer.MAX_VALUE; for (int i = 0; i < V; i++) { if (ugliness[i] < minUgliness) { minUgliness = ugliness[i]; } } System.out.println("Minimum ugliness value: " + minUgliness); } } ``` 该示例代码中,我们使用了Kruskal算法来求解最小生成树,并在过程中记录了每个边的权值,最终输出最小的权值即为最小丑陋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值