Khi làm việc với các chương trình Java dựa trên giao diện người dùng, một cách gắn hành vi với một hành động nhất định (ví dụ: nhấp vào nút) là thông qua việc sử dụng các lớp ẩn danh. Trong ví dụ dưới đây, khung GUI là SWT, tuy nhiên tôi có cùng các vấn đề với các thành phần UI hoặc Android UI. Cụ thể là cấu trúc các chương trình của tôi.
MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE);
sampleMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
doSomething();
// handle all table entries
for (int i=0; i<10; i++) {
doSomething2();
}
doSomething3();
doSomething4();
}
});
Tất nhiên, một số người có thể lập luận rằng số lượng mã trong mẫu ở trên đã đảm bảo cho việc tạo ra một lớp chuyên dụng có chứa logic. Điều này cũng được đề xuất bởi quy tắc "Các lớp ẩn danh không nên có quá nhiều dòng" của Sonar .
Thật thú vị, quy tắc này cũng chỉ định rằng:
squid: S1188 - Trong khi chờ hỗ trợ đóng trong Java, các lớp ẩn danh là cách thuận tiện nhất để thực hiện một hành vi mà không phải tạo một lớp chuyên dụng. Nhưng những lớp bên trong ẩn danh đó chỉ nên được sử dụng nếu hành vi có thể được thực hiện trong một vài dòng. Với mã phức tạp hơn, một lớp được đặt tên được gọi cho.
Tuy nhiên, vì các bao đóng chưa đến Java, câu hỏi của tôi là liệu có giải pháp nào thanh lịch hơn :
- viết một loạt mã trong các lớp ẩn danh có tất cả các loại nhược điểm (tái sử dụng hạn chế, điều hướng chậm hơn qua mã, ...)
- tạo ra một số lượng lớn các lớp chuyên dụng mà bản thân chúng có thể có chức năng rất hạn chế (ví dụ: quá kỹ thuật, ...)
Để mở rộng câu hỏi của tôi: Tôi cũng muốn biết các thực tiễn tốt nhất đối với khía cạnh này của các ứng dụng UI dựa trên Java là gì? Có bất kỳ mô hình thành lập tốt?