如果我有一个方法可以执行多个相关的事情,那么将这个方法所做的每个“事物”粘贴到一个单独的块中是不错的做法?
实施例
{
int var
//Code
}
{
int var
//More Code
}
这有助于减少局部变量的数量,并使代码更具可读性,但我不确定这是不是一个好主意。
答案 0 :(得分:15)
如果你的函数做了很多冗长的事情,你会考虑将这些东西分成像这样的块,那么你应该将函数分成多个较小的函数。
当然,引入新范围块的情况很有用。例如,如果使用某种scoped_lock
来锁定互斥锁或其他同步对象,则可以通过引入范围块来确保只在必要时保持锁定。
答案 1 :(得分:4)
Kent Beck的实施模式在这个主题上有一个非常好的章节。拆分成块将有助于重构为单独的函数。
例如像
这样的东西void process() {
//code for input
//code for increments /tally
//code to populate objects and output
}
将成为
void process() {
input();
tally();
output();
}
答案 2 :(得分:3)
在面对这个问题时,我要做的第一件事就是考虑重构以将功能分解为更小的更具凝聚力的功能。
最终虽然它归结为可读性,但如果确定代码的范围使它更具可读性,那么它可能是一个好主意。如果另一方面它会让人们看到你的代码,那么你应该避免使用它。
答案 3 :(得分:3)
如果你有一个方法可以做多个相关的事情,我会说它违反了单一责任原则。 SRP指的是对象,但我喜欢将相同的思维应用于方法和函数。将方法所做的每个“事物”粘贴到单独的方法(可能是私有的或受保护的)中并将它们包装在当前方法中是一种好习惯。请参阅Extract Method重构。
您可以采取任何措施使您的代码更具可读性是一个好主意!执行一件事的较小函数比执行许多操作的长函数更具可读性。它们也更容易重复使用。
答案 4 :(得分:0)
嗯,尽可能多地限制变量的范围当然是好的做法。它们不太可能被不必要地重复使用,并且当你声明它们时,你更有可能定义它们,这避免了由于未定义的变量等引起的错误。还有很多情况下,你有一个对象,它在构造时和它被破坏时做了一些事情,并且你想要调整范围(例如,MFC中的小时玻璃在其对象存在时显示,并在MFC中被销毁时消失) ;用于锁定和解锁互斥锁的对象是另一个很好的例子),在这种情况下,使用大括号对变量进行范围限定是很有意义的。因此,在很多情况下,创建专门用于范围变量的代码块是很有意义的。
但是,这样做有很多问题。
如果函数中有很多代码块,可能会很难读取。
如果你努力将变量尽可能紧密地限制,你就会遇到必须声明变量的问题,这些变量需要比你原来需要更大的范围,并且在声明它们时并不总是能够定义它们。
功能通常表达你想做的更好。
因此,使用额外的大括号来调整范围变量可能是一种很好的做法(尽可能合理地减少变量的范围),但在许多情况下,将代码分解为多个函数要好得多。当您命名函数而不是任意代码块时,代码可以更容易理解。因此,如果您希望在函数中声明很多单独的代码块,请考虑将其分解为多个函数 - 如果每个块都直接位于函数内而不是进一步嵌套。那么,
的案例T func(...)
{
{
...
}
{
...
}
}
可能会比单独的块更好地分解为多个功能。
有时候,单独的块可能是好的和有用的,但通常单独的功能会更好。