「数学」関数は数学表記に従うべきですか?


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
また、コーディング自体に費やすよりも、変数に名前を付ける方法について考えるのに時間をかけることはありますか?;-)
トマス

1
2番目の選択肢は問題ないと思います。ただし、変数はコメントで説明します。
ジョルジオ

誰かが全員の答えを通り抜けて投票するのにふさわしいと思われたようです。この人はそうする理由を共有したいと思いますか?答えは私にとって完全に合理的であるように思われました。

技術的には、これは「数学的な」表記法とは関係なく、物理学者が考えることと関係があります。ここで行われているのは算術だけです。
-duffymo

2
私は華氏で温度を通過するすべてのアメリカ人を見ることができます。温度のタイプとしてdoubleを使用することは絶対にありません。おそらくプレッシャーについても同じことが言えます。名前よりも型を安全にすることに興味があると思います。
マーティンヨーク

回答:


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

これは、情報を含めないよりも確かに優れていますが、現時点では、関数でこれらの名前を使用する方が簡単だと思われます。私は文字を使用して多くのユーティリティを見ていません
...-Patrick87

@dsmicha:はい、PV = nRTは非常に基本的な例です。現実の世界では、一般に知られておらず、長く複雑になる傾向がある、より複雑な関数が存在します。そのため、たとえその人がフィールドで訓練されていても、まったく異質な機能に出くわす可能性は十分にあります。

4
@ Patrick87:私は手紙が好きです。なぜなら、それは元の形式にずっと近いので、それが(または記憶から)出てきた紙を見ることによって、表現の信ver性を素早く確認できるからです。

2
+1。これが最善の方法です。かなり初歩的な物理方程式でさえ、ギリシャ文字、根、偏微分、演算子(ラプラス、ハミルトン)、ベクトル、テンソルなどを使用することがあるため、一般的に方程式を読みやすく表現することはできません。可能な限り標準の変数名/略語(たとえば、標準の変数名でGAS_CONSTANTはありません。私が知っているすべての教科書)に固執しR、コメントで簡単に説明するのが最善です。
ジョナスプラッカ

7

それをそこに投げるだけで、別のオプションがあります:

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

これは、F#が測定単位で行うことと多少似ており、不注意で圧力を温度に置き換えるなどの問題を回避できるという利点があります。署名が(double、double、double)のような場合、どの引数がどこに行くべきかを目で確認するのは難しい


明確にするために、そのような次元分析を実行できる言語はありますか?つまり、例えば、圧力と体積の間の積をエネルギーの単位に割り当てることができることを知っていますか?
リンデロフ

はい、F#はこれを測定単位で行います。msdn.microsoft.com/en-us/library/dd233243.aspx
Mathias

ユニット間の自動変換をサポートしていなくても、Moneyクラスなどの特定のユニットに専用のタイプを定義すると便利な場合があります。不注意による変数の割り当てと変換のミスを制限し、リファクタリングを支援します。
マティアス

これは、C ++テンプレートを使用して非常に堅牢に行うことができます。
ケビンクライン

@lindelof:あなたがC ++でこの機能の一部を実現することができますtypedef
ヤコブ

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;
}

言い換えれば、コメント内のコードの意味を英語で説明します(数学;コメントです。必要に応じて拡張できます)が、説明的な変数名を使用して、コードを読んでいる人でも理解できるようにしますそれは簡単です-特に大きな関数では。変数名として実際の単語を使用するもう1つの理由は、関数宣言をヘッダーファイルにコピーする必要がある場合、インターフェイスがはるかに明確になることです。


2
さらに、式について説明しているインターネット上のどこかへのリンク(例:en.wikipedia.org/wiki/Ideal_gas_law)を含めると良いでしょう。
クリスシャファー

これは非常に素晴らしいアプローチですが、少し面倒です。Wikipediaへのリンク(この場合は理想的なガスの法則)を参照したいだけかもしれません。
Patrick87

3

私見では、機能が非常にドメイン固有である場合は、作業している問題のあるドメインの確立された表記を使用することを常にお勧めします。問題のあるドメインを理解していない人は、コードを正常に維持する機会がありません。ドメインに精通している人にとっては、長い名前はただのノイズであり、あなたのためのタイピングが増えます。

OTHO、私は従来の数学表記がもっと冗長で記述的であることを望みますが、数学コードは数学の慣習に従うべきだと思います。

編集:この答えは、数式を数学的に記述するときに表記法に非常に強い規則がある場合にのみ適用されます。存在しない場合、読者がドメインに精通していると仮定しても、変数がコメントで何を表すかを説明する必要がある場合は、より説明的な慣習の側で間違いを犯すのが最善です。


2

純粋な意見ですが、常に一文字の記号よりも言葉を使用します。言葉を使うと、誰もが理解するでしょう。シンボルを使用する場合、主題の専門家のみがフォローすることが保証されます。それでも、同じ物理量に対して異なる記号を使用する人もいます。長い名前を使用しても、失うものは何もありません。


2

懸念事項は明快さ、次に正確さ(正しくないが、明確なコードは簡単に修正できる)でなければならないため、汎用コーダーによる保守性のために、可能な限り関数を作成する必要があります。関数ヘッダーのコメントは、式とその使用法を説明し、入力/出力パラメーターを記述する必要があります。その後、関数の本文がどのようにレイアウトされるかは、ヘッダーのコメントと一致している限り、重要ではありません。

(これは議論ではないことを知っていますが、私の個人的な好みは変数に明示的な名前を付けることですが、この場合は「純粋な」関数であるため、1行で十分です。同じパラメータで呼び出しても同じ結果が得られます常に結果が得られるため、説明が必要な状態関連の複雑さはありません)

  • 次元分析をサポートする他の言語については、これはテンプレートを使用したC ++などで実装でき、Boost Unitsライブラリはこのアプローチを使用すると考えています。

1

コードがビジネスレイヤーからどの程度「離れている」かによって異なります...コードがスタックに戻ってくると、抽象数学関数が実装されることをよりターゲットにすればするほど、一般に受け入れられているものをエミュレートしようとします。数学表記と命名規則..フロントエンドまたはビジネスレイヤに近づくほど、問題領域で確立された規則に準拠するようになります。


1

私はこのように考えるのが好きです- 数学者は短い変数で誤解し、物理学者はそれに続きました。なぜ彼らの間違いを繰り返すのですか?長い名前の方がわかりやすく、混乱が少ないことがわかっているため、改善に固執します。軽いメモでは、私は時々、より長い変数を私の数学に忍び込ませようとします。


あなたつもり愛この ...

0

プログラミング方程式の正しい形式は、6か月間見なかった後でも理解できる形式です。

戻ってきたら:

n*R*T/P;

そして、あなたは何が起こっているかを認識し、それでおそらく大丈夫です。一般的に、高度な数式のために私は文句を言わない、私は積極的にそれを使用していない限り、各部分が何だったか覚えています。私のために:

n_moles * BOLTZMANN_CONSTANT * temperature / pressure;

特に方程式がそのまま書かれている理由が必ずしもわからない場合でも、各部分を簡単に理解できるため、特に優れた方程式形式です。


あなたはenergy_in_joules = mass_in_kilograms *捕虜(speed_of_light_in_vacumm_in_metres-per_second、2)を考えると、E = MC ^ 2よりも簡単です
マーティンベケット

@Martin Beckett、私が投稿したものを実際に読んだのですか?「一般的に高度なformlasのために私は文句を言わない、私は積極的にそれを使用していない限り、各部分が何だったか覚えています。」私は自分自身を公の知識に押し込めた方程式を忘れるとは言いませんでした。E=m*(c^2)私のようなケースでは、6ヶ月でそれ理解します。
zzzzBov

よく知られている古典的な方程式の場合、人々がそれを見つけることができるように、通常の表記法を使用することをお勧めします。でも、ドメインで使用者をいただきました!その場合、変数のシータまたはファイ命名の範囲に
マーティンベケット

-1

コインを投げます。

また、コーディング自体に費やすよりも、変数に名前を付ける方法について考えるのに時間をかけることはありますか?


6
はい。通常、コードをコーディングするよりもコードの設計により多くの時間を費やします。それは、問題を理解し、物事を適切に命名することから始まります。
マティアス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.