9

もしそうなら、なぜですか?「長時間」とは何ですか?

プロパティ アクセサーで魔法をかけることは、クラス デザイナーとしての私の特権のように思えます。私はいつも、C# の設計者がそれらをそこに入れている理由だと思っていました。

もちろん、クラスのユーザーに対する驚きを最小限に抑えることは良い習慣です。そのため、本当に長時間実行されるもの (たとえば、10 分間のモンテカルロ分析) をメソッドに埋め込むことは理にかなっています。

しかし、prop アクセサーが db 読み取りを必要とするとします。私はすでにデータベース接続を開いています。プロパティアクセサーで、通常の期待の範囲内で、dbアクセスコードは「許容」されますか?

4

8 に答える 8

22

あなたが言ったように、それはクラスのユーザーにとって驚きです。人々は、プロパティを使用してこのようなことができることに慣れています (不自然な例は次のとおりです:)

foreach (var item in bunchOfItems)
    foreach (var slot in someCollection)
        slot.Value = item.Value;

これは非常に自然に見えますが、item.Value実際にデータベースにアクセスするたびにヒットしている場合、それは小さな災害であり、これと同等の方法で記述する必要があります。

foreach (var item in bunchOfItems)
{
   var temp = item.Value;
   foreach (var slot in someCollection)
      slot.Value = temp;
}

あなたのコードを使用している人々を、このような隠れた危険から遠ざけ、メソッドに遅いものを入れて、彼らが遅いことを人々に知らせるのを手伝ってください。

もちろん、いくつかの例外があります。遅延読み込みに非常に長い時間がかからない限り、遅延読み込みは問題ありません。プロパティを作成すると、リフレクションおよびデータバインディング関連の理由で非常に役立つ場合があります。このルールを曲げます。しかし、特別な理由もなく慣例に違反したり、人々の期待に違反したりすることはあまり意味がありません。

于 2009-05-19T15:42:45.213 に答える
13

すでに投稿された適切な回答に加えて、クラスのインスタンスを検査すると、デバッガーがプロパティの値を自動的に表示することを追加します。コードをデバッグして、クラスを検査するたびにデバッガーでデータベースのフェッチを実行したいですか? あなたのコードの将来のメンテナーに優しくして、そうしないでください。

また、この質問はFramework Design Guidelinesで広く議論されています。コピーを取ることを検討してください。

于 2009-05-19T18:45:02.060 に答える
3

プロパティアクセサーで読み取られたデータベースは問題ありません-それが実際に遅延読み込みの要点です。最も重要なことは、クラスのユーザーがそのプロパティにアクセスするときにパフォーマンスが低下する可能性があることを理解できるように、それを適切に文書化することだと思います。

于 2009-05-19T15:40:37.130 に答える
3

やりたいことは何でもできますが、API のコンシューマーを念頭に置いておく必要があります。アクセサーとミューテーター (ゲッターとセッター) は非常に軽量であることが期待されます。その期待により、API を使用する開発者は、これらのプロパティに対して頻繁におしゃべりな呼び出しを行う可能性があります。実装で外部リソースを消費している場合、予期しないボトルネックが発生する可能性があります。

一貫性を保つために、パブリック API の規則に従うことをお勧めします。実装がもっぱら非公開である場合、おそらく問題はありません (問題を非公開で解決する方法と公開で解決する方法に一貫性がないことを除けば)。

于 2009-05-19T15:41:11.953 に答える
3

実行に時間がかかるプロパティアクセサーを作成しないことは、単なる「良い習慣」です。これは、プロパティが呼び出し元のフィールドのように見えるため、呼び出し元 (API のユーザー) は通常、「return smth;」以上のものはないと想定しているためです。

舞台裏で何らかの「アクション」が本当に必要な場合は、そのためのメソッドを作成することを検討してください...

于 2009-05-19T15:41:57.443 に答える
1

プロパティ ゲッターでのデータベース アクセスは問題ありませんが、値をキャッシュすることで、データベースがヒットする回数を制限するようにしてください。

パフォーマンスを考えずにループでプロパティを使用することが多いため、この使用を予測する必要があります。プログラマーは、プロパティを何度も使用するときに、常にその値を保存するとは限りません。

データベースから返された値をプライベート変数にキャッシュします (このデータに対して実行可能な場合)。このようにして、アクセスは通常非常に高速です。

于 2009-05-19T15:50:08.083 に答える
1

XML ドキュメントを提供して、インテリセンスがオブジェクトのコンシューマーに自分自身が何を取得しているかを通知する限り、問題が何であるかはわかりません。

これは、正解がない状況の 1 つだと思います。私のモットーは「常に言うことはほとんど常に間違っている」です。大まかな一般化に関係なく、特定の状況で最も意味のあることを行う必要があります。

于 2009-05-19T15:40:55.150 に答える
0

これはあなたの質問とは直接関係ありませんが、更新パラメータと組み合わせてロード ワンス アプローチを使用することを検討しましたか?

class Example
    {
        private bool userNameLoaded = false;
        private string userName = "";
        public string UserName(bool refresh)
        {
            userNameLoaded = !refresh;   
            return UserName();
        }
        public string UserName()
        {
            if (!userNameLoaded)
            {
                /*
                userName=SomeDBMethod();
                */
                userNameLoaded = true;                    
            }
            return userName;         
        }
    }
于 2009-05-26T21:42:58.207 に答える