post-image

[Bài đọc] Tại sao cần thiết lập mức độ truy cập (visibility) cho các thành phần

Lập trình Hướng Đối tượng

Thông thường, có 2 lí do chính để thiết lập mức độ truy cập cho các thành phần của một lớp:

  1. Để kiểm soát dữ liệu đầu vào (validate)
  2. Giữ cho các thành phần private không được phép truy cập tuỳ tiện

1. Kiểm soát dữ liệu đầu vào

Trong nhiều trường hợp, chúng ta có mong muốn kiểm soát được dữ liệu đầu vào để đảm bảo tính hợp lệ và chính xác của dữ liệu, chẳng hạn như: kiểm soát độ tuổi của người (không âm), kiểm soát điểm thi (không âm, không lớn hơn 10), kiểm soát tiêu đề bài viết (không quá dài, không quá ngắn, không có ký tự đặc biệt)…

Trong ví dụ sau đây, chúng ta sử dụng mức độ truy cập để kiểm soát cả dữ liệu đầu vào và đầu ra cho thuộc tính $color của lớp House:

<?php
class House {
// color of the house
private $color;
// only these colors are allowed
private $allowedColors = [
'black', 'blue', 'red', 'green'
];
public function setColor($color) {
// Black to black (lowercase)
$color = strtolower($color);
if ( in_array( $color, $this -> allowedColors ) ) {
// if $color is in the $allowedColors array
// we can set the color property
$this -> color = $color; }
}
public function getColor() {
if ($this -> color) {
// if color is set
return $this -> color;
} else {
// show an error message
return 'No color is set. May be you have set a color which is not allowed';
}
}
} // Example 1
$house1 = new House();
$house1 -> setColor('black');
echo $house1 -> getColor(); echo '<br>'; // a HTML line break to make it readable $house2 = new House();
$house2 -> setColor('yellow'); // a not allowed color
echo $house2 -> getColor();

Chúng ta không nên cho phép việc trực tiếp thay đổi giá trị của các thuộc tính vì sẽ không kiểm soát được giá trị của thuộc tính đó. Thay vào đó, chúng ta thiết lập mức độ truy cập của thuộc tính là private, nghĩa là thuộc tính chỉ được phép truy cập bên trong lớp đó, sau đó sử dụng một phương thức public để cho phép thay đổi giá trị của thuộc tính. Trong ví dụ trên, phương thức setColor($color) được sử dụng để thay đổi giá trị của thuộc tính $color.

Lưu ý: Thông thường, chúng ta sử dụng tên phương thức ‘set’ hoặc ‘get’ kèm với tên thuộc tính để dùng cho trường hợp thay đổi giá trị của thuộc tính hoặc lấy về giá trị của thuộc tính. Các phương thức này còn được gọi là setter và getter.

2. Giữ cho các thành phần private không được phép truy cập tuỳ tiện

Có nhiều trường hợp trong đó một số thuộc tính hoặc phương thức chỉ được sử dụng trong một lớp, và không nên để truy cập từ các nơi khác, như vậy chúng ta cần giữ cho các thành phần đó trở nên private. Chẳng hạn, với lớp House ở trên, giả sử chúng ta có một phương thức paint($color) dùng để vẽ ngôi nhà. Trong phương thức paint($color) này có thể sẽ gọi đến các phương thức khác như takeBrush(), mixPaint($color), startPainting()…, như vậy các phương thức nhỏ này nên giữ là private.

<?php class House {
public function paint($color) {
// calling private methods
$this -> takeBrush();
$this -> mixPaint($color);
$this -> startPainting();
}
private function takeBrush {...}
private function mixPaint($color) {...}
private function startPainting() {...}
}

Leave a Reply

Your email address will not be published. Required fields are marked *