“数学”函数应该遵循数学符号吗?


11

我想这个问题将立即被标记为主观的,但是您认为哪个更好:

double volume(double pressure, double n_moles, double temperature) {
  return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

要么

double volume(double P, double n, double T) {
  return n*R*T/P;
}

换句话说,实现某些方程式的函数应该遵循该方程式的符号,还是应该使用更多详细的名称?


3
与编码本身相比,有时您还花费更多的时间在思考如何命名变量上吗?;-)
Tomas

1
我认为第二种选择是可以的。我会在评论中解释这些变量。
乔治

似乎有人认为适合并否决每个人的答案。此人是否愿意分享这样做的理由?答案对我来说似乎完全合理。

从技术上讲,这与“数学”表示法无关,而与物理学家的想法无关。这里只不过是算术而已。
duffymo 2011年

2
我可以看到所有美国人在华氏温度上都超过了温度。我绝对不会将double用作温度类型。同样的压力。我想我会比名称更感兴趣于确保类型的安全。
马丁·约克

Answers:


14

取决于谁正在阅读。如果您可以确保永远,下一个读取您的代码的程序员也熟悉热力学,那么可以,请使用截断的版本。

我的个人风格是使用此类变量(其缩写在本领域中是众所周知的),但要在注释中包含其描述。

/* P : Pressure
   V : Volume
   n : Number of moles
   R : Boltzmann constant
   T : Temperature (in K)
*/
double compute_V(double P, double n, double T) {
  return n*R*T/P;
}

5
重点是什么?不管变量名是什么,不了解热力学的人都无法成功维护代码。
dsimcha 2011年

这肯定比不包含信息要好,但是在这一点上,似乎仅在函数中使用这些名称会更容易。我在使用字母时没有看到很多实用工具……
Patrick87,2011年

@dsmicha:是的,PV = nRT是一个非常基本的示例。在现实世界中,存在着更为复杂的功能,这些功能通常并不为人所知,并且往往是冗长而复杂的。因此,即使该人在现场受过训练,他/她也很有可能会遇到完全陌生的功能。

4
@ Patrick87:我更喜欢字母,因为我可以通过查看来自(或来自记忆)的纸张来快速检查该表达的准确性,因为它离原始形式很近。

2
+1。这是最好的方法。即使是相当基本的物理方程式,也可能使用希腊字母,词根,偏导数,算子(Laplace,Hamilton),向量,张量等,因此通常无法在注释中清晰地表示该方程式。坚持使用尽可能标准的变量名/缩写(例如GAS_CONSTANT不是标准变量名;我所知道的每本教科书都R用于此),并在注释中简短地说明它们是可以做的最好的事情。
乔纳斯·普拉卡

7

只是将它扔在那里,您还有另一个选择:

Volume ComputeVolume(Pressure p, Moles m, Temperature t) { ... }

这在某种程度上类似于F#对度量单位所做的操作,并且具有避免诸如无意间用温度代替压力之类的问题的好处。当签名是(双精度,双精度,双精度)时,很难去理会哪些参数


为了明确起见,是否存在可以进行这种维分析的语言?是否知道例如可以将压力和体积之间的乘积分配给一个能量单位?
lindelof

是的,F#使用计量单位来执行此操作。msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias

即使不支持单元之间的自动转换,为某些单元(例如Money类)定义专用类型也是有益的。它限制了意外的变量分配和转换错误,并有助于重构。
Mathias

使用C ++模板可以非常强大地完成此操作。
凯文·克莱恩

@lindelof:您可以使用C ++实现其中一些功能typedef
Jacob

7

我更喜欢这样:

/* This function calculates volume using the following formula:
 *
 *     n * R * T
 * v = ---------
 *         P
 */
double volume(double pressure, double n_moles, double temperature) {
    return n_moles * BOLTZMANN_CONSTANT * temperature / pressure;
}

换句话说,用英语(和数学;它是注释,您可以根据需要对其进行扩展)在注释中解释代码的含义,但是请使用描述性的变量名,以便仅阅读唯一代码的任何人都能够理解它很容易-尤其是具有较大功能时。我将实词用作变量名的另一个原因是,如果您需要将函数声明复制到头文件中,则接口会更加清晰。


2
另外,在评论中添加一个到互联网上谈论该公式的地方的链接(例如:en.wikipedia.org/wiki/Ideal_gas_law)将是很好的选择。
克里斯·谢弗

这是一个非常好的方法,但是有点混乱。我可能更喜欢仅看到Wikipedia的链接,该链接描述了理想的气体定律(在这种情况下)。
Patrick87

3

恕我直言,如果该功能是特定于领域的,则最好使用正在处理的问题域的已建立符号。不了解问题域的人无论如何都无法成功维护您的代码,对于熟悉域的人来说,长名称只会带来噪音,还会给您带来更多输入。

OTHO,我要说的是,我希望传统的数学符号有时更冗长和更具描述性,但是无论我认为数学代码应该遵循数学惯例。

编辑:仅当在数学上编写公式时在符号上有非常强的约定时,此答案才适用。如果没有一个,并且即使假设读者熟悉该域,您也必须解释变量在注释中所代表的含义,那么最好是在描述性更强的惯例上犯错。


2

纯粹的意见,但请始终在单字母符号上使用单词。如果您使用语言,每个人都会理解;如果您使用符号,则只能保证是主题专家。即使那样,有些人对于相同的物理量也使用不同的符号。使用较长的名称,不会有任何损失。


2

您应该关注的是清晰度,然后是正确性(不正确,但容易纠正清晰的代码),因此,应尽可能地由通用编码器编写您的函数,以确保可维护性。函数标题注释应解释公式及其用法,并描述输入/输出参数。此后,只要与标题注释保持一致,函数主体的布局就不会太在意。

(我知道这不是讨论,但是-我个人倾向于为变量赋予明确的名称,尽管在这种情况下,单行代码就足够了,因为它是“纯”函数;具有相同参数的调用会产生相同的结果总是得到结果,因此应该没有与状态相关的复杂性需要解释)

  • 如果其他语言支持维度分析,则可以在带有模板的C ++中实现,Boost Units库使用这种方法。

1

取决于代码离业务层有多“远”。代码位于堆栈的最远处,它对实现抽象数学函数的目标越有针对性,我将尝试模仿更多的被普遍接受的方法matehmatical符号和命名约定。离前端或业务层越近,我越符合问题域中建立的约定。


1

我喜欢这样想- 数学家用短变量弄错了,物理学家也效仿了。为什么要重复他们的错误?我们现在知道,较长的名称更具描述性,并且不会造成混淆,因此请坚持改进。轻松一点,有时我会尝试将更长的变量潜入我的数学中,每个人都为此感到震惊。


您将爱上这个 ……

0

编程方程式的正确格式是您六个月没有看到它仍然可以理解的格式。

如果您回到:

n*R*T/P;

而且您知道发生了什么事,那就没问题了。通常用于先进配方我不会记住每一个部分是,除非我主动使用它。为了我:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

是一种更好的方程式格式,特别是因为即使我不必知道为什么按原样编写方程式,我也可以轻松理解每个部分。


您认为energy_in_joules = mass_in_kilograms * pow(speed_of_light_in_vacumm_in_metres-per_second,2)比E = mc ^ 2容易
马丁·贝克特

@马丁·贝克特(Martin Beckett),您实际上阅读了我发布的内容吗?“通常用于先进formlas我不会记住每一个部分是,除非我主动使用它。” 我并不是说我会忘记那些成功将自己推向公众知识的方程式。在某些情况下,E=m*(c^2)在六个月内理解。
zzzzBov 2011年

对于众所周知的经典方程式,最好使用法线符号,以便人们可以发现它。如果在域中使用变量,即使在命名变量theta或phi的程度上,也是如此
Martin Beckett

-1

扔硬币。

与编码本身相比,有时您还花费更多的时间在思考如何命名变量上吗?


6
是的,与设计代码相比,我通常花更多的时间来设计代码,而这首先要了解问题并正确命名。
Mathias
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.