Stage1st

 找回密码
 立即注册
搜索
查看: 6822|回复: 59
打印 上一主题 下一主题

[其他] [码农]一个成员变量既有get又有set,那为什么不设为public呢?

[复制链接]
     
跳转到指定楼层
楼主
发表于 2023-11-13 09:46 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新入行工作的对此表示不解

—— 来自 S1Fun
回复

使用道具 举报

2#
发表于 2023-11-13 09:50 | 只看该作者
本帖最后由 璇瑢子R 于 2023-11-13 09:52 编辑

大概get 和set你一眼就能看出在做什么操作而且只能做这些操作。直接操作变量容易产生奇怪的误操作
其次有些时候get或者set里面不是直接赋值或者return这个变量,你是可以加检查,加一些类型转换在里面的
回复

使用道具 举报

     
3#
发表于 2023-11-13 09:50 来自手机 | 只看该作者
本帖最后由 a4ac7 于 2023-11-13 09:52 编辑

get和set里面加逻辑转换,可以改一个地方就修改所有的访问吧

不过越现代的语言像kotlin,你写get set外面就和直接使用这个变量格式是一样的
成员变量既有get方法又有set方法的设计方式是为了封装数据,并提供对数据的访问控制和保护。

如果将成员变量设为public,意味着任何地方都可以直接访问和修改该变量的值,这样会破坏了封装的概念,使得数据的安全性无法得到保障。任何地方都可以随意修改变量的值,可能会导致意外的错误和不一致的状态。

通过提供get方法和set方法,我们可以控制对成员变量的访问方式。get方法用于获取成员变量的值,而set方法用于设置成员变量的值。这样可以对数据进行验证、限制和处理,确保数据的有效性。同时,我们还可以在get和set方法中加入其他逻辑,比如记录日志、触发事件等。

总结来说,将成员变量设置为private,并提供get和set方法,是一种良好的封装实践,可以保护数据的安全性,并提供对数据的控制和处理能力。

—— 来自 HUAWEI NOH-AN00, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

头像被屏蔽
     
4#
发表于 2023-11-13 09:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5#
发表于 2023-11-13 09:53 | 只看该作者
oop的原则之一封装性:(将)使用这个类的人是不可信任的小白
回复

使用道具 举报

头像被屏蔽
     
6#
发表于 2023-11-13 09:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
7#
发表于 2023-11-13 09:55 来自手机 | 只看该作者
上面说得挺全的。你可以直接用这两个方法控制赋值和取值逻辑,譬如,可以在set方法里联动修改几个字段。这些东西你就不需要每次外部改这个值时联动处理了。
当你用不到时,就会觉得过于鸡肋。但如果你写jaba,也就是一行at data注解的事情。
这是一种封装手段,也是一种收口方式吧
回复

使用道具 举报

8#
发表于 2023-11-13 09:56 | 只看该作者
[ 本帖最后由 萨格诺伊 于 2023-11-13 10:01 编辑 ]\n\n比如你的数据结构里面有索引之类的,set可以保持索引和数据的一致性。

class xxx
{    private:
        int num[10];
        int max_num;
    public:
        set_num(int source,size_t i)
        {num[i]=source;max_num=max(max_num,source);}
}
回复

使用道具 举报

头像被屏蔽
     
9#
发表于 2023-11-13 09:58 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
10#
发表于 2023-11-13 09:58 | 只看该作者
我知道你不是在问js,但你为什么不了解一下双向绑定的实现呢?
回复

使用道具 举报

11#
发表于 2023-11-13 10:00 | 只看该作者
1. 方便做线程安全
2. 保不齐有人搞个memcpy之类的
回复

使用道具 举报

12#
发表于 2023-11-13 10:00 | 只看该作者
因为程序员需要考虑
1,测试
测试发现数据a出了问题,现在想知道哪里出了问题你怎么找
如果你限制了访问并使用了set函数,你只需要跟踪set函数这一个点
2,维护
这个上面都提到了

真正工作用的程序首先要考虑的都是以上两点
回复

使用道具 举报

头像被屏蔽
     
13#
发表于 2023-11-13 10:02 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
14#
发表于 2023-11-13 10:02 | 只看该作者
避免直接操作带来的各种奇葩问题。jvav的话有lombok的@data,但好像有些公司不给用觉得侵入性有点大。。。
回复

使用道具 举报

     
15#
发表于 2023-11-13 10:02 | 只看该作者
这倒是个非常经典的问题,自己可以思考下有啥区别
回复

使用道具 举报

16#
发表于 2023-11-13 10:11 | 只看该作者
我一直当作OOP的封装来理解
回复

使用道具 举报

17#
发表于 2023-11-13 10:19 | 只看该作者
又是jaba又是jvav,是地球ol出乱码了吗?
回复

使用道具 举报

     
18#
发表于 2023-11-13 10:22 来自手机 | 只看该作者
统一使用方法而不是混在一起用,不然不oop
回复

使用道具 举报

     
19#
发表于 2023-11-13 10:45 | 只看该作者
本帖最后由 henvelleng 于 2023-11-13 10:48 编辑

一方面是加锁,而且这个成员变量的值未必是实时刷新的,也许得有人访问的时候它才刷新;另一方面是最基本的接口与实现隔离原则,现在它虽然只是一个成员变量,以后很可能就不是了
回复

使用道具 举报

     
20#
发表于 2023-11-13 10:47 来自手机 | 只看该作者
本帖最后由 格林达姆 于 2023-11-13 10:59 编辑

一个房间的黑板上写着一串数字

直接访问:我冲进房间改掉了这串数字/冲进这房间去看黑板上写着啥

setter/getter:我在房间外告诉这房间里的人数字应该改成什么/询问房间里的人现在数字是什么

接下来,假设同时还有二十个和我一样的人想对这数字上下其手……
回复

使用道具 举报

21#
发表于 2023-11-13 10:50 | 只看该作者
别问,问就是oop
回复

使用道具 举报

头像被屏蔽
     
22#
发表于 2023-11-13 10:50 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

23#
发表于 2023-11-13 10:57 | 只看该作者
你也可以不用get/set,而是每个field都自己搞一个类,并且重载operator=
回复

使用道具 举报

     
24#
发表于 2023-11-13 11:10 | 只看该作者
你可以借钱给别人,也可以向别人借钱,可你愿意别人随便翻你钱包吗?
回复

使用道具 举报

     
25#
发表于 2023-11-13 11:10 | 只看该作者
compass01 发表于 2023-11-13 10:19
又是jaba又是jvav,是地球ol出乱码了吗?

就和把C#叫C艹艹一样,别在意
回复

使用道具 举报

     
26#
发表于 2023-11-13 11:15 | 只看该作者
然而实际工作中用反射也好用指针越界也好。直接硬改别人私有变量的情况也很多。
回复

使用道具 举报

     
27#
发表于 2023-11-13 11:18 | 只看该作者
有的时候Set里还需要做一些广播操作、日志操作
另外类的成员暴露出去会发生什么类本身是没办法控制的,而get set可以对这些交互做出一定的限制
回复

使用道具 举报

     
28#
发表于 2023-11-13 11:19 | 只看该作者
我觉得lz的意思是如果getter setter都是默认实现的话为什么不直接改成public。也就是为什么要写默认gettersetter。我觉得如果像c#或python一样 访问public跟调用gettersetter的语法是一样的,那确实可以先用着public,需要的时候再改掉。按照拙劣类比来说,如果谁来借钱我都借的话,那不如直接把钱包丢大马路上还方便一点。
回复

使用道具 举报

     
29#
发表于 2023-11-13 11:19 | 只看该作者
本帖最后由 闷吸 于 2023-11-13 11:22 编辑

楼上说了那么多,然而事实是90%的setter和getter里面只有一行赋值语句或一行return。
我的建议是如果暂时没有需要额外做的事情,就不要滥用 setter 和 getter,有需要的时候再加。
回复

使用道具 举报

     
30#
发表于 2023-11-13 11:21 | 只看该作者
闷吸 发表于 2023-11-13 11:19
楼上说了那么多,然而事实是90%的setter和getter里面只有一行赋值语句。
我的建议是如果暂时没有需要额外做 ...

同意,当性能要求高的算法了,get set方法也是一块消耗。
回复

使用道具 举报

     
31#
发表于 2023-11-13 11:26 来自手机 | 只看该作者
容易改代码
回复

使用道具 举报

头像被屏蔽
32#
发表于 2023-11-13 11:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
33#
发表于 2023-11-13 11:27 来自手机 | 只看该作者
但有些傻叉会在set和get里面玩骚操作写些乱七八糟的东西来自: iPhone客户端
回复

使用道具 举报

     
34#
发表于 2023-11-13 11:30 来自手机 | 只看该作者
你有一个时间的counter 从前单位是秒 现在升级到了毫秒

因为有了这么个接口 你可以在接口里/1000继续获取旧宝贝维持旧一致性

你的实现与他无关。

直接让他看到变量我就不好说大伙有多少改动了 比较理想的情况是他不跟着你升级了……

—— 来自 samsung SM-N9860, Android 13上的 S1Next-鹅版 v2.5.2-play
回复

使用道具 举报

     
35#
发表于 2023-11-13 11:32 | 只看该作者
立即进入二次元 发表于 2023-11-13 11:21
同意,当性能要求高的算法了,get set方法也是一块消耗。

不太同意。

一般的程序语言都会有编译时、或运行时对简单方法的自动优化,对于get、set是最明显会被优化的

不要做过早的优化。除非其他优化手段已尽、最大的开销确实指于此的情况下,再考虑
回复

使用道具 举报

36#
发表于 2023-11-13 11:33 | 只看该作者
右代宫嘉音 发表于 2023-11-13 11:27
但有些傻叉会在set和get里面玩骚操作写些乱七八糟的东西

get、set写逻辑挺正常啊,大把项目的全局配置都在get、set里面做读写配置文件或者数据库的操作。

说性能的,这都快2024了,手机都有24G内存,又不是做单片机开发。
回复

使用道具 举报

     
37#
发表于 2023-11-13 11:34 来自手机 | 只看该作者
我们保留了大部分的 pattern,这样你才知道你写的是 Java
是故意的(自豪)
回复

使用道具 举报

     
38#
发表于 2023-11-13 11:38 | 只看该作者
因为你永远不知道谁会怎么使用你的对象,而你却要维护任何和你的代码相关的问题。
回复

使用道具 举报

     
39#
发表于 2023-11-13 11:42 | 只看该作者
右代宫嘉音 发表于 2023-11-13 11:27
但有些傻叉会在set和get里面玩骚操作写些乱七八糟的东西

怕啥?又不是自己维护的,测试时数据调用异常的话,谁拉的屎谁负责
回复

使用道具 举报

     
40#
发表于 2023-11-13 11:57 | 只看该作者
setter一个很大的作用是可以往里面插NotifyValueChanged()这种东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|stage1st 沪ICP备13020230号-1 沪公网安备 31010702007642号

GMT+8, 2024-4-27 22:26 , Processed in 0.035977 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表