V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  xiaomingVTEX  ›  全部回复第 7 页 / 共 29 页
回复总数  576
1 ... 3  4  5  6  7  8  9  10  11  12 ... 29  
2021-06-08 17:22:35 +08:00
回复了 aqtata 创建的主题 程序员 你们用 get/set 吗?
## 摘录: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 语言,这就是一个很好的区分。能分清楚传输数据和业务对象,这就是一个很好的区分。
2021-06-08 15:21:15 +08:00
回复了 aqtata 创建的主题 程序员 你们用 get/set 吗?
get/set java pojo,
可以看看极客时间 软件设计之美 14 面向对象之封装, 怎样的封装才算是高内聚
2021-06-04 13:50:28 +08:00
回复了 32556188w 创建的主题 MacBook Pro 打搅,请问现在买入 m1mbp 13 还是等待 14(据说 6 月份)出
2 号京东买了 13, 等 8 号出来如果有 14 就以旧换新换
2021-06-02 14:36:09 +08:00
回复了 gadzadlee 创建的主题 Android 求推荐一部安卓手机(备用机)
realme 千多块钱
2021-06-01 17:21:26 +08:00
回复了 InDom 创建的主题 京东 京东好活当赏。
有价格保护吧
2021-06-01 17:20:31 +08:00
回复了 InDom 创建的主题 京东 京东好活当赏。
@captain2011 哈哈, 所以我拍拍二手买了 99 新
2021-06-01 10:44:14 +08:00
回复了 xuqiccr 创建的主题 程序员 [水贴]被同事的变量名惊呆了
no ce shui user 哈哈
这个可不可以加一张表用来存交易 + 员工呢
2021-05-30 15:35:11 +08:00
回复了 liudaolunhuibl 创建的主题 成都 成都真的被吹得太过了,一线的同学谨慎回来吧
@liudaolunhuibl #211 好像是这样 我看去年的统计, 从招聘需求和平均薪资来看都比西安强的
2021-05-30 12:34:12 +08:00
回复了 liudaolunhuibl 创建的主题 成都 成都真的被吹得太过了,一线的同学谨慎回来吧
西安如何, 深圳待了两年, 学校一般经历一般, 因为老家是湖北恩施, 最近准备离职, 在考虑回到家乡附近(武汉不考虑), 家乡附近也就基本 成都重庆,西安,湖南吧
2021-05-30 01:37:49 +08:00
回复了 Felldeadbird 创建的主题 Vue.js 不前后端分离写 VUE,页面是不是会有多个 createApp 行为?
2021-05-29 07:53:52 +08:00
回复了 anranruoxia 创建的主题 MacBook Pro 6 月开发者大会有新 MacBook?
现在买 mac 是等 m1x 还是 M2 呢
@AllenHua 现在看似多花钱, 后续不用升级麻烦, (如果只是通勤用除外)
2021-05-28 16:07:24 +08:00
回复了 masterV 创建的主题 问与答 我裂开了,求推荐桌子
宜家的可以; 可以阿里巴巴找找, 之前买的 1.6 大长桌, 可以坐两个人
2021-05-27 15:57:49 +08:00
回复了 tenngoxars 创建的主题 分享创造 我司新开源了一个代码搜索工具,欢迎试用并提建议~
可以指定仓库搜索吗? 因为我在仓库放了笔记, 想指定某个仓库然后搜索内容, 例如 MyJava 仓库中有一行代码注释: 动态代理, 我可以在指定 MyJava 仓库搜索 "动态代理" 不
坐标那里啊, 也准备溜了
2021-05-25 22:11:37 +08:00
回复了 neruda 创建的主题 程序员 Java 收徒 7 天后情况汇报
总感觉奇奇怪怪, 哈哈
2021-05-25 21:59:31 +08:00
回复了 dujiangbo 创建的主题 Linux Linux 有没有镜像备份和恢复的软件?
之前用过 Ubuntu 的备份
1 ... 3  4  5  6  7  8  9  10  11  12 ... 29  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   969 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 40ms · UTC 23:48 · PVG 07:48 · LAX 16:48 · JFK 19:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.