文法ベース命名規則




最近記事を読みました
良い変数名を書くことについて.彼女の記事では、彼女は多くの戦略と説明変数の名前を書くに関与する議論.
それは確かに偉大な読み取りだったが、一度私が完了した、私は突然どのように本当にそれはプログラミングでこの一見世俗的なタスクを達成するために困難に気づいた.プログラマとして、私たちはしばしば自分の変数を命名するのが苦しいです.なぜなら、それ自体が本質的に難しいからではなく、我々が選択した名前が明確で、記述的で、我々のコードを読む次の人にとって十分な保守性を確保しなければならないからです.
私は自分の時間と努力を保存するために、私はすべての私のプロジェクトのための単純な命名規約を使用します.今日、私たちはすべての変数を考えて時間を過ごすことができるようにコミュニティに共有したいと思います.

NOTE: The code examples I use in the article are written in JavaScript, but they apply to any programming language since they're just naming conventions after all.



基本ルール
すべての変数、関数、パラメータ、および識別子はcamelCase Aでない限りRustacean . 定数はSCREAMING_CASE . このような区別をすることは、どの変数が不変で、自然とデザインだけで読むことができるようにすることです.
不変の変数が強く奨励されるプログラミング言語(あるいは強制される)では、不変の変数と本当の定数の区別をしなければなりません.
実行時変数(ユーザー入力やその他の動的な値など)に依存しない静的値は、真の定数として分類できます.例えば、 PI は真の定数であるため、SCREAMING_CASE . そうでなければ、camelCase 一時変数、エイリアス、計算、および実行時可変性の出力を格納する変更可能で不変の変数を示すために使用されます.
// Immutable Variables
const userInput = document.getElementsByTagName('input')[0].value;
const hasDevto = /dev\.to/g.test(userInput);

// True Constants
const WEBSITE_NAME = 'dev.to';
const TAU = 2 * Math.PI;
しかし、その文脈は重要である.不変の変数と真の定数の区別の基準は、状況によって異なります.例えば、使用することがありますSCREAMING_CASE for userInput もしプログラム全体を通して静的な値として扱うなら、(異なるデバイスで実行時に異なるかもしれないとしても).一日の終わりには、変数を不変の変数や真の定数として通信したい変数を見分けるプログラマとして、それは私たち次第です.

意味データ型
データ型は、いくつかの変数でどのようなメソッドと操作を実行できるかを通信します.したがって、特に弱いタイプの言語のために、私たちの最善の関心の中でタイプシステムを念頭に置いて、我々の変数を命名することになっています.そうすることで、データ型変数がどのような変数を持つか、それぞれのメソッド、プロパティ、および操作を意味するのに役立ちます.順番に、これはより読みやすいコードにつながります.

数字、文字列、およびオブジェクト
ほとんどの場合、数値、文字列、および個々のオブジェクトは、最も適切な特異名詞で命名されます.
const usernameInputField = document.getElementById('username-field');
const username = nameInputField.value;
const hypotenuse = Math.sqrt(a**2 + b**2);
const profileData = {
  name: 'Presto',
  type: 'Dog'
};

ブールリアン
ブール族の名前は通常、yesまたはnoの質問の形で、私たちが個人的にその状態についてブール変数自体を尋ねているかのように.
// Yes-or-no questions
const isDog = true;
const hasJavaScriptEnabled = false;
const canSupportSafari = false;
const isAdmin = false;
const hasPremium = true;

// Functions or methods that return booleans
// are also named in a similar fashion
function isOdd(num) { return Boolean(num % 2); }

配列とコレクション
配列やその他のコレクションのようなデータ構造 Map and Set ) の中で最も適切な複数名詞camelCase . 名詞の複数形と単数形が類似しているようであるならば、我々は適切な集合名詞のために複数形を代用することができます.このように、これらの名詞の対応する単数形は反復の間、変数名として使われることができます.
// We use plural or collective nouns for arrays.
const dogs = [ 'Presto', 'Lucky', 'Sparkles' ];

// We can use the singular form of the
// variable name of the array
// in callback functions.
dogs.forEach(dog => console.log(dog));

// We can also use it in `for...of` loops.
for (const dog of dogs)
  console.log(dog);

// Here, we can use collective nouns
// for better readability.
const herdOfCows = [ 'Bessie', 'Bertha', 'Boris' ];
herdOfCows.forEach(cow => console.log(cow));
for (const cow of herdOfCows)
  console.log(cow);

関数
関数はそれらをアクションと関連付ける意図で書かれます.これは通常、2つの部分の組み合わせとして挙げられます.a transitive verb and a direct object . 言い換えれば、関数の名前はverb + noun . これは、名前がコマンドであるか、むしろ我々が欲しいときはいつでも呼び出すことができる機能であると我々に連絡します.
function getSum(a, b) { return a + b; }
function findBanana(str) { return str.indexOf('banana'); }
function getAverage(numbers) {
  const total = numbers.reduce((prev, curr) => prev + curr);
  return total / numbers.length;
}
PowerShell , と同じBash Linuxでは、関数の命名規則を強制する言語の例です cmdlet s としては、言語でそれを呼び出します.
以下のスクリプトは、現在実行中のChromeプロセスの合計メモリを計算します.構文は友好的ではなく、PowerShellverb + noun ITS規約cmdlet sは明白です.以下の例は、 Get-Process , Where-Object , and Measure-Object cmdlet s、しかし、残りは保証されます、命名規則はあとに続きますcmdlet PowerShellによって提供されるs.This site lists them all out for reference.
# Get all processes currently running
$processes = Get-Process;

# Filter to retrive all Chrome processes
$chromeProcesses = $processes | Where-Object { $_.ProcessName -eq 'chrome' }

# Sum up all of the memory collectively
# allocated for the Chrome processes
$memoryUsage = $chromeProcesses | Measure-Object WorkingSet64 -Sum;

# Log the result to the console
"{0:F2} MB used by Chrome processes." -f ($memoryUsage.Sum / 1mb);

クラス
クラスは、適切な固有名詞PascalCase . これは、変数が、次のプログラムの他の変数と同じではないことを私たちに伝えますcamelCase 命名規則むしろ、特別なプロパティとメソッドを持つユーザー定義型を格納する特殊な変数です.
class User { }
class Admin extends User { }
class Moderator extends Admin { }
class Player extends User { }

クラスフィールドとメソッド
クラスフィールドは、以前に議論したimmutabilityとデータ型規則に従って命名されます.
一方、クラスメソッドは関数と同様に名前を付けられます.彼らはまだverb + noun 慣例ですが、場合によっては、その名前の直接のオブジェクト(名詞)部分を省略して逃げることができます.したがって、自動詞(動作)のパフォーマーは、オブジェクトメソッドを所有するクラスのオブジェクトインスタンスであることを意味します.
// Class
class Player {
  constructor(name) {
    // String
    this.username = name;

    // Number
    this.level = 100;

    // Boolean
    this.isAdmin = false;

    // Array
    this.weapons = [
      'bow',
      'sword',
      'spear'
    ];
  }

  // Class Method (with noun)
  initiateBattle() { }

  // Class Method (without noun)
  attack() { }
}

全部包んでください.
const TRUE_CONSTANT = Math.PI;
const stringName = '';
const numberName = 0;
const isBooleanName = true;
const objName = { };
const arrayNames = [ ].map(name => name);
function getFunctionName() { }
class ClassName { }
上記のコードスニペットは簡潔に私の全体の命名規則をまとめます.英語の文法規則と意味論がこの慣例に大きく影響したことは全く明らかです.抱きしめて、何らかのプログラミングに関連して、変数を命名して、彼らのデータ型をこれまでより直観的に意味する行為をしました.
我々が望んでいるならば、我々は単に名詞を記述するために形容詞を使用する方法に類似しているそのデータ型の省略形ですべての変数を接頭辞することができました、しかし、そうすることにおいて、以下の例によって示されるように、変数名は望ましくない冗長になります.我々はより良いオフになるusing TypeScript for explicit type annotations .
// This is... eww. ❌
const NUM_TAU = 2 * Math.PI;
const str_Username = 'Some Dood';
const num_Hypotenuse = Math.sqrt(num_A**2 + num_B**2);
const boo_AdminStatus = false;
const obj_ProfileData = { };
const arr_Articles = [ ];
function fun_GetUser() { }
class Cls_Class { }
ポイントの場合、命名変数はデバッグの横にプログラミングの最もイライラする側面の1つです.文法ベースの命名規則の後、確かにそれはより不快になります.この命名規則の言語的な起源のおかげで、我々はデフォルトでより直観的で読みやすいコードを書くことができます.もちろん、我々のソフトウェアのデザインとアーキテクチャが本質的に「悪い」ものではないことを保証しなければなりません.しかし、少なくとも、私たちのコードは、次のように働くことができる人のために、本当に直感的で読みやすいものであることを安心して安心することができます.
プログラミング言語は、理由のために言語と呼ばれています.