Tag Archives: Trừa tượng hóa

Tái cấu trúc mã nguồn: Trừu tượng hóa

Bao gói các trường của lớp để ép người dùng phải dùng thông các cách truy xuất dán tiếp như các phương thức.

Việc bao gói dữ liệu giúp tăng tính an toàn của dữ liệu, che dấu dữ liệu, giúp cho lớp con có thể dễ dàng ghi đè các lấy dữ liệu.

Các bước:

  1. Tạo phương thức setter/getter cho dữ liệu đó.
  2. Thay tất cả các tham chiếu bằng getter/ setter tương ứng.
  3. Chuyển dữ liệu đó thành private (riêng tư).
  4. Kiểm tra lại lần cuối xem còn có tham chiếu nào không.
  5. Biên dịch và kiểm thử lại lần cuối.
private int low, height;

public boolean isIn(int arg){
    return (low>=arg)&&(arg<=height);
}

Hình 1. Mã chưa được bao gói

private int low, height;

public boolean isIn(int arg){
    return (getLow()>=arg)&&(arg<=getHeight());
}

public int getHeight() {
    return height;
}

public int getLow() {
    return low;
}

Hình 2. Mã đã được bao gói

  • Tạo một kiểu chung cho những kiểu có chung mã.

    Từ những kiểu cụ thể, tạo ra một kiểu chung chứa thuộc tính và phương thức chung cho tất cả các kiểu cụ thể. Mã bị lặp là nguyên nhân chính làm ta phải tiến hành việc tái cấu trúc này.

    Việc tái cấu trúc này làm chúng ta phải viết ít mã hơn, nhiều mã được chia sẻ hơn, nên việc bảo trì, đọc cũng dễ dàng hơn.classdiaHình 3. Ví dụ tách lớp cha

  • Thay các câu lệnh điều kiện bằng các sử dụng tính đa hình.

    Khi bạn có một câu lệnh điều kiện phụ thuộc vào loại của đối tượng. Vấn đề lớn nhất của câu lệnh điều kiện này là xuất hiện ở nhiều nơi, và mỗi lần mà bạn muốn thêm một loại mới vào thì bản phải cập nhật ở tất cả những nơi này. Khi đó tính đa hình của lập trình hướng đối tượng sẽ giúp bạn.

    Cách thức tiến hành việc tái cấu trúc: Tạo một phương thức trừu tượng ở lớp cha và chuyển khối lệnh ở lệnh điều kiện vào phương thức ghi đè ở mỗi lớp con.

    double getSpeed() {
        switch (type) {
    		case EUROPEAN:
    			return getBaseSpeed();
    		case AFRICAN:
                    return getBaseSpeed() - getLoadFactor() *
                          _numberOfCoconuts;
    		case NORWEGIAN_BLUE:
              		return (_isNailed) ? 0 : getBaseSpeed(_voltage);
    	}
    	throw new RuntimeException ("Should be unreachable");
    }
    
    

Hình 4. Mã dùng lệnh điều kiện

classdia2

Hình 5. Thiết kế sau có dùng tính đa hình

Quay lại Tái cấu trúc mã nguồn