首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法命名约定"setX“与"withX”

方法命名约定"setX“与"withX”
EN

Software Engineering用户
提问于 2022-10-30 23:57:23
回答 3查看 228关注 0票数 2

为什么要学习Fluent接口,我遇到了这个职位,它指出,使用set提示,一个是突变对象,而with是重新生成一个新对象。

在使用PySpark ()时,我亲眼目睹了这种模式:

代码语言:javascript
复制
# 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的情况下完美地使用),但是它有助于提高可读性。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 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年年初通过

票数 1
EN

Software Engineering用户

发布于 2022-10-31 00:42:10

它说明使用set提示是在变异对象,而with则是重新测试新对象。

我可不这么想。更让我恼火的是,这显然是一个主观的命名主题,没有技术上的影响,而引用的来源是将他们的观点作为一个绝对的事实。

在我看来,命名与使用构建器模式和方法链接密切相关,或者仅仅是一个日常的值设置器。

构建器倾向于将方法链接在脑海中(尽管并不总是如此),在这些情况下,With更能流畅地阅读使用者代码。例如:

代码语言:javascript
复制
var person = new PersonBuilder()
                    .WithFirstName("Rick")
                    .WithLastName("Sanchez")
                    .Build();

无论构建器是不可变的,每个方法是否返回不同的实例,或者它是否对原始构建器进行了变异,我都希望语法是不可变的。这是与这些链式方法的名称完全不同的讨论。

你能用Set而不是With吗?好的。这在技术上没什么区别。

但是,如果您查看的是每天的值设置器,则With比set更不常见。比较一下:

代码语言:javascript
复制
person.SetName(newName);

对此:

代码语言:javascript
复制
person.WithName(newName);

因此,如果您使用的是常规设置程序,并且正在对实例进行变异,则Set更有意义。就With更有意义的情况而言,它实际上只是一个次要的重命名,以使消费者代码更流畅地阅读。在这些情况下,没有对错,只是个人偏好的问题。

票数 1
EN

Software Engineering用户

发布于 2022-10-31 21:23:23

通用(面向对象)术语是访问器和修饰符。显然,“变形人”也被大量使用,而不是修饰语。

可能更常用和特定于方法和属性的是getter和setter。

这让我想到了'with‘并不是set的对立面。“‘With”只是一些语言中的关键字或语句,它为这些语言做了不同的事情。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/441994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档