Tôi nghĩ rằng bạn có thể tìm thấy một bài viết trên blog của tôi về trừu tượng rò rỉ hữu ích. Đây là nền tảng có liên quan:
Trừu tượng là một cơ chế giúp lấy những gì phổ biến giữa một tập hợp các đoạn chương trình liên quan, loại bỏ sự khác biệt của chúng và cho phép các lập trình viên làm việc trực tiếp với một cấu trúc đại diện cho khái niệm trừu tượng đó. Cấu trúc mới này (hầu như) luôn có các tham số hóa : một phương tiện để tùy chỉnh việc sử dụng cấu trúc để phù hợp với nhu cầu cụ thể của bạn.
Ví dụ, một List
lớp có thể trừu tượng hóa các chi tiết của việc thực hiện danh sách được liên kết - trong đó thay vì suy nghĩ về các thao tác next
và previous
con trỏ, bạn có thể suy nghĩ về mức độ thêm hoặc xóa các giá trị vào một chuỗi. Trừu tượng là một công cụ thiết yếu để tạo ra các tính năng hữu ích, phong phú và đôi khi phức tạp từ một tập hợp nhỏ hơn nhiều các khái niệm nguyên thủy hơn.
Trừu tượng có liên quan đến đóng gói và mô đun hóa, và những khái niệm này thường bị hiểu sai.
Trong List
ví dụ, đóng gói có thể được sử dụng để ẩn các chi tiết thực hiện của danh sách liên kết; trong một ngôn ngữ hướng đối tượng, chẳng hạn, bạn có thể đặt next
và previous
con trỏ ở chế độ riêng tư, trong đó chỉ thực hiện Danh sách mới được phép truy cập vào các trường này.
Đóng gói là không đủ cho sự trừu tượng, bởi vì nó không nhất thiết ngụ ý bạn có một quan niệm mới hoặc khác về các cấu trúc. Nếu tất cả một List
lớp đã cung cấp cho bạn các phương thức truy cập kiểu ' getNext
' / ' setNext
', nó sẽ gói gọn từ bạn từ các chi tiết triển khai (ví dụ: bạn đã đặt tên trường ' prev
' hay ' previous
'? Kiểu tĩnh của nó là gì?), Nhưng nó sẽ có một mức độ trừu tượng rất thấp.
Tính mô đun liên quan đến việc ẩn thông tin : Các thuộc tính ổn định được chỉ định trong một giao diện và mô-đun thực hiện giao diện đó, giữ tất cả các chi tiết triển khai trong mô-đun. Tính mô đun giúp lập trình viên đối phó với sự thay đổi, bởi vì các mô-đun khác chỉ phụ thuộc vào giao diện ổn định.
Việc ẩn thông tin được hỗ trợ bởi đóng gói (để mã của bạn không phụ thuộc vào chi tiết triển khai không ổn định), nhưng đóng gói là không cần thiết cho mô đun. Ví dụ, bạn có thể thực hiện một List
cấu trúc trong C, để lộ ' next
' và ' prev
' con trỏ với thế giới, mà còn cung cấp một giao diện, có chứa initList()
, addToList()
vàremoveFromList()
chức năng. Với điều kiện là các quy tắc của giao diện được tuân theo, bạn có thể đảm bảo rằng các thuộc tính nhất định sẽ luôn được giữ, chẳng hạn như đảm bảo cấu trúc dữ liệu luôn ở trạng thái hợp lệ. [Ví dụ, bài báo kinh điển của Parnas về tính mô đun, được viết với một ví dụ trong lắp ráp. Giao diện là một hợp đồng và một hình thức truyền thông về thiết kế, nó không nhất thiết phải được kiểm tra một cách máy móc, mặc dù đó là những gì chúng ta dựa vào ngày nay.]
Mặc dù các thuật ngữ như trừu tượng, mô-đun và đóng gói được sử dụng làm mô tả thiết kế tích cực, điều quan trọng cần nhận ra là sự hiện diện của bất kỳ phẩm chất nào trong số này không tự động mang lại cho bạn thiết kế tốt:
Nếu thuật toán n ^ 3 được "đóng gói độc đáo", nó vẫn sẽ hoạt động kém hơn thuật toán n log n được cải tiến.
Nếu một giao diện cam kết với một hệ điều hành cụ thể, sẽ không có bất kỳ lợi ích nào của thiết kế mô-đun khi nhận ra, một trò chơi video cần phải được chuyển từ Windows sang iPad.
Nếu sự trừu tượng được tạo ra phơi bày quá nhiều chi tiết không cần thiết, nó sẽ thất bại trong việc tạo ra một cấu trúc mới với các hoạt động riêng của nó: Nó đơn giản sẽ là một tên khác cho cùng một thứ.