1

どのくらいの情報隠蔽が必要ですか?レコードを削除する前にボイラープレートコードがあります。次のようになります。

    public override void OrderProcessing_Delete(Dictionary<string, object> pkColumns)
    {
        var c = Connect();


        using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c)
            { Parameters = { {"_order_id", pkColumns["order_id"]} } } )
        {
            var count = (long)cmd.ExecuteScalar();

            // deletion's boilerplate code...
            if (count == 0) throw new RecordNotFoundException();
            else if (count > 1) throw new DatabaseStructureChangedException();
            // ...boiler plate code
        }



        // deleting of table(s) goes here...
    }

注:ボイラープレートコードは、「using(var cmd = new NpgsqlCommand(...)」を含むコード生成されます。

しかし、ボイラープレートコードをリファクタリングすることを真剣に考えています。もっと簡潔なコードが欲しかったのです。これは私がコードをリファクタリングすることを想像する方法です(拡張メソッドでより良くなりました(唯一の理由ではありません;))

    using (var cmd = new NpgsqlCommand("SELECT COUNT(*) FROM orders WHERE order_id = :_order_id", c)
        { Parameters = { {"_order_id", pkColumns["order_id"]} } } )
    {
              cmd.VerifyDeletion(); // [EDIT: was ExecuteWithVerification before]
    }

executecalarとボイラープレートコードをextensionメソッドの中に入れたかったのです。

上記の私のコードでは、コードのリファクタリング/情報の隠蔽が保証されていますか?リファクタリングされた操作が不透明すぎませんか?

4

4 に答える 4

2

あなたのリファクタリングは非常に優れていると言えます。新しい 1 行のコードが、プログラムの多くの場所で数行のコードを置き換える場合です。特に、これらすべての場所で機能が同じになるためです。

あなたの後を追ってあなたのコードを見ているプログラマーは、単に拡張メソッドの定義を見て、それが何をするかを調べます。そして今、彼はこのコードが 1 つの場所で定義されていることを知っているので、場所と異なる可能性はありません。場所へ。

于 2009-06-19T03:53:18.520 に答える
1

必要に応じて試してみてください。ただし、簡潔さではなく、毎回またはほとんどの場合に動作を強制するかどうかが重要だと私は感じています。さらに、検証条件が変更された場合、全体的に変更される可能性があります。

基本的に、定型コードの小さなチャンクを削減しても、物事がより簡潔になるとは限りません。これは、開発者が苦労して理解しなければならないもう 1 つの抽象性です。

開発者として、「ExecuteWithVerify」が何を意味するのかわかりません。私たちは正確に何を検証していますか?調べて覚えればいいのに。しかし、ボイラープレート コードを使用すると、コードを見て、何が起こっているのかを正確に理解できます。

また、別のメソッドに削減しないことで、さまざまな条件で例外をスローする必要がある場合に備えて定型コードを調整することもできます。

于 2009-06-19T04:17:21.037 に答える
0

コードを抽出またはリファクタリングするときに情報が隠されることはありません。リファクタリング後に拡張機能定義へのアクセスを制限し始めると、情報が隠蔽されるだけです。

于 2009-06-19T04:07:05.200 に答える
-1

クラス内の「新しい」演算子 (コンストラクターを除く) は、何としてでも避ける必要があります。これは、ここでリファクタリングする必要があるものです。

于 2009-11-21T18:20:08.493 に答える