アンダースコア(_)接頭辞の慣習
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) { } // プライベートメソッド
}同じクラス内では、プライベートメンバに通常通りアクセスできます。この制限は、ライブラリ外のコードにのみ適用されます。この慣習により、コードを読む際にどのメンバが内部利用のみを目的としているかがすぐにわかります。_ で始まるものはすべて実装の詳細です。
チャレンジ
簡単アンダースコアの接頭辞が内部の実装詳細を隠しつつ、クリーンなパブリックインターフェースを公開する方法を示す、ゲーム用のスコアトラッカーを作成しましょう。
コードを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) _bonusMultiplierを2に設定し、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]' を出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ