Đối tượng trùm

Trong lập trình hướng đối tượng, một đối tượng trùm - Monster object  hoặc  God object - là đối tượng biết quá nhiều thứ hoặc phải làm quá nhiều việc.

Về cơ bản, cấu trúc hóa source code của chương trình là dựa trên ý tưởng chia để trị, phân tách vấn đề lớn thành nhiều vấn đề nhỏ, giải quyết từng vấn đề nhỏ. Giải quyết xong hết các vấn đề nhỏ thì  vấn đề lớn đồng thời cũng đã được giải quyết. Nguyên tắc ấy cũng có nghĩa là chỉ nên có duy nhất một thứ mà đối tượng cần phải biết đầy đủ, đó là chính nó. Cũng tương tự, chỉ có duy nhất một tập hợp các vấn đề mà đối tượng phải giải quyết, đó chính là những vấn đề của nó.




Viết code sử dụng đối tượng trùm thì không giống như vậy. Thay vào đó, mọi hoạt động trong chương trình đều xoay quanh một đối tượng biết tuốt, nắm hầu như tất cả thông tin về chương trình, và cung cấp hầu như mọi phương thức thao tác trên các dữ liệu đó. Vì đối tượng này giữ nhiều thông tin và quản lý nhiều phương thức như thế nên vai trò của nó trở nên quan trọng ngang với Chúa trời. Các đối tượng trong chương trình thay vì giao tiếp thẳng với nhau, chúng lấy thông tin của chúng qua đối tượng trùm và tương tác với nhau nhờ đối tượng trùm. Vì đối tượng trùm bị tham chiếu bởi quá nhiều phần code khác nhau, việc bảo trì sẽ trở nên khó khăn hơn so với các chương trình được thiết kế cân đối về chức năng và nhiệm vụ. Viết chương trình xoay quanh một đối tượng trùm thường được xếp vào dạng anti-pattern.

Tuy nhiên, phê phán đối tượng trùm không có nghĩa là từ bỏ global objects. Trên thực tế, mọi chương trình đều cần đến những phương thức, thuộc tính dùng chung, có thể tham chiếu được từ tất cả các class, modules... bên trong, thậm chí cả những extentions nhúng thêm vào. Nó giúp tập trung hóa một phần chức năng lõi của chương trình, đảm bảo tính nhất quán về logic xử lý. Vấn đề là phải giữ được sự hài hòa trong cấu trúc chương trình. Nghĩa là việc phân phối chức năng, nhiệm vụ từng phần code phải được tính toán kỹ ngay từ khâu thiết kế hệ thống.

Theo kinh nghiệm cá nhân, tôi luôn đặt vào chương trình một đối tượng nền và giao cho nó nắm giữ một vài thông tin cơ bản của ứng dụng, cài đặt vào nó một private storage và các phương thức set/get/remove để thao tác trên storage đó. Thỉnh thoảng tôi cũng thêm vào cho nó một tập phương thức tĩnh, có thể gỡ ra bất cứ lúc nào. Nó không phải God mà chỉ đơn giản đóng vai trò của một Assistant trợ giúp cho các đối tượng khác, giảm thiểu việc tạo ra những hiện thể kế thừa không cần thiết và làm cho chương trình có vẻ dễ dàng kiểm soát hơn.

Dân chủ thì cũng phải có ai đó đứng ra chịu trách nhiệm về đại cục chứ :D