需要隐藏多少信息?在删除记录之前我有样板代码,它看起来像这样:
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]
}
我希望执行标量和样板代码进入扩展方法。
对于我上面的代码,它是否保证代码重构/信息隐藏?我的重构操作看起来太不透明吗?
答案 0 :(得分:2)
如果您的新单行代码替换程序中许多地方的少量代码行,我会说您的重构非常好。特别是因为所有这些地方的功能都是一样的。
程序员跟着你并查看你的代码只会查看扩展方法的定义以找出它的作用,现在他知道这个代码是在一个地方定义的,所以没有它的可能性不同地方不同。
答案 1 :(得分:1)
如果必须的话,尝试一下,但我的感觉是,它不是关于简洁性,而是你是否想要每次或大部分时间<强烈>强制行为。而且,如果验证条件发生变化,它可能会全面改变。
基本上,减少一小部分锅炉板代码并不一定能让事情变得更加简洁;它只是开发人员必须汲取和理解的一点抽象性。
作为开发人员,我不知道“ExecuteWithVerify”的含义。我们到底在做什么验证?我得查阅并记住它。但是通过样板代码,我可以查看代码并准确了解发生了什么。
如果不将它简化为单独的方法,我也可以调整样板代码,以便在需要针对不同条件抛出异常的情况下进行调整。
答案 2 :(得分:0)
提取或重构代码时,不会隐藏信息。当您在重构后开始限制对扩展定义的访问时,它只是信息隐藏。
答案 3 :(得分:-1)