web-dev-qa-db-ja.com

ローカル変数(たとえば、employeeCount、firstName)の最初のWordに小文字を使用する理由は何ですか

私はすべての変数に完全な適切な大文字小文字を使用しているため、他のプログラマーからかなりの批判を受けています。たとえば、一般的なプログラマは変数名にemployeeCountを使用しますが、私はEmployeeCountを使用しています。 everythingには、voidメソッド、returnメソッド、変数、プロパティ、定数など、完全な適切な大文字小文字を使用します。私はJavaScriptでこの慣例に従っています。最後の1つreallyは人々のジミーをざわめかせます。

この「非標準」の大文字と小文字の規則に従わない方がよい理由として挙げられている典型的な理由は、プロパティとvoidメソッドのために完全な適切なケースを予約する必要があるためです。値を返すローカル変数とメソッドは、最初のWordをint employeeCount = getEmployeeCount()のように小文字にする必要があります。

しかし、その理由はわかりません。

これに質問すると、標準であるの任意の回答が得られるようです。答えが何であれ、それは通常に要約されます。それはそれがそうである方法であり、私はそれを質問しません。私はそれに従います。任意の答えは私にとって十分ではありません。

Excel 97マクロをOffice IDEでプログラミングする初期の頃から、何かがローカル変数またはプロパティであるかどうかを通知するための大文字と小文字の規則は必要ありませんでした。これは、非常に直感的な命名規則を常に使用してきたためです。たとえば、GetNuggetCount()は、どこかに行ってすべてのナゲットの数を取得するメソッドを明確に示唆しています。 SetNuggetCount(x)は、ナゲットの数に新しい値を割り当てることを示唆しています。 NuggetCountは、それ自体が、単に値を保持しているプロパティまたはローカル変数を示唆しています。最後に、「ああ、それが問題だ。プロパティか変数か?WHICH IS IT ??」と言ったくなるかもしれない。それは本当に重要ですか?」

だから、これがtl; dr;です:変数またはreturnメソッドの最初のWordに小文字を使用する目的、論理的、任意ではない理由は何ですか?

編集: MainMaの場合

thisコードを解答の最初のコードサンプルに置き換え、引数がどれだけうまく機能するかを確認します。

public void ComputeMetrics()
{
    const int MaxSnapshots = 20;

    var Snapshots = this.LiveMeasurements.IsEnabled ?
        this.GrabSnapshots(MaxSnapshots, this.cache) :
        this.LoadFromMemoryStorage();

    if (!Snapshots.Any())
    {
        this.Report(LogMessage.SnapshotsAreEmpty);
        return;
    }

    var MeasurementCount = Measurements.Count();
    this.Chart.Initialize((count + 1) * 2);

    foreach (var s in Snapshots)
    {
        this.Chart.AppendSnapshot(s);
    }
}
21

その命名規則は、変数にその型と同じ名前を付けることができるようにしたい場合によく使用されます。例えば:

Employee employee;

一部の言語では、その大文字化を強制しています。これにより、MyEmployeeCurrentEmployeeEmployeeVarなどの煩わしい変数名を使用する必要がなくなります。大文字と小文字だけで、何かが型か変数かをいつでも確認できます。これにより、次のような状況での混乱を防ぐことができます。

employee.function(); // instance method
Employee.function(); // static method

また、英語では、名詞は通常大文字ではないので、大文字が「適切」であると実際に主張することはできません。

それで、それはあなたの状況と何が関係していますか?自分のコードを読み取るのに問題はないことは明らかですが、可能な限り一貫性を保つことにより、コードを読み取る必要がある他の人の精神的な作業負荷を軽減できます。書面と同じようにコーディングする場合、読者に合わせてスタイルを調整します。

89
Karl Bielefeldt

何もありません。それはほとんどの人が行うことなので、それが誰もが行うことなので、標準になりました。多くの文学がこの慣習に従っているので、人々は習慣を身につけました。

規約は、コード全体の一貫性ほど重要ではありません。すべてのものが一貫した方法で名前が付けられているので、それらを見て何が何であるかがわかるようになっている限り、最初の文字が大文字であるかどうかは問題ではありません。

あなたのやり方で書かれたコードに出くわすことは不愉快であり、私はそれが好きではないと言うでしょう。しかし、それはスタイルの問題です。

これを職場で行う場合は、チームのスタイルでコーディングして、どこでもコードの一貫性が保たれるようにすることをお勧めします。あなたのコードを他の人と違うものにするのではなく。

http://thecodelesscode.com/case/9​​4

34
Schleis

1.なぜ規格が存在するのですか?

結局のところ、個人の好みに応じて誰もがコードを記述できるようにして、どちらの標準が優れているかについて話すのをやめた方がいいのではないでしょうか。

実際、あるスタイルに慣れていると、別のスタイルを使用するコードを読み取ることが難しくなります。あなたの脳は、コードが何をするのかを理解する代わりに、(もしあれば)慣習を理解しようとすることにもっと多くの時間を費やします。

これら2つのコードの間で何がより読みやすくなりますか?

public void comp_metrics ()
{
  int Count;
  List<snapshot> measurements=fromMemoryStorage();
  if (_liveMeasurements.enabled)
    measurements = GrabSnapshots(20, _cache);
    if( !measurements.Any() ) {
        this.Report(LogMessage.Measurements_Are_Empty); return;
    }

    Count = measurements.Count ();

    this.Chart.initialize(( Count + 1 )*2);

    foreach(snapshot S in measurements) {
      this.Chart.append_Snapshot ( S );
    }
}

または:

public void ComputeMetrics()
{
    const int MaxSnapshots = 20;

    var snapshots = this.liveMeasurements.isEnabled ?
        this.GrabSnapshots(MaxSnapshots, this.cache) :
        this.LoadFromMemoryStorage();

    if (!snapshots.Any())
    {
        this.Report(LogMessage.SnapshotsAreEmpty);
        return;
    }

    var count = measurements.Count();
    this.Chart.Initialize((count + 1) * 2);

    foreach (var s in snapshots)
    {
        this.Chart.AppendSnapshot(s);
    }
}

どちらのコードも同様に実行されます。唯一の違いは、最初のケースでは、プロジェクトに取り組んだ各開発者が独自のスタイルを使用したことです。これにより、コードに一貫性がなくなり、判読不能で危険なものになりました。チームのメンバーがインデントのサイズについて合意できなかったという事実、およびifが毎回中かっこを使用することを拒否したという事実と相まって、コードは非常にエラーが発生しやすくなりました。 2番目のifは最初のifがtrueの場合にのみ実行されると信じているかもしれませんが、そうではありません。

2番目のケースでは、すべての開発者が同じ標準に従いました。それらのいくつかは、2つのスペースのインデントを好むか、または小さな文字で始まる方法に慣れていたため、おそらく不満でした。実際のところ、コードはこの方法でさらに読みやすく、別の標準を使用している場合でもそうです。

厳密で統一された標準を使用することで、コードが読みやすくなります。

2.なぜそれらの標準が[〜#〜] i [〜#〜]すぐに発明されましたか?

世界中の何十万人もの開発者が標準を使用している場合は、それに固執してください。独自に開発しないでください。たとえそれが優れているとしても、何十万人もの開発者が自分のものを使い始めるよりも、グローバル標準に移行する方が簡単です。

例:私の会社では、データベースの主キーと外部キー、およびインデックスに名前を付けるための特定の規則があります。これらの名前は次のようになります。

  • [FK for Application: CreatedByApplicationId]
  • [IX for SessionIPAddress: SessionId]または
  • [PK for RoleOfPassword: RoleId, PasswordId]

個人的には、この慣習は素晴らしいものであり、非常に明確です。私のために。しかし、それは完全に最悪です。 それは私のものであり、何千人ものデータベース管理者の誰もそれを使用したことがないので、それはひどいです。これは、

  • 私がDBAを雇うとき、彼は今すぐ仕事を始めるのではなく、新しいコンベンションを学ぶことを余儀なくされます。

  • 私はインターネット上でコードの一部をそのまま共有することはできません。それらの奇妙に見える名前は私のコードを読む人々を混乱させ、

  • 自分で使用するために外部からコードを取得する場合、統一するために名前を変更する必要があります。

  • ある日、よく知られている標準を使用することにした場合、数百の名前すべてを変更する必要があります。

3.では、大文字はどうですか?

プロパティには、フィールドやローカル変数よりも大きなスコープまたは可視性があります。プロパティの作成は大文字で始まり、フィールドと変数-小さいものからこの方向に進みます。

C#を検討する場合、このロジックは十分に一貫しています。

Javaを検討する場合、メソッドは小さな文字で始まりますが、これは論理に従いません。

したがって、いいえ、この慣習があなたの慣習よりも優れているという明確な証拠はありません。グローバルに使用されているだけで、使用されていません。どれもbetter

JavaScriptでは、関数の前にnewが必要でない限り、関数は小文字で始まります。逆の方がいいのでは?多分。実際、何年もの間、JavaScript開発者はこの標準を使用しており、その逆ではありませんでした。すべての本を書き直し、すべての開発者にスタイルの変更を強制することは、やや複雑になります。

25

技術的には問題ではありません(または、少なくともほとんどの言語では問題ではありません)。

ただし、ほとんどのプログラミングコミュニティ(特定の言語を中心に形成された世界規模のコミュニティ、そのようなコミュニティのサブグループ、人気のあるライブラリやツールキットを中心に形成されたグループ、または個別のチーム)は、確立されたコーディング標準を開発しました。正確な詳細は比較的重要ではありません(多くの場合、それらについては適切な議論が行われる可能性があります)、isが重要なのは、それらに固執することです。

それらが最高だからではなく、他の誰もが使うものだからです。標準に固執する場合、コードは、最終的に使用する他のほとんどのコード(ライブラリー、チームメイトのコード、組み込み言語など)と一致します。一貫性のあるネーミングは、生産性を高める強力な武器の1つです。これは、何かの名前を推測するときに、通常は正しく推測できることを意味するためです。 file.SaveTo()File.saveTo()file.save_to()FILE.save_to()ですか?命名規則がわかります。

最初に、すべての言語には独自の文化があり、命名規則に互換性がないことが多いため、遭遇するすべての言語に個人的な好みを持ち込むことは特に危険です。第二に、ネーミングに関する限り、言語間には多くの微妙な違いがあります。

ほんの一例:C#では、型と変数は別々の名前空間にあります。コンパイラーは、違いを知るのに十分なほどスマートです。ただし、Cでは、両方の種類の名前が名前空間を共有するため、同じスコープ内に同じ名前の型と変数を持つことはできません。このため、Cでは型と変数を区別する命名規則が必要ですが、C#ではそうではありません。

10
tdammers

他の誰もこれを言っていないことに驚いていますが、大文字と小文字の違いが1つの理由で驚くほど役立つと思います。変数がローカルスコープのみかどうかを知ることができるのは便利で便利です。変数がローカルである場合、名前のリファクタリングなど、変数を変更することによる副作用についてはあまり気にしません。したがって、クラスメンバーとプライベートクラス変数とローカル変数を区別する規則が好きです。

現代のIntellisenseでは、これはますます重要ではなくなりますが、定義を見つけるためにどこを探すべきかを知るためにコードを読むときに、それでもいくつかのランドマークが得られます。

そして、メソッドの1つの画面に収まる可能性が低かった数年前の私のより悪いスタイルから、これのかなりの部分が残っているかもしれません。

10
Jamie F

これは、あなたの特定の慣習というよりは、慣習の質問のようです。

あなたが破るあらゆる慣習について、あなたは他のすべての人のためにより多くの仕事を追加しているだけです。おそらく完璧な世界では、会社全体が一生涯単一の製品に取り組んでいます...しかし、実際には、これは真実ではありません。人々はプロジェクト間を行き来し、時には会社をまたいで、あるいは楽しみのためにさえ行きます。コードがランダムであるほど、作業が難しくなり、コストが高くなります。事業主または利害関係者として、私はプロジェクトの利益よりも利己的に考える開発者を雇いたくありません。

これは、プロフェッショナリズムに要約されます。時々、個人的なスタイルを脇に置いて、大量導入のためにより効率的なものを採用する必要がある場合があります。これによりコラボレーションが促進され、そもそも存在してはならない無関係な障壁が取り除かれます。

実際の規則については、CapitalCamelCaseは通常、クラス名(またはJavaScriptではコンストラクター)用に予約されています。大文字の変数が表示された場合、経験に基づいた推測により、使用するにはインスタンス化する必要があると判断されます。それが間違っていると、コードがコミュニティ標準に従っていないことに腹を立てることになります。他のほとんどの言語でさえ、それを初めて見た他の誰もが即座に惑わされています。誤解を招くのではなく、コードを明確にする必要があります。

7

「プロパティとvoidメソッドのために適切な大文字と小文字を完全に予約する必要があるため。ローカル変数と値を返すメソッドは、最初のWordを小文字にする必要があります。」.

他のプログラマーは現在あなたのコードを引き上げており、これはプロパティであり、それは実際にはローカル変数であると考えているため、仕事が難しくなっています。

2
N4TKD

他の人が本当の理由を言わなかったように、命名規則を軽くたたく以外は。チーム全体を同じページに配置できれば、時間を節約できます。たとえば、個人的に私はこれに入るコーディング標準のことを始めました、そして、私たちはすべてのプライベートな変数とValによって渡されたものにキャメルケースを使用しましたが、公開されたものと参照によって渡されたものにはPascalCaseを使用しました。

保護されたものやOutなどの処理を行うと、線が少しぼやけます。

0
John