代码之家  ›  专栏  ›  技术社区  ›  CalibeR.50

定义一个不返回特定字段的getter是好的做法吗?

  •  3
  • CalibeR.50  · 技术社区  · 10 年前

    一种简单的问题。这样的方法是不是很好?

    private NavigableMap<Double, Site> m_sites;
    
    private Site getRandomSite()
    {
        return m_sites.ceilingEntry(Math.random()).getValue();
    }
    

    或者它是坏的,因为它是一个getter,您可以预期它会返回字段“randomSite”?

    6 回复  |  直到 10 年前
        1
  •  3
  •   CodeNewbie    10 年前

    这个方法很好,尽管我可以理解你不想调用它 getRandomSite() 因为它看起来像一个getter方法。基于Gio的回答,我建议您调用该方法 fetchRandomSite() 因为正如您所说,这个方法不会生成随机站点,它只是从NavigableMap中选取(或获取)它。

        2
  •  3
  •   Gio    10 年前

    如果你,代码的作者,认为它对你的代码库的其余部分来说是混乱的/糟糕的,那么把它的名称改为例如 generateRandomNumber() 然而,没有约定“get方法”必须始终返回字段。

        3
  •  2
  •   Suresh Atta    10 年前

    吸气剂可以从后面得到任何东西(返回任何东西)。这并不意味着它只返回某个字段的值。当前方法没有问题。

        4
  •  1
  •   kiwiron    10 年前

    不,这是不好的做法。这样的方法应该是静态的,并封装在实用程序类中,因为它们没有任何暗示它们与封闭类关联。此外,实用程序类应该有一个私有构造函数,这样它就不会被意外实例化。

    在这种情况下 也许 有用的是MyClass.allocateTextUniqueKey()。但在这种情况下,该方法不应该分配已经使用的密钥,因此它肯定与MyClass有关联。

        5
  •  0
  •   NoDataFound    10 年前

    如果你的方法确实计算了一些东西,那么最好使用一个方法名来解释这个行为:

    private NavigableMap<Double, Site> m_sites;
    
    private Site pickRandomSite()
    {
        return m_sites.ceilingEntry(Math.random()).getValue();
    }
    

    在任何情况下,无论它是一个真正的getter(这是一个虚拟方法,用于缺少C#中的财产,还是担心 struct 等价),唯一重要的是方法名称反映了它的目的。

    示例:不要打电话 getSite() 返回随机站点的方法。

    顺便说一句,让我烦恼的是什么 getRandomSite -是 m_sites 。我问过这是一次公司会议后就知道了,但这对我来说就像是一种混淆(我讨厌 前缀成员/方法的作用域 命名约定)。

        6
  •  0
  •   Markus Kull    10 年前

    关于getter有一些约定。如果有getter,则可能有相应的setter。此setter必须接受一个与getter类型完全相同的参数。某些框架(例如Spring)可能会强制执行此操作。

    回到您的问题,getter最后应该返回一个字段。这并不意味着必须直接返回该字段。例如,可能存在延迟加载或转换(getDurationInMillis、getDurationInSeconds…),但如果没有进行更改,getMethods是否真的会返回相同的值。Math.random()似乎是一个很好的例子。它被称为random()而不是getRandom(),因为会返回更改的值。

    总之,如果一个方法不能满足getter的所有期望,那么最好将其命名为其他方法。获取、搜索。。。