在getter中使用if表达式

时间:2014-02-20 10:59:48

标签: c# .net accessor

仅使用公共属性是否正确,还是应该创建私有字段_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());
}

3 个答案:

答案 0 :(得分:5)

这是一个属性真正闪耀的典型例子。

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

另一方面,如果您使用_count,则消费者需要了解他们必须先加载此值,否则需要在准备时过早加载。

所以是的,一个房产绝对是去这里的方式。

答案 1 :(得分:2)

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

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

有趣的讨论可以在程序员身上找到:what should be allow inside getters and setters

希望这有帮助。

聚苯乙烯。根据我们领域的范围,smart-ui也可以被视为反模式。

答案 2 :(得分:1)

这与Code Review接壤,但我会尝试提问并回答您想问的问题:

  

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

     

getter中使用的代码是否实现了这个&#34;太多&#34;?

答案是:不。吸气剂完全符合您的预期。有两种情况,因此您需要if。也许你可以解决它,但它不会让你的代码更清洁。