Menu
CoddyTech

Ẩn thông tin

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

Ẩn thông tin là nguyên tắc nền tảng của tính đóng gói, tức là một lớp chỉ nên cung cấp những gì cần thiết và ẩn các chi tiết triển khai nội bộ. Công cụ để làm việc này là các từ bổ nghĩa quyền truy cập và getter/setter, còn ẩn thông tin là triết lý thiết kế định hướng cách bạn sử dụng chúng.

Mục tiêu là tạo ranh giới rõ ràng giữa việc một lớp thực hiện (giao diện công khai) và cách lớp thực hiện việc đó (cách triển khai nội bộ). Sự tách biệt này cho phép bạn thay đổi cách hoạt động bên trong mà không ảnh hưởng đến code sử dụng lớp đó:

<?php
class Temperature {
    private float $celsius;
    
    public function setCelsius(float $value): void {
        $this->celsius = $value;
    }
    
    public function getCelsius(): float {
        return $this->celsius;
    }
    
    public function getFahrenheit(): float {
        return ($this->celsius * 9/5) + 32;
    }
}

$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";

Đầu ra:

25C = 77F

Lớp (class) lưu trữ nhiệt độ nội bộ theo độ Celsius, nhưng người dùng không cần biết điều này. Sau này, bạn có thể đổi cách lưu trữ nội bộ sang Fahrenheit hoặc Kelvin. Miễn là các phương thức công khai vẫn hoạt động như cũ thì không có code bên ngoài nào bị ảnh hưởng.

Điểm chính: Việc ẩn thông tin giúp bảo vệ code khỏi những thay đổi. Hãy ẩn các chi tiết triển khai, chỉ để lộ các giao diện ổn định, nhờ đó bạn sẽ dễ bảo trì và chỉnh sửa các lớp hơn theo thời gian.

challenge icon

Thử thách

Dễ

Hãy xây dựng một bộ chuyển đổi tiền tệ để minh họa cách ẩn thông tin trong thực tế. Bạn sẽ tạo một lớp lưu trữ tiền nội bộ bằng một loại tiền tệ, nhưng có thể chuyển đổi liền mạch từ và sang nhiều loại tiền tệ mà không để code bên ngoài biết dữ liệu thực sự được lưu trữ như thế nào.

Bạn sẽ sắp xếp code trong hai tệp:

  • Money.php: Tạo một lớp Money lưu trữ nội bộ mọi số tiền dưới dạng xu (số nguyên) để tránh vấn đề về độ chính xác của số dấu phẩy động. Chi tiết triển khai này phải được ẩn hoàn toàn khỏi người dùng lớp. Lớp cần cung cấp:
    • Một thuộc tính riêng để lưu số tiền tính bằng xu
    • setDollars(float $amount): nhận số tiền tính bằng đô la và lưu trữ nội bộ dưới dạng xu
    • getDollars(): trả về số tiền tính bằng đô la (số thực, 2 chữ số thập phân)
    • setEuros(float $amount): nhận số tiền tính bằng euro và chuyển đổi sang xu theo tỷ giá: 1 EUR = 1.10 USD
    • getEuros(): trả về số tiền đã chuyển đổi sang euro (số thực, 2 chữ số thập phân)
    • getInternalValue(): trả về giá trị xu thô (số nguyên) để gỡ lỗi
  • main.php: Nạp tệp Money. Bạn sẽ nhận hai đầu vào: số tiền tính bằng đô la và số tiền tính bằng euro. Tạo một đối tượng Money. Trước tiên, đặt số tiền đô la (đã chuyển đổi sang số thực) và in ra ba dòng: giá trị đô la, giá trị euro tương đương và giá trị xu nội bộ. Sau đó, đặt số tiền euro (đã chuyển đổi sang số thực) và in lại ba giá trị tương tự.

Điểm hay của thiết kế này là code bên ngoài làm việc với các giá trị đô la và euro quen thuộc mà hoàn toàn không biết mọi thứ được lưu trữ nội bộ dưới dạng xu. Sau này, bạn có thể đổi cách lưu trữ nội bộ sang một loại tiền tệ cơ sở khác hoặc một chiến lược độ chính xác khác. Chỉ cần các phương thức công khai tiếp tục hoạt động chính xác, code bên ngoài sẽ không cần thay đổi.

Định dạng mọi giá trị đô la và euro với chính xác 2 chữ số thập phân. In mỗi giá trị trên một dòng riêng, tổng cộng sáu dòng đầu ra.

Tự làm thử

<?php

require_once 'Money.php';

// Đọc các giá trị đầu vào
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));

// TODO: Tạo một instance của Money

// TODO: Đặt số tiền đô la và in ra:
// Giá trị đô la (2 chữ số thập phân)
// Giá trị euro tương đương (2 chữ số thập phân)
// Giá trị cent nội bộ (số nguyên)

// TODO: Đặt số tiền euro và in ra:
// Giá trị đô la (2 chữ số thập phân)
// Giá trị euro tương đương (2 chữ số thập phân)
// Giá trị cent nội bộ (số nguyên)

?>
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 PHP online