辛苦写完功能,总被嫌代码丑陋,试试链式调用构建对象,代码瞬间提升一个档次

go的with模式

这种方式称为链式调用。用来构建对象。

1.示例代码

package main

import "fmt"

type Field struct {
	Name        string
	Description string
}

func NewField() *Field {
	return &Field{}
}

func (f *Field) WithName(name string) *Field {
	f.Name = name
	return f
}

func (f *Field) WithDescription(desc string) *Field {
	f.Description = desc
	return f
}

func main() {
	f := NewField().
		WithName("tom").
		WithDescription("this is a desc")
	fmt.Println(*f)
}

看起来没必要使用WithName()、WithDescription()函数。

f := NewField()
f.Name = "tom"
f.Description = "this is a desc"

两段代码熟高熟低一看便知。

2.链式调用的优点

下面总结了一些使用链式调用的几个优点:

1.提高代码可读性:通过链式调用,可以清晰地看到对象的构建过程。

2.灵活性:使用构建器模式,你可以灵活地控制哪些字段是必须设置的,哪些是可选的。你可以通过方法的存在与否来隐式地表示这一点。

3.减少错误:由于链式调用通常涉及到多个方法的连续调用,并且每个方法都返回对象的引用,因此可以避免一些常见的错误,如忘记保存方法的返回值或错误地传递对象引用。

4.易于扩展:链式调用允许你在不修改现有代码的情况下添加新的字段设置方法。这意味着你可以在不破坏现有代码的情况下扩展对象的功能。相比之下,如果直接设置字段值,并且后来需要添加验证或转换逻辑,则可能需要修改多个地方的代码。

5.链式调用的限制:虽然链式调用有其优势,但它也有一些限制。例如,如果某个字段的设置依赖于另一个字段的值,那么链式调用的顺序就变得非常重要,这可能会增加代码的复杂性。此外,如果对象的状态在构建过程中需要根据某些条件动态变化,那么链式调用可能不是最佳选择。

6.集中校验逻辑:在链式调用的过程中,你可以在每个设置参数的方法中添加校验逻辑。这样做的好处是所有的校验逻辑都集中在与参数设置相关的方法中,使得校验的意图更加明显,也更容易维护。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

shulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值