web-dev-qa-db-ja.com

プログラミング言語は設計上、「クリーンなコード」を強制できますか?

したがって、私は最初のプロジェクトをC++でコーディングしていますが、単に機能させるだけでなく、コードを「クリーン」にするための努力がさらに必要であるようです。つまりC++は醜いが機能するコードを「許可」するかのように見えます。

考えさせられた

プログラミング言語は意図的にクリーンなコードを強制できますか?そのような言語はすでにありますか?

また、これはプログラミング言語の開発/理論の設計原則としてどのように組み込まれていますか?どのような対策をとっていますか?

19
mavavilj

言語設計が「クリーンなコード」に与える主な効果は、構文レベルです。省略表現が多く、あいまいな演算子(Perl/APL)のある言語は「ダーティ」コードに適していますが、要素のセットが少ない言語(Pythonなど)は、よりクリーンなコードに適しています。

ただし、セマンティクスはまったく異なる動物です。言語のセマンティクスがクリーンな方法で使用されるように強制する方法はありません。特に、コンパイラーとして、言語のユーザーが何を達成しようとしているのかを知ることができないためです。強力なツールとは、単に、それが善または悪のための強力なツールです。

結局のところ、セマンティクスは構文よりも重要です。また、メンテナンス開発者として理解するのが最も難しい部分でもあります(たとえば、「このコードは実際に何を意味するのでしょうか?何をするのかわかります...」)。

したがって、クリーンなコードを強制する設計はないが、簡単な構文で簡単に記述できるクリーンなセマンティクスで記述できます。良くも悪くも、クリーンなコードは主に開発者の知識、動機、規律、スキルの問題です。

20
Michael

言語は、プログラマーにバグの特定のクラスへの対処を強制または奨励することができます。これは、クリーンなコードの定義の一部です。たとえば、さまざまな言語が比較的適切に対処しています。

  • ヌルポインター例外。
  • 共有状態のバグ。
  • 同時実行の問題。
  • 未チェックの例外。

ただし、クリーンなコードは主に人間と人間のコミュニケーションに関するものであるため、それだけで道の一部になります。プログラミング言語には、これを支援するためのレバーが1つしかありません。これが 表現力 です。これは定義するのが本当に難しい用語ですが、基本的には、優れたプログラマーがより表現力豊かな言語でよりクリーンなコードを書く方が簡単です。彼らは、他の人間とうまく通信できるようにアルゴリズムを簡単に表現するために利用できるより多くのツールを持っています。誤解しないでください。クリーンなコードは( ほぼ )の任意のプログラミング言語で記述できます。いくつかの言語はそれをより簡単にし、より良い相対的な結果をもたらします。

ただし、表現力を上げるだけでは、魔法のように人々はより良​​いコードを書き始めるでしょう。ほとんどのプログラマーは、言語を変えるためのより多くのノブを彼らに与えます、そして彼らはそれらを適切に使用する方法を知らないので、彼らのコードは実際にはより悪いものになります。コードの品質を向上させるには、規律と優れたメンターシップが必要です。銀の弾丸はありません。

7
Karl Bielefeldt

ある程度。多くの言語は、言語設計者の理想に従って、いくつかの形式のクリーンなコードを奨励するように意図的に設計されています。醜くて理解できないコードを任意の言語で書くことは確かに可能ですが、一部の言語はそれを思いとどまらせるための努力をしています。

例としてPythonは、言語のセマンティック構造に従ってブロックをインデントすることを強制しますが、他の多くの言語では、ランダムに、またはまったくインデントしないことを許可します。これは言語の例です清潔のある理想を積極的に奨励する。

6
JacquesB

それを定量化できれば、それを最適化できる言語を作成できます。

「クリーンコード」ポリシーを実際に適用する特定の言語については知りませんが、ビルド時に実行されるスタイル警官は非常に一般的です。

これが言語に組み込まれるのとは別のステップである主な理由は、主に優先順位の関数です。プログラマーが最も幅広いレベルの採用を実現できるように、柔軟性を最大限に高めることがプログラミング言語の最大の利益になります。非常に多くのさまざまなプログラミング言語とDSLがあり、どの入力が許可されるかについてうるさくて意見を述べることによってユーザーベースを人為的に制限することで、幅広い採用が妨げられる可能性があります。

たとえば、人々に書くように強制することはC#の最善の利益ではありません

if (condition)
{

の代わりに

if (condition) {

しかし、スタイルチェッカーは、それが彼らが行うように設計されているものであるため、うるさいと主張することができます

だから、質問に答えるために

できますプログラミング言語は意図的にクリーンなコードを強制しますか?

重点鉱山

もちろん、「クリーンなコード」の意味について強力な定義を提供する限り。

たとえば、「クリーンコード」を次のように定義します。

  • 行の長さは80文字以下
  • 100行以下で構成される関数
  • インデントは2つのスペースでなければなりません
  • 開き中かっこは、行の最後に正確に1つのスペースを付ける必要があります
  • 1行あたり2つ以下の演算子

また、これらの規則の一部またはすべてに同意しない場合もありますが、結局のところ、これらは定量化可能であり、プログラムで適用できます。

3
zzzzBov

いいえ、あなたが説明する意味ではありません。 「醜さ」の検出は自動的には行えません。

ただし、言語設計者は良いコードを奨励するために何かをすることができます(「安全」なコードも長くて「醜い」場合もあるので、「クリーン」とは言いたくありません)。たとえば、言語の設計者Rustは、規律のあるC++プログラマが行う傾向のあること(ヒープに割り当てられた値に単一の「所有者」を与えるなど)を見て、これには、特定の一般的な間違いを犯していないことを確認するために使用できるタイプチェッカーの提供が含まれます。

優れた言語設計はしばしば反応的であると私は言うでしょう:デザイナーは優れたプログラマーが何をするかを見て、それをより簡単で「きれい」にしようとします。

1
Paul Stansifer