你们用 get/set 吗?

2021-06-08 15:05:01 +08:00
 aqtata
getName()/setName(value)



name()/name(value)

你们习惯用哪种?
8654 次点击
所在节点    程序员
58 条回复
yejinmo
2021-06-08 20:00:15 +08:00
public class CSharpIsTheBestLanguageInTheWorld
{
public string demo2 { get; private set; } = string.Empty;
}
xiaomingVTEX
2021-06-08 21:17:09 +08:00
@3dwelcome #20 如果只是从 OOP 角度来说 get/set 是与对象的封装不符的,这样隐藏了对象的真实意图, 但是比如 java 中的 POJO 都有一个 get/set,引用下面的评论,POJO 作为了一种数据的载体,并不仅仅局限于对象的封装;
另外, 类只是对象的一种表现形式(比如 java );再者也不是非要强制把 get/set 修改掉,毕竟只是一种编程范式
wolfie
2021-06-08 21:45:48 +08:00
@Rwing
对对对 封装是原罪,就不应该有设计模式
yitingbai
2021-06-08 21:48:27 +08:00
我有时候也挺纠结这个问题的, 最后还是发现写 get/set 跟直观一些, 代码提示更方便
xingheng
2021-06-08 22:02:47 +08:00
@Fule #15 全篇我都同意,但是最后四个字符 YYDS 是什么臭狗屎
tommyzhang
2021-06-08 22:11:50 +08:00
你写你的我写我的 我都不管你你管我呢?
xingheng
2021-06-08 22:17:56 +08:00
@xiaomingVTEX #18 已经很少人能把 OO 讲清楚了。


@3dwelcome #20 这和 MVVM 不冲突。
xiaomingVTEX
2021-06-08 22:53:25 +08:00
@xingheng #27 确实, 反正万物皆对象就行了, 哈哈
walleL
2021-06-08 23:51:30 +08:00
@xiaomingVTEX #18 相问下这段出处是哪里?
wanguorui123
2021-06-09 02:52:32 +08:00
C# {get; set;,}
JAVA @Data
Rocketer
2021-06-09 06:45:41 +08:00
其实 C#的 Property 默认写法与直接用 public 的变量没什么区别。以下两行几乎是一样的。
public int SomeProperty {get; set;} = 10;
public int someField = 10;

区别在于,当你需要对值做一些处理时,比如:
private int _someField = 10;
public int SomeProperty
{
get
{
return _someField;
}
set
{
if (value >= 10)
{
_someField = value;
}
}
}
对外部来说,用法是统一的,还是 object.SomeProperty = 15;

而 Java 正好相反,为了让外部的用法统一,把原本可以直接 public 的变量也封装进了 getter/setter 方法中。
xiaomingVTEX
2021-06-09 06:46:17 +08:00
@walleL #29 极客时间 > 软件设计之美 > 14 | 面向对象之封装:怎样的封装才算是高内聚? > http://gk.link/a/10r9Q
CodeCodeStudy
2021-06-09 09:12:44 +08:00
因为 Java 的字段是不支持多态的,所以必须要用 getter/setter,不然容易出问题
jorneyr
2021-06-09 09:12:46 +08:00
Lombok 自动生成,需要的再手写覆盖,省事简洁还和手写代码效果一样。
turingli
2021-06-09 09:19:23 +08:00
@Fule C#10 public double Age{get;set=> field=Math.Round(value,2);} 进一步干掉字段
ikas
2021-06-09 09:20:59 +08:00
int _x,
getX(){return _x}
getY(){return 2_x+c.....}

如果你只是简单的,无所谓,但是 get ,set 又不是只是 1:1 对应到字段,
很多时候,set 方法还会做校验.
上面说了一堆 c#,如果写 xaml ui,那 wm 里还要抛事件.set 也是必须的
masterclock
2021-06-09 09:54:00 +08:00
scala "默认" 不可变,没有 set
def 无参函数看起来就像是 val,不需要 get
kahlkn
2021-06-09 10:05:12 +08:00
@xiaomingVTEX 对于这位兄弟摘录的面向对象封装这块我觉得没有任何问题。

但是如果到了具体的业务场景的时候,我觉得可以 分为 偏业务实体 和 偏数据实体。这位兄弟中的 setPassword 我觉得属于数据实体的范畴。而 changePassword 属于业务实体的范畴。并且这类业务实体,偏向充血模型(即将具体的业务行为放入到实体中)。本人作为 java 开发,java 中的实体偏向贫血模型(即实体更偏向于作为数据的载体,具体的业务行为不放入实体中)。

至于 getter/setter 问题,反正 java 开发者必须写,除非你不打算用主流的框架。至于好处嘛,除了之前一位兄弟说的断点时可以监控外。 另外的作用就是 可以 在方法内 增加一些业务逻辑(尽管 java 中不建议这么做,但是对于一些紧急的需求修改上,可以临时的快速的搞搞,比如某个数据变形、裁切之类的,由于调用点很多一个一个改不方便,直接改 setter 中的内容,或者 getter 中的内容即可,前提评估好影响)。当然在 spring 等很多框架中,一些内部类或者包级别的类,可能有不少就直接 user.name 这样使用的。
passerbytiny
2021-06-09 10:14:00 +08:00
用过一段时间的 name()/name(value),当然是用 lombok 自动生成的,到是挺喜欢这种用法,但是被 Jackson 等涉及到 Javabean 的工具打得头破血流,又改回去了。目前来说,大多数 Java 工具都遵循 Javabean 的 Getter/Setter 规范,虽然它们通过用手动配置的方式也能支持 name()/name(value)这种,但是基于约定优先与配置的敏捷开发思想,Java 这边还是老老实实的用 Getter/Setter (这种情况在慢慢改变,将来很有可能,在某个工具声明准备抛弃 Javabean 规范的很短时间内,Getter/Setter 就被主流工具迅速抛弃了)。


@3dwelcome 你这个是声明式切面编程,只是可选约定,不是必须遵守的约定。这种声明式编程,有两个显著缺点:一、一刀切;二、依赖外部配置。故 Java 界自从注解出来后,就不再推荐甚至抛弃了。
passerbytiny
2021-06-09 10:33:46 +08:00
Javabean 的原始定义可以在这里下载: https://www.oracle.com/java/technologies/javase/javabeans-spec.html 。这是 1997 年的定义,而且还是 Sun 的不是 JCP 的。

需要纠正楼上的一些错误认识,Getter/Setter,或者说 JavaBean,是组件类,不是数据类。贫血领域模型这种名义上是业务类实际上是数据类的畸形结构,是 JavaBean 被滥用的表现,而不是 JavaBean 的表现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782167

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX