Language agnostic 将getter和setter显式命名为“getter”和“setter”有什么好处;得到……”;及;设置…“;?

Language agnostic 将getter和setter显式命名为“getter”和“setter”有什么好处;得到……”;及;设置…“;?,language-agnostic,programming-languages,accessor,Language Agnostic,Programming Languages,Accessor,这会激怒其他人吗?我宁愿看到: block.key(newKey); // set the key for this block 及 首先,“set”和“get”是冗余的(因此增加了噪声,降低了可读性)。操作(set/get)由每个语句的语法定义。我理解超载。事实上,使用同一个完全相同的标识符加强了这些都是对象的相同属性。当我读“getKey()”和“setKey()”时,我可能不太确定 其次,如果“get”和“set”被严格解释为setter和getter,那么如果与设置/获取值相关的

这会激怒其他人吗?我宁愿看到:

 block.key(newKey);  // set the key for this block

首先,“set”和“get”是冗余的(因此增加了噪声,降低了可读性)。操作(set/get)由每个语句的语法定义。我理解超载。事实上,使用同一个完全相同的标识符加强了这些都是对象的相同属性。当我读“getKey()”和“setKey()”时,我可能不太确定

其次,如果“get”和“set”被严格解释为setter和getter,那么如果与设置/获取值相关的其他语义(例如副作用)将令人惊讶

我想这种偏见来自于我的Smalltalk背景,但在一个多态性工作得很好的世界里,如果没有到处散布的“get”和“set”,我们不是会更好吗?想想看,如果我们不必反复输入这三个字母,我们还能输入多少代码?!(有点开玩笑)


有人有同样的感觉吗?

对我来说,
get
set
前缀使我的大脑在阅读代码时工作更少。一致使用时,
get
/
set
方法可以更容易地grep标题,可能会使类更容易学习和使用。我花在读代码和写代码上的时间不成比例,因此
get
set
的额外字符对我来说是可以接受的。

C#的设计者显然同意这一点,“C#”标签在StackOverflow上以2:1的比例超过了下一个最流行的语言。所以我怀疑你是在向唱诗班布道。

几种语言处理“能手”和“能手”的方式不同。在Java中有getName和setName,在Qt中有name和setName。出于以下原因,我更喜欢Java方式:

  • 如果你有一个叫做drive的函数呢?它是让你的班级驾驶,还是设置/获得驾驶
  • 打开建议后,可以键入get,然后获取所有getter。如果你不记得你需要的getter的名字,这是非常有用的
  • 基于理由一,它将功能划分为不同的组。你有做某事的函数,它们不是以get或set开头的(尽管也许它们应该以do开头?)。然后你就有了获取属性的函数,它们都是从get开始的。然后是设置属性的函数,它们都以set开头

  • 是的,java中的get/set本质上是一种解决语言中问题的方法

    将其与c#properties进行比较

    还是蟒蛇

    我认为这是java最大的失败之一。

    C#getter和setter是“第一类”实体,在语法上与函数调用不相似(尽管任何任意代码都可以在访问器的上下文中运行)

    我只在强迫我使用get/set的语言中使用,比如Objective-C。

    在accessor前面加上“get”,在mutator前面加上“set”,这是一种因语言而异的做法,在Java中似乎最为普遍。例如:

    • 在Python中,您有属性的概念,因此访问器可能看起来像
      obj.foo
      ,而变异器可能看起来像
      obj.foo=bar
      (即使在幕后调用了方法)。类似的概念存在于Ruby等语言中。因此,在许多语言中,对访问器和变异器的调用看起来像是对实例变量的直接“调用”,而你从来没有见过像“setFoo”或“getFoo”这样的东西
    • 像Objective-C这样的语言不鼓励使用“get”作为访问器的前缀,因此在Objective-C中,您会看到像
      [obj foo]
      [obj setFoo:bar]
      这样的调用

    我也不喜欢在Java中用“get”作为访问器前缀的做法,但我确实看到了用“set”作为变量前缀的优点。也就是说,由于在爪哇中流行的是用“获取”/“SET”来前缀,所以我继续自己的代码中的趋势。C++中的

    < P> >只使用重载< /P>
    int parameter() const { return m_param }
    void parameter(int param) { m_param = param; }
    

    一般来说,属性名应该是名词,而方法名应该是动词,因此上面示例中的属性将被称为“driver”,方法将被称为“drive”。当然会有重叠的情况,但一般来说,这会起作用并使代码更具可读性。

    您可以轻松地在代码库中搜索对
    getDrive()
    setDrive()
    的引用。如果您的方法名为“drive”,则在搜索时会出现更多的误报。

    Java语言目前没有属性,因此getter/setter语法已成为事实上的标准。如果您正在编写Java代码,那么就可以很好地使用Java约定。这不仅仅是为了让其他程序员可以阅读您的代码,更重要的是,数百个其他Java框架被构建来处理支持样式getter/setter的对象

    例如,在中,您可以编写如下内容:

    The answer is $block.key
    
    以上内容将尝试调用:

    block.getkey();
    block.getKey();
    
    如果您已经定义了block.getKey(),那么所有这些都可以正常工作。一般来说,最好遵循语言的惯例

    听到,听到

    我真的很喜欢getter和setter的特殊符号。CLU做得最好:

    • 在表达式中使用
      p.x
      相当于调用
      get_x(p)

    • 使用
      p.x:=e
      (赋值)相当于调用
      set_x(p,e)

    如果对象
    p
    的接口未导出
    get_x
    set_x
    ,则无法执行相应的操作。简单


    让我们一起来听听吧

    Python链接的URL很有趣,因为这篇博文实际上建议在Python中实现get/set方法,但通过
    属性将它们屏蔽到成员名称中。你的观点2和3接近于支持Hunga
    
    The answer is $block.key
    
    block.getkey();
    block.getKey();