你们用 get/set 吗?

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



name()/name(value)

你们习惯用哪种?
8653 次点击
所在节点    程序员
58 条回复
lllllliu
2021-06-08 15:06:03 +08:00
getName()/setName(value)
GeruzoniAnsasu
2021-06-08 15:08:41 +08:00
除了 c++这种 snake_case 约定又没有 properties 写 name()来模拟它是个 property 外其它语言我其实想不到不加 get/set 的理由
cking
2021-06-08 15:09:54 +08:00
看楼上两位的回答 我都不知道我自己用 java 的 lambda 默认的 get/set 是不是有问题了....
Leviathann
2021-06-08 15:11:30 +08:00
kotlin 里
xx.name 就等于是 xx.getName()
xx.name = "abc" 就等于是 xx.setName("abc")
xiaomingVTEX
2021-06-08 15:21:15 +08:00
get/set java pojo,
可以看看极客时间 软件设计之美 14 面向对象之封装, 怎样的封装才算是高内聚
3dwelcome
2021-06-08 15:25:09 +08:00
js 的 var a = this.name; 和 this.name = value;最好。

反正 js 语言特性可以做到无感 hook,只有不支持的语言,才必须 set/get.
kop1989
2021-06-08 15:38:24 +08:00
抛开语言来探讨这个问题其实是没意义的。
楼上的回复也证明了,每种语言对于 getter 、setter 的理解与语法均不同。
所以很难定义什么叫“用 get/set”。
JamesR
2021-06-08 15:42:22 +08:00
这玩意麻烦得很,一两个人在开发的话,纯属多此一举,只有上百人那种大型项目各人写各人的类才有意义。
nerocc
2021-06-08 15:44:37 +08:00
C#里面 field 和 property 是分得很清楚的两个概念,写起来舒服很多,不需要考虑这么多 get set 的问题
Jwyt
2021-06-08 15:56:42 +08:00
公司的项目用 getName()/setName(value)
自己的用 name(),name(string name)来做 get/set
Kasumi20
2021-06-08 15:57:26 +08:00
戴不戴套的问题
ychost
2021-06-08 16:00:44 +08:00
这一点 C# 的 {get;set;} 把 properties 和 field 分的命名白白,java 只能 @Getter @Setter 来释放劳动力了,很多的 JSON 序列化,ORM 都是基于 get_xxx 和 set_xxx 的名字,而不是 field 的名字
Rwing
2021-06-08 16:24:54 +08:00
建议各位 java 程序员多睁开眼看看其他语言
coderxy
2021-06-08 16:28:22 +08:00
最开始写 go 的时候就纠结要不要用 set get, 后来发现去 TMD,直接写不知道有多爽。 正常业务哪有那么多需要往后拓展的需求,实在变动大了基本就是重构了。
Fule
2021-06-08 16:35:58 +08:00
这方面 C# 的属性(Property)语法是真的香。

**最传统的方式:**
private int _score = 10;

public int Score
{
get
{
// potential more logic here
return _score;
}
set
{
// potential more logic here
_score = value;
}
}

**简化方式(无默认值)**
public int Score { get; set; }

**简化方式(有默认值)**
public int Score { get; set;} = 10;

**简化方式只读属性**
public int Score { get; private set; }
public int Score { get; }

**简化方式只读属性带默认值**
public int Score => 10;

题外话,C#里 `=>` YYDS
abersheeran
2021-06-08 16:46:16 +08:00
Python 直接 property

c.k = v 就是 setter
c.k 就是 getter
iikebug
2021-06-08 17:17:13 +08:00
@Fule c#的语法真的不错
xiaomingVTEX
2021-06-08 17:22:35 +08:00
## 摘录:14 | 面向对象之封装:怎样的封装才算是高内聚?

封装的重点在于对象提供了哪些行为,而不是有哪些数据。也就是说,即便我们把对象理解成数据加函数,数据和函数也不是对等的地位。函数是接口,而数据是内部的实现,正如我们一直说的那样,接口是稳定的,实现是易变的。

理解了这一点,我们来看一个很多人都有的日常编程习惯。他们编写一个类的方法是,把这个类有哪些字段写出来,然后,生成一大堆 getter 和 setter,将这些字段的访问暴露出去。这种做法的错误就在于把数据当成了设计的核心,这一堆的 getter 和 setter,就等于把实现细节暴露了出去。

一个正确的做法应该是,我们设计一个类,先要考虑其对象应该提供哪些行为。然后,我们根据这些行为提供对应的方法,最后才是考虑实现这些方法要有哪些字段。

封装的重点在于对象提供了哪些行为,而不是有哪些数据。也就是说,即便我们把对象理解成数据加函数,数据和函数也不是对等的地位。函数是接口,而数据是内部的实现,正如我们一直说的那样,接口是稳定的,实现是易变的。理解了这一点,我们来看一个很多人都有的日常编程习惯。他们编写一个类的方法是,把这个类有哪些字段写出来,然后,生成一大堆 getter 和 setter,将这些字段的访问暴露出去。这种做法的错误就在于把数据当成了设计的核心,这一堆的 getter 和 setter,就等于把实现细节暴露了出去。一个正确的做法应该是,我们设计一个类,先要考虑其对象应该提供哪些行为。然后,我们根据这些行为提供对应的方法,最后才是考虑实现这些方法要有哪些字段。


```
class User {
private String username;
private String password;

...

// 修改密码
public void setPassword(final String password) {
this.password = password;
}
}
```

但我们鼓励的做法是,把意图表现出来:

```
class User {
private String username;
private String password;

...

// 修改密码
public void changePassword(final String password) {
this.password = password;
}
}
```

这两段代码相比,只是修改密码的方法名变了,但二者更重要的差异是,一个在说做什么,一个在说怎么做。将意图与实现分离开来,这是一个优秀设计必须要考虑的问题。

不过,在真实的项目中,有时确实需要暴露一些数据,所以,等到你确实需要暴露的时候,再去写 getter 也不迟,你一定要问问自己为什么要加 getter 。至于 setter,首先,大概率是你用错了名字,应该用一个表示意图的名字;其次,setter 通常意味着修改,这是我们不鼓励的。

## 评论区
* 沧浪之水:
至于平时说的一些 POJO 的对象,可以看成是数据载体,是可以加 getter,setter 的(没有这些默认的 getter,setter,很多第三方的数据转化都很不方便,比如 json,sql 等)。在使用的时候,不归结为对象就可以了。

* 作者回复: 能分清楚面向对象和 Java 语言,这就是一个很好的区分。能分清楚传输数据和业务对象,这就是一个很好的区分。
lscexpress
2021-06-08 17:34:41 +08:00
@Leviathann 在 php 里面也是
3dwelcome
2021-06-08 17:55:18 +08:00
@xiaomingVTEX 现在 set/get 在 MVVM 中大量使用,框架可以在 set/get 上面下断点,知道变量什么时候被修改后,去通知与之关联的对象或事件。

如果类似这个作者说的,把 setpassword 改成 changepassword,那 MVVM 框架,就没办法去监控这个类里的数据变化了。

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

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

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

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

© 2021 V2EX