gpt4 book ai didi

c# - 您是否使用(裸)C# 代码块?

转载 作者:行者123 更新时间:2023-11-30 19:22:42 25 4
gpt4 key购买 nike

我使用 C# 编程已经...有一段时间了。我最近编写了一个例程,我突然想到这是我第一次(我记得)我故意使用裸代码块(即没有前面的控制流语句)。代码看起来像这样:

//...

var output = source.GetRawOutput();

{
var fooItems = FooSource.GetItems();

output = TransformA.TransformOutput(output, p =>
{
GetFooContent(p, fooItems.GetNext());
});
}

{
var barItems = BarSource.GetItems();

output = TransformB.TransformOutput(output, p =>
{
GetBarContent(p, barItems.GetNext());
});
}

return output;

我以这种方式构建代码主要是为了进行健全性检查,以确保我不会意外引用错误的变量(即混淆 barItems 和 fooItems)。我还发现代码更具可读性。我当然可以将代码分解为三个单独的方法,但我觉得在这种情况下有点矫枉过正。

您是否在代码中使用裸代码块?为什么或为什么不?

最佳答案

如果您查看您的代码,就会发现这两个 block 非常相似。我敢打赌它们可以重构为一个 block 。

虽然这听起来不像是答案,但确实如此。我认为,一般来说,如果您希望像这样使用大括号,那么您正在处理的情况可以通过分解出另一种方法或一起重构来更好地处理。

总的来说。

具体答案——不,一旦我擅长 OO 并限制我在单个单元中所做的工作量,我从未认为它们可能是个好主意。

编辑:对于类似的代码,它必须相当容易重构。我会尝试重构。抱歉,如果我的语法有误,我真的不会使用 C#,Java 也没有闭包。

output = transform(FooSource, TransformA);
output = transform(BarSource, TransformB); // I know output is overwritten, but
// it is in the askers' example as well

transform(var itmSource, var transform) {
var output=source.GetRawOutput(); // Sorry, you never said where source came from.

var items = itmSource.GetItems();
output=transform.TransformOutput(output, p =>
{
GetContent(p, items.GetNext()); // GetContent may need to be passed in
// you didn't say where those calls came from.
// See comments below
});
}
return output;
}

像这样的重构并没有节省太多的输入,但它们显示了一些很好的模式——比如 FooSource 和 TransformA 之间的关系(可能还有 getContent 调用)——它们很有可能应该存储在单个对象和该对象应该传入,或类似的东西。 (很难从这个片段中分辨出来,通常重构需要比你提供的更广泛的代码 View )

请注意,它们还迫使您考虑 GetFooContent 和 GetBarContent。我敢和你打赌,它们是如此相似,以至于可以将它们分解为带有一个或两个传入变量的单个方法调用,或者分解为两个同级类中的一个方法。

由于这种关系总是会出现,并且总是会改进您类(class)中的其他代码,所以我相信这种重构绝对是强制性的,进行这种重构比任何事情都更能教会我真正的 OO。

关于c# - 您是否使用(裸)C# 代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/683959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com