変数の命名はコーディングの半分だ
コーディングで最も難しいことは何でしょうか?アルゴリズム?デバッグ?実はプログラマーの間で有名なジョークがあります:「コンピュータサイエンスで難しいことは2つだけ — キャッシュの無効化と名前付け。」
ジョークですが本当です。変数、関数、ファイルの名前はコードの説明書の役割を果たします。名前をうまく付ければコメントは不要で、6ヶ月後にコードを開いてもすぐに理解できます。
悪い名前 vs 良い名前
// 悪い例
const d = [1.85, 0.42, 2.10, 0.15];
const t = 0.5;
let c = 0;
for (let i = 0; i < d.length; i++) {
if (d[i] >= t) c++;
}
// 良い例
const odValues = [1.85, 0.42, 2.10, 0.15];
const odThreshold = 0.5;
let passedCount = 0;
for (let i = 0; i < odValues.length; i++) {
if (odValues[i] >= odThreshold) passedCount++;
}2つのコードはまったく同じ動作をします。しかし下のコードは読んだ瞬間に「OD値の中から基準値以上のものを数えるコードだな」とすぐにわかります。d、t、cからは絶対にわからない情報です。
4つの表記法:いつ何を使うか
コーディングで名前を付ける規則を**命名規則(Naming Convention)**と呼びます。主要な表記法は4つあります:
| 表記法 | 形式 | 使用対象 | 例 |
|---|---|---|---|
| camelCase | 最初の単語は小文字、以降は大文字 | 変数、関数 | sampleCount、getGeneInfo() |
| PascalCase | すべての単語が大文字始まり | クラス、Reactコンポーネント | GeneCard、SampleList |
| snake_case | 小文字 + アンダースコア | Python変数/関数、ファイル名 | sample_count、gene_info.py |
| SCREAMING_SNAKE | 大文字 + アンダースコア | 定数 | MAX_RETRY、OD_THRESHOLD |
JavaScriptではcamelCaseが基本です。Pythonではsnake_caseが基本です。これらは各言語コミュニティの約束なので、規則に従えば他の開発者がコードを読みやすくなります。
// JavaScript (camelCase)
const sampleCount = 96;
function calculatePassRate(samples) { /* ... */ }
// Reactコンポーネント (PascalCase)
function GeneCard(props) { /* ... */ }
// 定数 (SCREAMING_SNAKE)
const MAX_OD_VALUE = 4.0;
const MIN_SAMPLE_VOLUME = 0.5;バイオデータと命名:実践的な課題
バイオデータをコーディングする際には特有の悩みがあります。遺伝子名、データベース識別子、分析パラメータをどう変数名に落とし込むか?
ゲノム機関ごとに命名規則が違う
| 機関/DB | 遺伝子表記 | 例 |
|---|---|---|
| NCBI (Gene) | 大文字イタリック(ヒト) | TP53、BRCA1 |
| ENSEMBL | ENSG + 数字ID | ENSG00000141510 |
| UniProt | タンパク質名_種略称 | P53_HUMAN |
| HGNC | 公式シンボル(大文字) | TP53、EGFR |
コードではイタリックが使えないので、変数名にする時にルールが必要です:
// 遺伝子名はそのまま文字列として
const geneName = "TP53";
const ensemblId = "ENSG00000141510";
// 複数の遺伝子を扱う時
const targetGenes = ["TP53", "BRCA1", "EGFR"];
// 分析結果オブジェクト
const geneExpression = {
TP53: 12.4,
BRCA1: 8.7,
EGFR: 15.2
};遺伝子名そのもの(TP53)はデータなので文字列に入れ、それを格納する変数(geneName、targetGenes)はcamelCaseで命名します。
良いバイオ変数名の例
| 悪い名前 | 良い名前 | 理由 |
|---|---|---|
data | qcResults | 何のデータかわかる |
val | odValue | どの値か明確 |
list | failedSamples | 何のリストか明確 |
flag | isPassed | booleanはis/hasで始める |
n | sampleCount | 何の数か明確 |
temp | rawSequence | 一時的だからと命名を諦めない |
res | apiResponse | 略語より完全な単語 |
命名5原則
1. 意図を表す
変数名だけ見て「これが何か」わかるべきです。dよりelapsedDays、xよりcurrentIndex。
2. 省略しない
cntよりcount、btnよりbutton、msgよりmessage。自動補完があるのでタイピング時間は同じです。ただし慣例として定着した略語は例外:id、url、api、db。
3. Booleanはis/has/canで始める
const isPassed = od >= 1.0;
const hasPermission = user.role === "admin";
const canDelete = hasPermission && !isLocked;passedだけでは「通過したもの」なのか「通過したかどうか」なのか曖昧です。isPassedは明確にtrue/falseを意味します。
4. 関数は動詞で始める
function calculatePassRate(samples) { /* ... */ }
function fetchGeneData(geneId) { /* ... */ }
function formatDate(timestamp) { /* ... */ }関数は動作なので動詞が自然です。passRate()よりcalculatePassRate()の方が「この関数は合格率を計算する」とすぐにわかります。
5. 一貫性を保つ
一つのプロジェクトで「取得する」をget、fetch、retrieve、loadの4種類で混用すると混乱します。一つを決めて一貫して使いましょう。チームプロジェクトならこのルールを文書化します。
ファイル名とフォルダ名
規則があるのは変数だけではありません。ファイルやフォルダにも規則があります:
| 対象 | 規則 | 例 |
|---|---|---|
| JavaScriptファイル | camelCaseまたはkebab-case | geneUtils.js、gene-utils.js |
| Reactコンポーネントファイル | PascalCase | GeneCard.tsx、SampleList.tsx |
| Pythonファイル | snake_case | gene_analysis.py、qc_report.py |
| CSSクラス | kebab-case | gene-card、sample-list |
| 環境変数 | SCREAMING_SNAKE | DATABASE_URL、API_KEY |
kebab-caseは単語をハイフン(-)でつなぐ方式です。URLやCSSで主に使われます。
結論:名前はコードの第一印象だ
良い名前を付けることに時間を使うのは無駄ではありません。コードは一度書いて何十回も読まれます。書くのに30秒余計にかかっても、読むたびに10秒節約できるなら — それは投資です。
論文でFigureの軸ラベルを「value1」「value2」と書いたらレビュアーにリジェクトされるように、コードでd、t、cと名前を付ければ将来の自分が苦しみます。