Stage1st

 找回密码
 立即注册
搜索
12
返回列表 发新帖
打印 上一主题 下一主题

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

[复制链接]
     
41#
发表于 2023-11-13 11:59 | 只看该作者
业界规范,其实就是java带坏的

当时对oop的理解是数据和操作绑定在一起,但又有数据隔离的需要,才有了后来各种官方答案
现在都认识到oop不是把所有东西都塞类里,组合大于继承,数据可以和接口分离,但过去的设计还会沿用一段时间
回复

使用道具 举报

     
42#
发表于 2023-11-13 12:06 来自手机 | 只看该作者
最近在写清华的操作系统实验,缓存项结构体有一个dirty字段,来控制缓存项回收时要不要写回磁盘,set方法里面把dirty设为脏就不用自己手动标记了
回复

使用道具 举报

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

没啥开销的,现代编译器都可以做 inline 的,有些语言甚至把getter setter当做compiler hint。
用getter setter 一方面可以避免通过引用在非预期的环境下修改变量,另一方面也容易加notify。现代ide一般也很容易配置自动生成getter setter
回复

使用道具 举报

     
44#
发表于 2023-11-13 12:30 来自手机 | 只看该作者
方便加限制吧,const const ref啥的。直接访问容易有内存问题

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

使用道具 举报

     
45#
发表于 2023-11-13 12:36 来自手机 | 只看该作者
hgfdsa 发表于 2023-11-13 11:33 引用:右代宫嘉音 发表于 2023-11-13 11:27 但有些傻叉会在set和get里面玩骚操作写些乱七八糟的东西 get、set写逻辑挺正常啊,大把项目的全局配置都在get、set里面做读写配置文件或者数据库的操作。  说性能的,这都快2024了,手机都有24G内存,又不是做单片机开发。

性能是小问题,主要是一些骚操作,什么第一次怎么做,第二次怎么做。set也就罢了,get里面乱改其他属性的值这事我见多了。来自: iPhone客户端
回复

使用道具 举报

     
46#
发表于 2023-11-13 13:19 | 只看该作者
golang根本不懂.jpg
回复

使用道具 举报

     
47#
发表于 2023-11-13 14:25 | 只看该作者
java要开发者自己来实现getter、setter,确实会让一些洁癖开发者感觉繁琐,哪怕是用工具自动生成一堆getter、setter方法,实际上90%以上的场景就是单纯对这个属性的读取和写入。
像js就直接所有变量内置getter、setter,用不到的不会去接触,也就不会有这样的疑问了
回复

使用道具 举报

     
48#
发表于 2023-11-13 14:32 来自手机 | 只看该作者
lombook搞定

—— 来自 Xiaomi Mi 10 Pro, Android 13上的 S1Next-鹅版 v2.5.2-play
回复

使用道具 举报

     
49#
发表于 2023-11-13 14:36 | 只看该作者
从面向对象来说,无逻辑的getter、setter和直接设置属性为public本来就是没区别的
Java程序员也别说什么@Data,使用lombok本来就是为了节约开发量反模式的事情
反正问就是规范
现代Java的(国内)规范很多都是反OOP的
回复

使用道具 举报

     
50#
发表于 2023-11-13 14:47 来自手机 | 只看该作者
Kotlin MVVM 架构来说,View Model 里面的东西你只能读取,不能修改,否则代码差了就会导致业务混乱,里面所有东西都得是 private ,提供 get 函数外部读取, 这是数据单向流动的方案,如果随便乱改会出问题
回复

使用道具 举报

     
51#
发表于 2023-11-13 14:47 来自手机 | 只看该作者
本帖最后由 tokamak 于 2023-11-13 14:49 编辑

楼上全都不对。让我来告诉你为什么
当你要写stream().map()的时候,Class::getField写起来比object -> object.field更快,也更短
回复

使用道具 举报

     
52#
发表于 2023-11-13 14:49 | 只看该作者
因为java自己的设计缺陷导致了一套狗屁不通的糟粕被发明出来并被称为设计模式。这种东西没必要认真对待,你该看的是优秀的语言是怎么设计的。
回复

使用道具 举报

     
53#
发表于 2023-11-13 14:51 | 只看该作者
对线 发表于 2023-11-13 14:36
从面向对象来说,无逻辑的getter、setter和直接设置属性为public本来就是没区别的
Java程序员也别说什么@Da ...

对,本楼讨论的是无逻辑的getter,setter,后面聊着聊着就歪了
回复

使用道具 举报

     
54#
发表于 2023-11-13 15:12 来自手机 | 只看该作者
那现在无逻辑的getter/setter指不定哪天要改成有逻辑的
回复

使用道具 举报

     
55#
发表于 2023-11-13 15:13 | 只看该作者
某些情况下还是有区别的,比如一些 AOP/ORM 框架会使用运行时动态织入的代码,你的对象必须用 virtual function 才有机会被织入,直接字段访问就没办法了
回复

使用道具 举报

     
56#
发表于 2023-11-13 15:18 | 只看该作者
楼上提到了,翻译成人话就是一些面向切片的的框架,它切入检查的点是函数的位置,只有变量是没法做的,但是两个工作是很可能分开给不同的人做的,那自己弄的的时候就按标准写法写,而且现在编译器都是可以一键生成代码的,也无所谓了
回复

使用道具 举报

     
57#
发表于 2023-11-13 15:40 来自手机 | 只看该作者
我们C/C++码农对这事有不一样的理解:暴露出来的接口如果有字段和成员的概念那就说明你这个接口实现的不合理,所有接口都应该是给定参数然后run获取结果的形式

—— 来自 OPPO PFEM10, Android 13上的 S1Next-鹅版 v2.2.2
回复

使用道具 举报

     
58#
发表于 2023-11-13 15:42 来自手机 | 只看该作者
我刚入行的时候也是这样写的,现在写点小工具依然这样,但是大项目就老老实实加get/set,稳妥
回复

使用道具 举报

     
59#
发表于 2023-11-13 15:50 | 只看该作者
云卷花开r 发表于 2023-11-13 15:40
我们C/C++码农对这事有不一样的理解:暴露出来的接口如果有字段和成员的概念那就说明你这个接口实现 ...

是的,类成员变量本身就数量少,基本都是类的核心中的核心,被别人随便访问就是药丸的节奏,但是c语言藏不了成员变量,只能在名字前拼命加下划线、外加恐吓型注释,就很难受
回复

使用道具 举报

60#
发表于 2023-11-13 15:53 | 只看该作者
C.131: Avoid trivial getters and setters
Reason

A trivial getter or setter adds no semantic value; the data item could just as well be public. Example

class Point {   // Bad: verbose
    int x;
    int y;
public:
    Point(int xx, int yy) : x{xx}, y{yy} { }
    int get_x() const { return x; }
    void set_x(int xx) { x = xx; }
    int get_y() const { return y; }
    void set_y(int yy) { y = yy; }
    // no behavioral member functions
};

Consider making such a class a struct – that is, a behaviorless bunch of variables, all public data and no member functions.

struct Point {
    int x {0};
    int y {0};
};

Note that we can put default initializers on member variables: C.49: Prefer initialization to assignment in constructors.
Note

The key to this rule is whether the semantics of the getter/setter are trivial. While it is not a complete definition of “trivial”, consider whether there would be any difference beyond syntax if the getter/setter was a public data member instead. Examples of non-trivial semantics would be: maintaining a class invariant or converting between an internal type and an interface type.

Enforcement

Flag multiple get and set member functions that simply access a member without additional semantics.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 02:52 , Processed in 0.028257 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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