为什么要学习Fluent接口,我遇到了这个职位,它指出,使用set提示,一个是突变对象,而with是重新生成一个新对象。
在使用PySpark ()时,我亲眼目睹了这种模式:
# Using "set" to modify exiting object
from pyspark.conf import SparkConf
from pyspark.context import SparkContext
conf = SparkConf()
conf.setMaster("local")
conf.setAppName("My app")
sc = SparkContext(conf=conf)
# Also possible using Fluent Interface
conf = (
SparkConf()
.setMaster("local")
.setAppName("My app")
)
sc = SparkContext(conf=conf)
# Using "with" to return new objects
from pyspark.sql import functions as F
dataframe = (
spark.createDataFrame([], StructType([]))
.withColumn("a", F.rand())
.withColumn("b", F.rand())
.withColumn("c", F.col("a") + F.col("b"))
.withColumnRenamed("c", "result")
)我的问题是,这个set vs with是否有一个特定的名称?或者这只是一个特定于框架/语言的模式?
从上面的例子可以看出,它是一个独立于Fluent接口本身的概念( set方法可以在没有任何Fluent API的情况下完美地使用),但是它有助于提高可读性。
发布于 2022-10-31 11:39:51
使用前缀set来变异对象,使用with通过返回更改的副本来保持对象的不可变性,这是一种流行的命名约定,存在于多种语言之间,包括Java。它没有具体的名字。
然而,作为fluent界面显示的例子,该约定并不是通用的:with用于一种方便的方法链接阅读体验,而不一定是在不可变的上下文中。因此,最好的做法是保持自己的用法一致(并记录在案)。
不可变POJO改进getter/setter从2006年开始撰写的这篇文章解释了起源:set前缀是设置者的既定惯例。但是一些新的API是用不可变的对象来设计的,而with的选择是为了避免混淆,保证不可变。他的2011年年流行前缀复习很好地解释了这一点:
集合:可变设置者。这会使设置属性的目标对象发生变异,例如bean.getBar(bar)。与:不变的“策划人”。返回一个更改了一个或多个属性的原始属性的副本,例如结果= original.withBar(bar)。
Coleborne是JSR-310规范的专家,该规范定义了Java和time。2006年文章中表达的想法进入了2007年JSR提案中的正式标准,最终成为JDK-8的2014年年初通过。
发布于 2022-10-31 00:42:10
它说明使用set提示是在变异对象,而with则是重新测试新对象。
我可不这么想。更让我恼火的是,这显然是一个主观的命名主题,没有技术上的影响,而引用的来源是将他们的观点作为一个绝对的事实。
在我看来,命名与使用构建器模式和方法链接密切相关,或者仅仅是一个日常的值设置器。
构建器倾向于将方法链接在脑海中(尽管并不总是如此),在这些情况下,With更能流畅地阅读使用者代码。例如:
var person = new PersonBuilder()
.WithFirstName("Rick")
.WithLastName("Sanchez")
.Build();无论构建器是不可变的,每个方法是否返回不同的实例,或者它是否对原始构建器进行了变异,我都希望语法是不可变的。这是与这些链式方法的名称完全不同的讨论。
你能用Set而不是With吗?好的。这在技术上没什么区别。
但是,如果您查看的是每天的值设置器,则With比set更不常见。比较一下:
person.SetName(newName);对此:
person.WithName(newName);因此,如果您使用的是常规设置程序,并且正在对实例进行变异,则Set更有意义。就With更有意义的情况而言,它实际上只是一个次要的重命名,以使消费者代码更流畅地阅读。在这些情况下,没有对错,只是个人偏好的问题。
发布于 2022-10-31 21:23:23
通用(面向对象)术语是访问器和修饰符。显然,“变形人”也被大量使用,而不是修饰语。
可能更常用和特定于方法和属性的是getter和setter。
这让我想到了'with‘并不是set的对立面。“‘With”只是一些语言中的关键字或语句,它为这些语言做了不同的事情。
https://softwareengineering.stackexchange.com/questions/441994
复制相似问题