【问题标题】:Program feedback: named loop index and reference to constant data程序反馈:命名循环索引和对常量数据的引用
【发布时间】:2014-06-27 05:37:15
【问题描述】:

我有一个班级作业,老师在很多我同意的事情上都扣了分,但其中一些我不太确定。

“我不喜欢像 i 这样命名变量,而实际上计数器代表一个真实的东西,一个端口号:”

“最好叫它portNum之类的东西。”

响应以下几行:

for(int i = 1; i <= boat.getLastPort(); ++i){
    boat.load();
    boat.move(i);
    boat.unload();
}

我的第一个问题是,这是合理的建议,还是不值得?我很少看到命名循环变量。我认为大多数人会立即知道在这种情况下发生了什么(在程序其余部分的上下文中)。


第二次也是最后一次反馈:

"首先,方法名需要以小写字母开头,而不是大写。这是OOP中非常强的约定。但更糟糕的是,没有理由通过引用传入范围值。请求的值是返回,这就是方法通常如何相互协作。” --- “...没有程序想要调用类方法并通过引用传递任何内容:您永远不会信任具有程序变量的类。在方法中使用按值传递。”

此引用引用此成员函数:

int FerryBoat::Rand(const int& range)
{
    return rand() % (range+1);
}

分配需要成员函数,否则我会在类之外创建一个宏来执行它。说明没有指定名称,所以我只是在库函数之后命名它,但我想我应该随机命名它,这样它就不会有一个大写的第一个字母。

无论如何我的第二个问题是:
如果一个函数引用了 const 数据(const 变量听起来很矛盾),你为什么不相信它呢?就不能因为 constness 而改变数据吗?

【问题讨论】:

  • 通过 const 引用传递可以为您节省一份副本,这对于大型对象很重要。对于像 intdouble 这样的小输入参数,约定是按值传递,因为通过引用传递没有任何好处。
  • 虽然我不同意老师关于 OOP 通常需要特定约定的观点,但我仍然认为如果程序员偏离特定约定,可以扣分。如果团队中的一名程序员使用不同的约定,那真的很烦人。

标签: c++ c class coding-style


【解决方案1】:

我会接受它并继续前进:-) 即使你的老师是边缘精神病,你的工作就是通过。离开学校后,您可以按照自己的指导方针(当然要遵守公司规章制度)更好。

我必须同意第一个观点,因为boat.move(portNum)boat.move(i) 传达了更多信息。

boat.moveTo(portNum) 甚至 boat.moveToPortNumber(i) 会更好。

如果这三行全部存在,可能不会不好,但即使对于那个小样本,“正确”地做也不会花费太多。考虑到人们花在维护代码上的时间,代码的可读性越高越好。

第二个,我认为你的老师专注于错误的事情。不是它是否会损坏,而是通过引用传递 int 绝对没有意义也没有优势,除非您在函数中对其进行修改。

引用在 C++ 中很好,可以避免在必须模拟指针传递引用时遇到的 C 问题,并最大限度地减少大型结构的复制。事实上,我希望 ISO 将它们添加到下一次迭代中。但是,如果它是一个复制成本低的变量(例如 int),并且您不想更改该变量并将其反映给调用者,那么引用就是浪费时间。

我非常不同意方法名称​​需要以小写字母开头。虽然这是一个常见的约定(我自己实际使用的),但它不是 OOP 的要求。代码不会突然变得不那么面向对象,因为您的方法被称为 IsTeacherLoony() 而不是 isTeacherLoony()

【讨论】:

  • 感谢您的建议,我想我发布的他所说的这两件事中的大部分都是值得的。为了给他一些信任,我觉得没有必要询问关于该任务的许多其他反馈。主要功能几乎就是那个循环,就像我在返回之前发布的另一件事一样。直到今天我才意识到对本机 int 的引用的大小完全相同。默认情况下,我只是通过引用传递给 const,除非我需要更改传递的变量或其副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2020-11-20
相关资源
最近更新 更多