所以我一直在努力解决这个问题。
我正在努力学习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;
这会导致代码减少,我可以将我的方法设为私有
然而,当方法有参数时,我会很难做到这一点
那我该怎么做?这是不好的做法吗?如果这不是我应该怎么做,那我该怎么做呢?
我真的很想听到你们的消息!请不要犹豫,提出问题或更改我的问题 此外,如果已经提出这个问题,我真诚地道歉 任何很棒的教程也非常受欢迎!
答案 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(或简称为对象)获取数据。您的存储库可能会加载所需的所有数据,并返回包含所有数据的对象。