xob*_*vap 6 memory memory-management function semantics
我在这里做了一些搜索,没有发现任何类似的东西,所以我要继续问问.这实际上更多地是关于语义而不是实际的编程问题.我目前正在用C++编写一些东西,但语言并不重要.
我很清楚,保持你的功能/方法尽可能短是一种很好的编程习惯.然而,你怎么知道函数是否太长?或者,是否有可能将功能分解得太多?
我学到的第一种编程语言(除了Applesoft BASIC,不算......)是6502汇编语言,速度和优化就是一切.如果一些循环计数会搞砸整个程序的时间,通常最好直接设置内存位置或寄存器,而不是跳转到另一个子程序.前一种操作可能需要3到4个周期,而后者可能需要两到三次.
虽然我意识到现在如果我甚至向某些程序员提及循环计数,他们只是给我一个空白的外观,这是一个很难打破的习惯.
具体来说,让我们说(再次使用C++)我们有一个私有类方法,如下所示:
int Foo::do_stuff(int x) {
this->x = x;
// various other operations on x
this->y = this->x;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到一些论据,至少,每组操作都应该是它自己的功能.例如,do_stuff()理论上应该被命名为set_x(int x),应该为在类成员x上执行的操作集编写一个单独的函数,并且应该编写第三个函数来分配类成员的最终值. x到班级成员y.但我已经看到其他论点,即每个操作都应该有自己的功能.
对我来说,这似乎是错误的.我再一次从内部角度看问题; 每个方法调用都在推送堆栈上的地址,执行其操作,然后从子例程返回.对于相对简单的事情来说,这似乎是一个很大的开销.
对于这类事情是否有最佳实践,还是更多地取决于个人判断?
自从6502汇编以来,发生了两件事:计算机变得更快,编译器(在适当的情况下)变得更聪明.
现在的建议是停止花费你所有的时间来担心个别周期,直到你确定这是一个问题.你可以更明智地度过那段时间.如果你向我提及周期盘点,我不会茫然地看着你,因为我不知道它们是什么.我会看着你想知道你是否在浪费你的努力.
相反,开始考虑让你的功能小到足以:
如果稍后您发现某些代码运行速度不够快,请考虑如何优化它.
注意:优化可能是提示编译器内联移动函数,因此您仍然可以获得上述优势,而不会影响性能.
决定在哪里分解函数最重要的不一定是函数的功能.而是确定您的类的API.
假设我们突破Foo::do_stuff到Foo::set_x,Foo::twiddle_x和Foo::set_y.单独进行这些操作是否有意义?如果我在x没有先设定它的情况下旋转,会发生什么不好的事 我可以set_y不打电话打电话set_x吗?通过将它们分解为单独的方法,甚至是同一类中的私有方法,您暗示它们至少是潜在的单独操作.
如果情况并非如此,那么一定要将它们保存在一个函数中.