Gần đây tôi gặp rắc rối về việc sử dụng các lớp trừu tượng.
Đôi khi một lớp trừu tượng được tạo trước và hoạt động như một khuôn mẫu về cách các lớp dẫn xuất sẽ hoạt động. Điều đó có nghĩa là, ít nhiều, họ cung cấp một số chức năng cấp cao nhưng bỏ qua một số chi tiết nhất định sẽ được thực hiện bởi các lớp dẫn xuất. Lớp trừu tượng xác định sự cần thiết của các chi tiết này bằng cách đặt một số phương thức trừu tượng. Trong các trường hợp như vậy, một lớp trừu tượng hoạt động như một bản thiết kế, một mô tả cấp cao về chức năng hoặc bất cứ điều gì bạn muốn gọi nó. Nó không thể được sử dụng riêng, nhưng phải được chuyên môn hóa để xác định các chi tiết còn sót lại trong quá trình thực hiện cấp cao.
Đôi khi, lớp trừu tượng được tạo ra sau khi tạo một số lớp "dẫn xuất" (vì lớp cha / lớp trừu tượng không có ở đó nên chúng chưa được dẫn xuất, nhưng bạn biết ý tôi là gì). Trong các trường hợp này, lớp trừu tượng thường được sử dụng làm nơi bạn có thể đặt bất kỳ loại mã phổ biến nào mà các lớp dẫn xuất hiện tại chứa.
Sau khi thực hiện các quan sát trên, tôi tự hỏi trường hợp nào trong hai trường hợp này nên là quy tắc. Có nên sử dụng bất kỳ loại chi tiết nào cho lớp trừu tượng chỉ vì chúng hiện đang phổ biến trong tất cả các lớp dẫn xuất? Có nên sử dụng mã phổ biến không phải là một phần của chức năng cấp cao không?
Có phải mã có thể không có ý nghĩa đối với lớp trừu tượng chỉ vì nó xảy ra phổ biến cho các lớp dẫn xuất?
Tôi xin đưa ra một ví dụ: Tóm tắt lớp A có phương thức a () và phương thức trừu tượng aq (). Phương thức aq (), trong cả hai lớp dẫn xuất AB và AC, sử dụng phương thức b (). Có nên b () chuyển sang A? Nếu có, thì trong trường hợp ai đó chỉ nhìn vào A (giả vờ AB và AC không có ở đó), sự tồn tại của b () sẽ không có ý nghĩa nhiều! đây là một điều xấu? Nếu ai đó có thể có một cái nhìn trong một lớp trừu tượng và hiểu những gì đang xảy ra mà không cần truy cập các lớp dẫn xuất?
Thành thật mà nói, tại thời điểm hỏi điều này, tôi có xu hướng tin rằng viết một lớp trừu tượng có ý nghĩa mà không cần phải tìm trong các lớp dẫn xuất, đó là vấn đề về mã sạch và kiến trúc sạch. Không thực sự thích ý tưởng về một lớp trừu tượng hoạt động như một bãi chứa cho bất kỳ loại mã nào xảy ra là phổ biến trong tất cả các lớp dẫn xuất.
Bạn nghĩ gì / thực hành?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Tại sao? Không phải là trong quá trình thiết kế và phát triển một ứng dụng, tôi phát hiện ra rằng một số lớp có chức năng chung có thể tự nhiên được tái cấu trúc thành một lớp trừu tượng? Tôi phải đủ thông minh để luôn lường trước điều này trước khi viết bất kỳ mã nào cho các lớp dẫn xuất? Nếu tôi thất bại trong việc này, tôi có bị cấm thực hiện tái cấu trúc như vậy không? Tôi phải bỏ mã của tôi và bắt đầu lại?