Menu
CoddyTech

Quy ước tiền tố _

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 31 trên 110.

Tiền tố gạch dưới _ là cách Dart đánh dấu các thành viên là riêng tư. Khác với những ngôn ngữ dùng từ khóa như private, Dart dựa vào quy ước đặt tên này để kiểm soát khả năng hiển thị.

Bạn có thể dùng dấu gạch dưới cho cả thuộc tính lẫn phương thức:

class Counter {
  int _count = 0;        // Trường riêng tư
  
  void _increment() {    // Phương thức riêng tư
    _count++;
  }
  
  void increase() {      // Phương thức công khai
    _increment();
    print('Count: $_count');
  }
}

Gạch dưới có thể dùng cho mọi định danh: biến, phương thức, getter, setter và cả tên lớp. Một lớp có tên _Helper sẽ là lớp riêng tư trong thư viện của nó.

class Person {
  String _name;          // Riêng tư
  int _age;              // Riêng tư
  
  Person(this._name, this._age);
  
  String get name => _name;           // Phương thức getter công khai
  void _validateAge(int age) { }      // Phương thức riêng tư
}

Bên trong cùng một lớp, bạn truy cập các thành viên riêng tư như bình thường. Quy tắc này chỉ áp dụng với code bên ngoài thư viện. Quy ước này giúp bạn nhận ra ngay khi đọc code thành viên nào chỉ dành cho sử dụng nội bộ: mọi thứ bắt đầu bằng _ đều là chi tiết triển khai.

challenge icon

Thử thách

Dễ

Hãy tạo chương trình theo dõi điểm số cho một trò chơi để minh họa cách tiền tố dấu gạch dưới giúp ẩn các chi tiết triển khai nội bộ, đồng thời cung cấp một giao diện công khai gọn gàng.

Bạn sẽ sắp xếp code thành hai tệp:

  • score_tracker.dart: Tạo một lớp ScoreTracker quản lý điểm số của người chơi bằng cách đóng gói phù hợp. Lớp này cần có:
    • Một thuộc tính công khai String playerName, mọi người đều có thể thấy ai đang chơi
    • Một thuộc tính riêng tư int _score khởi tạo bằng 0, điểm số thô cần được bảo vệ
    • Một thuộc tính riêng tư int _bonusMultiplier khởi tạo bằng 1, đây là cơ chế nội bộ của trò chơi
    • Một hàm khởi tạo nhận tên người chơi
    • Một getter công khai score trả về _score riêng tư
    • Một phương thức riêng tư _applyBonus(int points) trả về points * _bonusMultiplier
    • Một phương thức công khai addPoints(int points) sử dụng nội bộ _applyBonus để tính số điểm thực tế được cộng, cập nhật _score và in ra Added [calculated] points!
    • Một phương thức công khai activateDoubleBonus() đặt _bonusMultiplier thành 2 và in ra Double bonus activated!
    • Một phương thức công khai displayStats() hiển thị trạng thái hiện tại của người chơi
  • main.dart: Nhập trình theo dõi điểm số và mô phỏng một lượt chơi:
    • Tạo một ScoreTracker cho người chơi 'Alex'
    • Gọi displayStats()
    • Cộng 10 điểm
    • Cộng 25 điểm
    • Kích hoạt điểm thưởng nhân đôi
    • Cộng 15 điểm (số điểm này sẽ được nhân đôi)
    • Gọi displayStats()
    • In ra Final score: [score] bằng getter công khai

Phương thức displayStats() cần in ra theo định dạng sau:

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

Hãy chú ý cách phương thức riêng tư _applyBonus và thuộc tính _bonusMultiplier xử lý nội bộ việc tính điểm thưởng. Code bên ngoài chỉ thấy các phương thức công khai và không biết gì về hệ thống nhân điểm, đây là chi tiết triển khai được ẩn sau quy ước dùng dấu gạch dưới.

Đầu ra dự kiến:

=== 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

Tự làm thử

import 'score_tracker.dart';

void main() {
  // TODO: Tạo một ScoreTracker cho người chơi 'Alex'
  
  // TODO: Gọi displayStats()
  
  // TODO: Cộng 10 điểm
  
  // TODO: Cộng 25 điểm
  
  // TODO: Kích hoạt thưởng gấp đôi
  
  // TODO: Cộng 15 điểm (số điểm này cần được nhân đôi)
  
  // TODO: Gọi displayStats()
  
  // TODO: In 'Final score: [score]' bằng getter công khai
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online