我应该使用静态函数还是实例函数来从数据库填充我的对象
本文关键字:数据库 填充 对象 我的 函数 实例 静态函数 我应该 | 更新日期: 2023-09-27 18:28:28
我知道这可能纯粹是设计偏好,但从您的角度来看:
- 从数据库中检索项的函数应该是静态的还是基于实例的
- 通常最喜欢的方法是什么?(也是最常见的)
- 每种方法的优点/缺点是什么
我有一个类,它有3个属性:(没有对象的构造函数)
- ObjectId-字符串
- 名称-字符串
- 计数-int
基于实例的示例
public async void Get(string objectId) {
// Gets specific item from "Tag" table
ParseQuery<ParseObject> query = ParseObject.GetQuery("Tag");
ParseObject tagObject = await query.GetAsync(objectId);
this.ObjectId = tagObject.ObjectId;
this.Name = tagObject.Get<string>("name");
this.Count = tagObject.Get<int>("count");
}
设置我的对象会这样做:
Tag myTag = new Tag();
await myTag.Get("123456");
// Properties are set and ready to work with
静态示例
public static async Task<Tag> Get(string objectId) {
Tag toReturnTag = new Tag();
// Gets specific item from "Tag" table
ParseQuery<ParseObject> query = ParseObject.GetQuery("Tag");
ParseObject tagObject = await query.GetAsync(objectId);
toReturnTag.ObjectId = tagObject.ObjectId;
toReturnTag.Name = tagObject.Get<string>("name");
toReturnTag.Count = tagObject.Get<int>("count");
return toReturnTag;
}
并且将被设置为:
Tag myTag = await Tag.Get("123456");
我认为没有一种明确的、明确的更好的方法可以做到这一点。对我来说,这取决于您最希望如何将职责与应用程序中的对象相关联。就目前情况来看,您的两个功能或多或少是相同的。
不过,从逻辑上讲,你希望"访问数据库"是每个Tag对象负责的事情吗?他们是否应该了解数据库,从更大的意义上说,是否应该了解自己之外的任何东西?或者,它们应该只是用它们(看起来)需要的所有信息构建的,而不必担心沟通?
在您的情况下,允许您的对象承担数据库访问责任似乎并没有完成任何任务,所以在我看来,您最好限制他们的关注点,支持静态选项。(如果你必须在这两者之间做出选择,我的意思是。我认为你也可以在ViewModel中使用一个非静态方法,该方法构造并返回一个Tag对象。我在这里的主要感觉是,Tag应该尝试限制他们的关注点,而不是静态与实例。)
同样,在静态情况下,为什么没有构造函数?在返回Tag对象之前,您将设置该对象的所有属性,因此,除非您需要能够构造一个将其部分或全部属性设置为null的Tag对象,否则为什么不设置一个呢?
编辑:一些人合理地指出,静态方法往往会使单元测试更加困难。原则上我同意这一点,但我认为他在这种情况下会更好些:
- 该方法没有存储或修改任何状态。结果是Tag对象,无论它来自实例还是静态,您都可以测试它
- 它依赖于一个无论如何都需要模拟的外部数据调用(GetQuery)
然而,在对ParseObject.GetQuery了解不够的情况下(我认为这可能是Xamarin?),我真的不确定静态或这种特定的构造是否会使模拟数据源变得更加困难。