【问题标题】:Using if expression in getter在 getter 中使用 if 表达式
【发布时间】:2014-02-20 10:59:47
【问题描述】:

只使用公共属性是否正确,还是应该创建一个私有字段_count?我已阅读有关该主题的一些信息,但找不到答案。

public int Count
{
    get
    {
        if (this._feeds.IsValueCreated)
        {
            return this._feeds.Value.Count;
        }
        else
        {
            return this._dbConnection.Table<T>().Count();
        }
    }
}

public FeedRepository(SQLiteConnection dbConnection)
{
    this._dbConnection = dbConnection;
    this._feeds = new Lazy<IList<T>>(() => _dbConnection.Table<T>().ToList());
}

【问题讨论】:

  • 请解释您正在尝试做什么以及为什么要问这个问题,您担心什么。 “Is it right?”的基本答案是通过询问“Does it work?”获得的,如果您担心其他事情,请解释一下。
  • 为什么它可能不正确?
  • 您是否关心存储库模式的实现?如果您只是询问 Count getter,那么是的,为什么不呢,您不必实现私有字段。
  • 我读过“getter 中没有复杂的逻辑”,所以我想知道是不是太多。
  • 嗯,这不是复杂,是吗? :)

标签: c# .net accessor


【解决方案1】:

这是房地产真正闪耀的经典示例。

属性允许您encapsulate 数据,在这种情况下Count 实际上是在做一些聪明的事情,因为它在第一次访问时从数据库中延迟加载,然后从本地缓存中提取。在这里对字段使用属性的好处在于,您可以将所有这些逻辑隐藏在访问器后面,就消费者而言,他们只需要了解 Count 属性即可。

另一方面,如果您使用_count,那么消费者需要了解他们必须先加载此值,否则需要提前加载以准备。

所以是的,房产绝对是这里的必经之路。

【讨论】:

    【解决方案2】:

    如果您使用的是 Smart-UI 模式,那么将逻辑驻留在 getter 和 setter 中是没有问题的。有时,我们的应用程序小到足以使其成为一个吸引人且易于使用的选项。

    我们应该记住,反过来也是如此。如果这是一个我们试图解决的复杂问题,那么我们应该重新考虑我们的领域以及我们如何与之交互。有人可能会争辩说,将 if 语句和其他业务逻辑放在 getter 和 setter 中会增加领域中的技术债务。

    在程序员身上发现了一个有趣的讨论:what should be allow inside getters and setters

    希望这会有所帮助。

    附言。根据我们领域的范围,智能用户界面也可以被视为反模式。

    【讨论】:

      【解决方案3】:

      这与Code Review接壤,但我会尽量问和回答你想问的问题:

      我的存储库模式中有一个只读的Count 属性。当存储库已用于加载数据时,Count 属性应返回加载的记录数。否则,它应该返回基础表中所有记录的Count

      getter 中用于实现此目的的代码是否被认为“太多”?

      答案是:不。 getter 完全符合您的预期。有两种情况,所以你需要一个if。也许你可以解决它,但它不会让你的代码更干净。

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 2011-01-21
        相关资源
        最近更新 更多