我应该使用静态或实例函数从数据库填充我的对象吗?

时间:2014-10-31 02:52:22

标签: c# object design-patterns mvvm

我知道这可能纯粹是一种设计偏好,但从您的角度来看:

  1. 我从数据库中检索项目的函数是静态的还是基于实例的?
  2. 什么是最常用的方法? (最常见的)
  3. 每种方法的优点/缺点是什么?
  4. 我有一个有3个属性的类:(没有对象的构造函数)

    • ObjectId - string
    • 名称 - 字符串
    • Count - 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");
    

1 个答案:

答案 0 :(得分:1)

我认为没有明确的,明确更好的方法。对我而言,这种情况取决于您最希望如何将职责与应用程序中的对象相关联。就目前而言,你的两个功能大致相同。

但从逻辑上讲,您是否希望“访问数据库”成为每个Tag对象负责的事情?他们是否应该了解数据库,从更广泛的意义上讲,他们是否了解自己以外的任何事情?或者他们应该只使用他们(似乎)需要的所有信息来构建,而不是担心沟通?

在你的情况下,你似乎没有做任何事情,只允许你的对象承担数据库访问的责任,所以在我看来你最好限制他们的关注,而不是静态选项。 (如果你必须在那些只有那两个之间做出选择,我的意思是。我认为你可以在你的ViewModel中使用非静态方法做同样的构造并返回一个Tag对象。我的感觉主要是我应该尝试标签限制他们的顾虑,而不是静态与实例。)

另外,在静态情况下,为什么没有构造函数?你在返回之前设置了所有Tag对象的属性,所以除非你需要能够构造一个Tag对象,其部分或全部属性为null,为什么不能有呢?

编辑:有些人合理地指出,静态方法往往会使单元测试变得更难。我原则上同意这一点,但我认为在这种情况下他会更好:

  1. 该方法没有存储或修改任何状态。出现的是Tag对象,无论是来自实例还是静态,您都可以测试它。
  2. 它依赖于需要模拟的外部数据调用(GetQuery)。
  3. 我对ParseObject.GetQuery(我认为这可能是Xamarin?)一无所知,但我不确定静态或这种特定结构是否会使模拟数据源变得更加困难。