-1

いくつかのプロパティを持つクラスがあり、コンストラクターでそれらを初期化する必要があるいくつかの理由があります。私はこのようにしました

public DataBuilder(IResources Resources)
        {
            _resources = Resources;
            // pre initializing data so request load faster after the first request
            var providerList = ProviderList;
            var publisherList = PublisherList;
            var applicationsList = ApplicationList;
            var catergoriesList = CategoryList;
            var editionsList = EditionsList;
        }

しかし、チーム リーダーは、変数に代入せずに初期化する方法を考えるように言いました。

何か案は ?

4

1 に答える 1

1

各プロパティで何を行っているかを知っておくと便利です。そのコンテキストがないと、すべてがコードの匂いのように思えるからです。

プロパティ get でのこのデータ ロードが、コンストラクタでそれらを「事前に呼び出す」ことを保証するのに十分なほど高価である場合、私が最初に行うことは、少なくともそれらをメソッドにすることです。

InitializePropertyList();
// etc

私がメソッドを好む傾向がある理由は、戻り値が後続の呼び出しで変更される可能性がある場合、または呼び出しが高価な場合 (あなたの場合はそうなるでしょう) のいずれかです。プロパティ呼び出しは安価であると期待しています。

それらがコンストラクターにあることに関しては、これはすぐにコードの匂いのように思えます。コードが間違った場所にあるようです。

データをロードせずにオブジェクトを構築し、事前にロードするメソッドを公開してみませんか?

class DataBuilder
{
    public DataBuilder(IResources resources)
    {
        _resources = resources;
    }

    public void PreLoadExpensiveData()
    {
        InitializeProviderList();
        // etc
    }

    private void InitializeProviderList()
    {
        // Put whatever was in get_ProviderList into here 
        // and make the property return just the field.
    }
}

また、オブジェクトの構築は安価であると期待する傾向があります。コンストラクターが多くのことを行う必要がある場合は、おそらくリファクタリングして、コンストラクターがデータ自体を取得する代わりにデータを要求するようにします。または、オブジェクトの構築が高速である上記の構造を使用しますが、データの読み込みまたは初期化メソッドを公開します-そのようなデータ読み込みアクションがオブジェクトの責任であると仮定します。

于 2012-06-19T08:37:36.850 に答える