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...
    }

注意:样板代码是代码生成的,包括“使用(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]
    }

我希望执行标量和样板代码进入扩展方法。

对于我上面的代码,它是否需要代码重构/信息隐藏?我的重构操作看起来太不透明了吗?

4

4 回答 4

2

如果你的新单行代码替换了程序中许多地方的几行代码,我会说你的重构非常好。特别是因为所有这些地方的功能都是相同的。

追随你并查看你的代码的程序员只会查看扩展方法的定义以找出它的作用,现在他知道这段代码是在一个地方定义的,所以它不可能与地方不同放置。

于 2009-06-19T03:53:18.520 回答
1

如果你必须尝试,但我的感觉不是简洁,而是你是否每次或大部分时间都想强制执行该行为。并且通过扩展,如果验证条件发生变化,它可能会全面改变。

基本上,减少一小部分样板代码并不一定会让事情变得更简洁。这只是开发人员必须经历和理解的又一点抽象。

作为开发人员,我不知道“ExecuteWithVerify”是什么意思。我们到底在验证什么?我必须查一下并记住它。但是通过样板代码,我可以查看代码并准确了解发生了什么。

通过不将其简化为单独的方法,我还可以针对需要针对不同条件引发异常的情况调整样板代码。

于 2009-06-19T04:17:21.037 回答
0

当您提取或重构代码时,它不会隐藏信息。只有在重构后开始限制对扩展定义的访问时,它才会隐藏信息。

于 2009-06-19T04:07:05.200 回答
-1

应不惜一切代价避免类中的“新”运算符(构造函数除外)。这就是您需要在这里重构的内容。

于 2009-11-21T18:20:08.493 回答