Menu
Coddy logo textTech

アンダースコア(_)接頭辞の慣習

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 31/110。

アンダースコアの接頭辞 _ は、メンバーをプライベートとしてマークするためのDart独自の方法です。private のようなキーワードを使用する言語とは異なり、Dartは可視性を制御するためにこの命名規則に依存しています。

アンダースコアは、フィールドとメソッドの両方に適用できます。

class Counter {
  int _count = 0;        // プライベートフィールド
  
  void _increment() {    // プライベートメソッド
    _count++;
  }
  
  void increase() {      // パブリックメソッド
    _increment();
    print('Count: $_count');
  }
}

アンダースコアは、変数、メソッド、ゲッター、セッター、さらにはクラス名など、あらゆる識別子に使用できます。_Helper という名前のクラスは、そのライブラリに対してプライベートになります。

class Person {
  String _name;          // プライベート
  int _age;              // プライベート
  
  Person(this._name, this._age);
  
  String get name => _name;           // パブリックゲッター
  void _validateAge(int age) { }      // プライベートメソッド
}

同じクラス内では、プライベートメンバに通常通りアクセスできます。この制限は、ライブラリ外のコードにのみ適用されます。この慣習により、コードを読む際にどのメンバが内部利用のみを目的としているかがすぐにわかります。_ で始まるものはすべて実装の詳細です。

challenge icon

チャレンジ

簡単

アンダースコアの接頭辞が内部の実装詳細を隠しつつ、クリーンなパブリックインターフェースを公開する方法を示す、ゲーム用のスコアトラッカーを作成しましょう。

コードを2つのファイルに整理します:

  • score_tracker.dart: 適切なカプセル化を用いてプレイヤーのスコアを管理する ScoreTracker クラスを作成します。クラスには以下を含める必要があります:
    • パブリックな String playerName - 誰がプレイしているか全員が確認できます
    • 0 で初期化されたプライベートな int _score - 生のスコアは保護される必要があります
    • 1 で初期化されたプライベートな int _bonusMultiplier - これは内部のゲームメカニクスです
    • プレイヤー名を受け取るコンストラクタ
    • プライベートな _score を返すパブリックなゲッター score
    • points * _bonusMultiplier を返すプライベートなメソッド _applyBonus(int points)
    • 内部で _applyBonus を使用して実際に加算されるポイントを計算し、_score を更新して、Added [calculated] points! と出力するパブリックなメソッド addPoints(int points)
    • _bonusMultiplier2 に設定し、Double bonus activated! と出力するパブリックなメソッド activateDoubleBonus()
    • プレイヤーの現在のステータスを表示するパブリックなメソッド displayStats()
  • main.dart: スコアトラッカーをインポートし、ゲームセッションをシミュレートします:
    • プレイヤー 'Alex'ScoreTracker を作成します
    • displayStats() を呼び出します
    • 10 ポイント追加します
    • 25 ポイント追加します
    • ダブルボーナスを有効にします
    • 15 ポイント追加します(これは2倍になるはずです)
    • displayStats() を呼び出します
    • パブリックなゲッターを使用して Final score: [score] と出力します

displayStats() メソッドは以下の形式で出力する必要があります:

=== Player Stats ===
Player: [playerName]
Current Score: [_score]

プライベートな _applyBonus メソッドと _bonusMultiplier フィールドが、内部でどのようにボーナス計算を処理しているかに注目してください。外部のコードはパブリックなメソッドのみを参照し、倍率システムについては関知しません。これはアンダースコアの慣習によって隠蔽された実装詳細です。

期待される出力:

=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65

チートシート

Dartでは、アンダースコアの接頭辞 _ はメンバーをプライベートとしてマークします。この命名規則は、private のようなキーワードを使用せずに可視性を制御します。

フィールドやメソッドにアンダースコアを適用します:

class Counter {
  int _count = 0;        // プライベートフィールド
  
  void _increment() {    // プライベートメソッド
    _count++;
  }
  
  void increase() {      // パブリックメソッド
    _increment();
    print('Count: $_count');
  }
}

アンダースコアは、変数、メソッド、ゲッター、セッター、クラス名など、あらゆる識別子に使用できます:

class Person {
  String _name;          // プライベート
  int _age;              // プライベート
  
  Person(this._name, this._age);
  
  String get name => _name;           // パブリックゲッター
  void _validateAge(int age) { }      // プライベートメソッド
}

プライベートメンバーは同じクラス内からはアクセス可能ですが、ライブラリ外のコードからは制限されます。_ で始まるものはすべて実装の詳細です。

自分で試してみよう

import 'score_tracker.dart';

void main() {
  // TODO: プレイヤー 'Alex' の ScoreTracker を作成する
  
  // TODO: displayStats() を呼び出す
  
  // TODO: 10ポイント追加する
  
  // TODO: 25ポイント追加する
  
  // TODO: ダブルボーナスを有効にする
  
  // TODO: 15ポイント追加する(これは2倍になるはずです)
  
  // TODO: displayStats() を呼び出す
  
  // TODO: 公開ゲッターを使用して 'Final score: [score]' を出力する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン