Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Đối tượng dữ liệu và Cấu trúc dữ liệu (Data Objects and Structures)

Khái niệm cơ bản

Cấu trúc dữ liệu được định nghĩa như các lớp đặc biệt chỉ để chứa dữ liệu, tức là các mô hình thuần túy (Pure models), ví dụ: Car, Kid, Animal, Event, Employee, Company, Customer... Những dữ liệu này thường được khai báo như biến instance trong các lớp khác.

Các phương thức của lớp này không nên thực hiện công việc thực sự quan trọng, nếu không lớp cấu trúc dữ liệu sẽ không còn là cấu trúc dữ liệu nữa!

Do đó, các phương thức chủ yếu là getter và setter (accessor và mutator), thường vì biến instance được khai báo private. Có ý kiến cho rằng biến cấu trúc dữ liệu nên public để truy cập trực tiếp, nhưng việc dùng private được coi là tốt hơn.

  • Trong bối cảnh này, lớp cấu trúc dữ liệu 드러나 (exposes) dữ liệu (biến) và không có phương thức có ý nghĩa (significant).
  • Một lớp thông thường (gọi là Object ở đây), như MainActivity, ListAdapter, Calculator, Iterator, che giấu dữ liệu của chúng và lộ ra các phương thức làm việc trên dữ liệu đó.

Vậy có hai cách tiếp cận: cài đặt cấu trúc dữ liệu thuần túy, xây dựng lớp Object riêng để thao tác trên dữ liệu; HOẶC biến các lớp model thành lớp Object, che giấu dữ liệu, lộ phương thức, như ví dụ sau:

public class Square {
    public Point topLeft1;
    public double side1;
}
public class Rectangle {
    public Point topLeft1;
    public double height1;
    public double width1;
}
public class Circle {
    public Point center1;
    public double radius1;
}
public class Geometry {
    public final double PI = 3.141592653589793;
    public double area(Object shape) throws NoSuchShapeException {
        if (shape instanceof Square) {
            Square s = (Square)shape;
            return s.side1 * s.side1;
        } else if (shape instanceof Rectangle) {
            Rectangle r = (Rectangle)shape;
            return r.height1 * r.width1;
        } else if (shape instanceof Circle) {
            Circle c = (Circle)shape;
            return PI * c.radius1 * c.radius1;
        }
        throw new NoSuchShapeException();
    }
}

Trong giải pháp này, các hình dạng được coi là cấu trúc dữ liệu, lớp Geometry là Object.

Ưu điểm - Nếu cần thêm phương thức, chỉ thêm vào lớp Geometry (lúc này giải pháp này nên dùng).

Nhược điểm - Nếu cần thêm cấu trúc dữ liệu (hình dạng mới), phải sửa tất cả phương thức trong Geometry.

Sự khác biệt giữa Cấu trúc dữ liệu và Object

  • Object lộ hành vi (behaviour) và che giấu dữ liệu. Dễ thêm loại object mới mà không thay đổi hành vi hiện có. Khó thêm hành vi mới cho object hiện có.
  • Cấu trúc dữ liệu lộ dữ liệu và không có hành vi quan trọng. Dễ thêm hành vi mới cho cấu trúc dữ liệu hiện có nhưng khó thêm cấu trúc dữ liệu mới cho các hàm hiện có.