在访问者C#中调用方法

时间:2016-11-24 10:24:01

标签: c# oop methods accessor

所以我一直在努力解决这个问题。
我正在努力学习OOP,但这是如此之大,以至于我至少很难理解所有这一点 让我们说我在类中有一个从数据库中获取内容的方法 此数据将设置为变量 我现在做的是有一个公共方法,调用它,然后使用值调用访问器。例如:

        private string _name;

        public string Name { get { return _name; } }

        public void MyMethod()
        {
            using (SqlConnection connect = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand("SELECT Name FROM Table WHERE ID = 1", connect))
                {
                    connect.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            _name = Convert.ToString(reader["Name"]);
                        }
                    }
                }
            }
        }

我会称之为:

MyClass myclass = new MyClass();
myclass.MyMethod();
string myname = myclass.Name;

现在这对我来说真的很奇怪 所以我想,也许在访问器中调用方法是值得的 像:

public string Name { get { MyMethod(); return _name; } }

将其称为:

MyClass myclass = new MyClass();
string myname = myclass.Name;

这会导致代码减少,我可以将我的方法设为私有 然而,当方法有参数时,我会很难做到这一点 那我该怎么做?这是不好的做法吗?如果这不是我应该怎么做,那我该怎么做呢?

我真的很想听到你们的消息!请不要犹豫,提出问题或更改我的问题 此外,如果已经提出这个问题,我真诚地道歉 任何很棒的教程也非常受欢迎!

3 个答案:

答案 0 :(得分:4)

您正在实施的是Lazy Evaluation的一种形式  有时称为缓存属性

一般设计模式是:

private SomeType _value;
public SomeType CachedProperty {
     get {
          if(_value == null) {
              _value = GetValue(); // slow
          }
          return _value;
     }
}

有几个理由阻止了这种财产的概念:

  • GetValue()通常很慢。这就是为什么我们首先要把它的价值放在首位。因此,第一次通话时访问该属性的速度很慢。 我们希望房产始终快。

  • 当我们再次需要时,兑现的价值可能已经过时了。这可以通过像UpdateValue这样的公共方法来缓解。 我们希望房产始终最新。

  • 如果省略_value == null检查,则该属性将成为方法的包装器。那么我们为什么要使用房产呢?

所以基本上这个设计模式隐藏了这个事实,即潜在的价值本质上是不稳定的,并且可能需要一些时间来进行检索。

您是否真的想要这样做,取决于您周围代码的要求。

但总的来说,我会选择典型的异步模式:

public SomeType GetValue() { ... }
public Task<SomeType> GetValueAsync() { ... }

如果您确实需要在不同的范围上使用缓存值,请添加:

public SomeType CachedValue { get; }

这澄清了你得到快速方式的价值可能已经过时了。

答案 1 :(得分:3)

  • 您可以考虑在ctor中运行该方法一次。

  • 您可以使用公共RefreshData方法,从db更新所需内容。

  • 您可以让属性检查_name是否为空,并且只有它是 - 它会从数据库更新它然后返回它 - 否则它只返回现有值。您可以将此与Invalidate方法结合使用,该方法将_name和任何其他相关成员设置为null或其他指示,以使其属性在下次调用时确实重新调用更新函数

在现实生活中,你通常会知道什么是更好的方法 - 但它们都是OOP。

然而,您建议的解决方案有点违反OOP原则,因为MyMethod可能不应该公开,而您的班级可能是负责其数据的人。

同样正如Jamiec的回答所暗示的那样,你应该在Repository类中甚至整个层(有时是单独的项目)中实现与DB相关的逻辑(仅查找DAL)。这是因为即使你的班级可能对自己的数据负责 - 它也不应该知道&#34;关于数据库或查询语言的任何事最多 - 它知道如何为某些数据提出独立的问题。

答案 2 :(得分:1)

需要注意的重要一点是,这两件事(一个保存数据的对象和获取数据的方法)是两个非常不同的问题。良好的做法要求您的班级有separation of concerns

在您的情况下,您应该有一个"repository"类,它知道如何从数据库和具有这些属性的DTO(或简称为对象)获取数据。您的存储库可能会加载所需的所有数据,并返回包含所有数据的对象。