Trước hết, ví dụ bạn cung cấp không hiệu quả đến mức khó tin; nó chỉ hơi kém hiệu quả; sự kém hiệu quả của nó là dưới mức cảm nhận được. Nhưng, trong mọi trường hợp, hãy tiếp tục với câu hỏi.
Theo cách tôi hiểu, khi chúng ta nói về sự tách biệt giữa UI và Logic , chúng ta có nghĩa là tránh sự kết hợp chặt chẽ .
Khớp nối chặt chẽ đề cập đến tình huống mà UI biết (và gọi) logic và logic biết (và gọi) UI. Để tránh khớp nối chặt chẽ, người ta không cần phải hủy bỏ hoàn toàn khớp nối. (Đó là những gì bạn dường như đang nhắm đến bằng cách phá hủy giao diện giữa chúng thành giao diện chuỗi mẫu số ít phổ biến nhất.) Tất cả một điều cần làm là sử dụng khớp nối lỏng lẻo .
Khớp nối lỏng lẻo có nghĩa là A biết B, nhưng B không biết A. Nói cách khác, hai bên liên quan đóng vai trò máy khách và máy chủ riêng biệt , trong đó máy khách biết máy chủ, nhưng máy chủ không biết máy khách.
Trong trường hợp UI và logic, cách tốt nhất để sắp xếp điều này theo ý kiến của tôi là bằng cách xem logic như một máy chủ và UI như một máy khách. Vì vậy, UI được xây dựng cho logic, có kiến thức về logic và gọi logic, trong khi logic không biết gì về UI và chỉ đáp ứng các yêu cầu mà nó nhận được. (Và những yêu cầu này xảy ra đến từ UI, nhưng logic không biết điều đó.)
Để đặt nó theo các thuật ngữ thực tế hơn, không nơi nào trong các tệp mã nguồn của logic bạn nên tìm thấy bất kỳ câu lệnh bao gồm / nhập / sử dụng nào tham chiếu đến tệp UI, trong khi các tệp mã nguồn của UI sẽ có đầy đủ bao gồm / nhập / sử dụng báo cáo đề cập đến các tệp Logic.
Vì vậy, để trở lại trường hợp của bạn, hoàn toàn không có gì sai với thực tế là mã UI được điền vào hộp tổ hợp biết về lớp hamburger. Sẽ có vấn đề nếu lớp hamburger biết bất cứ điều gì về hộp tổ hợp.
Ngẫu nhiên, thiết kế này cho phép một điều khác mà bạn nên mong đợi từ một hệ thống như vậy: có thể cắm nhiều UI khác nhau như bạn muốn vào logic, và toàn bộ mọi thứ vẫn hoạt động.