正在使用属性获取器进行初始化(以避免必须按特定顺序调用方法)吗?

问题描述 投票:0回答:1

假设我有一个向我的应用程序提供一些数据的类。数据最初来自数据库,我通过一些方法来提供数据,这些方法可以处理整个数据库,并将结果显示为可用的类,而不是原始查询结果。此类必须进行一些设置(并不复杂),以确保调用的任何方法都可以使用数据库(例如,连接到数据库,确保它包含一些关键信息等)。因此,如果我将其放在一个方法中(例如,方法Init(),该方法将处理数据库的检查,连接到数据库,验证它是否包含信息),则必须确保在调用此方法之前任何其他方法。因此,我通常会发现而不是这样做:

public class DataProvider
{
    private SqlController controller;

    public void Init()
    {
        controller = new SqlController();
        controller.Init();
        controller.ConnectToDataBase();
        CheckForCriticalInfoInDatabase();
    }

    public Data GetData()
    {
        // get data from database (not actually going to use raw queries like that, just an example)
        var queryResult = sqlController.RunQuery("SELECT something FROM SOME_TABLE");
        // and present it as usable class
        Data usefulData = QueryResultToUsefulData(queryResult);
        return usefulData; 
    }

    ...
}

然后始终确保我在GetData()之前调用Init(),我做类似的事情

    private SqlController _controller;

    private SqlController controller
    {
        get
        {
            if (_controller == null)
            {
                _controller = new SqlController();
                _controller.Init();
                _controller.ConnectToDataBase();
                CheckForCriticalInfoInDatabase();
            }
            return controller;
        }
    }

因此,现在我可以确定我不会使用未初始化的SqlController,并且不必在使用它的每个方法中都执行相同的null检查。但是,我从没注意到在其他人的代码中以这种方式使用吸气剂。

我看不到陷阱吗?在我看来,它与延迟初始化相同,不同的是我使用它不是因为初始化繁琐或冗长,而是因为我不想检查调用方法的顺序。 This question指出这不是线程安全的(就我而言,这不是一个问题,再加上我想它可以通过一些锁定使其成为线程安全的),并且将该属性设置为null会导致不直观的行为(不是问题,因为我根本没有二传手,也不应该以任何方式触及后备领域)。

此外,如果这种代码是基本实践,那么确保我的方法不依赖于调用它们的顺序的正确方法是什么?

c# methods lazy-loading
1个回答
0
投票

如@madreflection在OP注释中所说,对可能会变慢的任何事情都使用一种方法。 Getter和Setters应该只是获取和设置值的快速方法。

与数据库的连接可能很慢或无法连接,因此您可能需要进行捕获设置以尝试其他连接方法,等等。>>

您还可以在对象的构造函数中进行检查,这样,如果不在不同的函数中运行init(),就无法使用该对象,从而节省了在实际发生错误的时间上进行跟踪的时间。

例如,如果您有一个函数创建对象,则执行一堆'stuff',然后尝试在不运行init()的情况下使用该对象,然后在所有'stuff'不在您创建对象的位置后得到错误。这可能会使您认为使用该对象的方式有问题,而不是尚未初始化。

© www.soinside.com 2019 - 2024. All rights reserved.