Chỉnh sửa: Tôi có cảm giác mọi người không tin điều này là có thể hoặc dễ dàng, vì vậy tôi đã làm - mất khoảng một giờ từ đầu - có thể mất 40 phút nếu tôi chỉ sử dụng một phương pháp một mục tiêu thay vì phản ánh nó ra để tách các phương thức cho từng mục menu.
Đây là số Tested source code. Nó hoạt động, nhưng là một phương pháp lớn và xấu xí - refactor nó nếu bạn sử dụng nó. Tôi có thể sửa chữa nó một chút trong vài ngày tới, tôi luôn muốn có một bản sao này để tiếp tục sử dụng lại.
--- bài đăng gốc
Trước hết, hãy nhớ tách mã của bạn khỏi dữ liệu. Điều đó có nghĩa là bạn KHÔNG BAO GIỜ nên nhập:
new Menu("File...");
Chuỗi "Tệp ..." là dữ liệu. Nếu bạn bắt đầu suy nghĩ theo cách này, bạn sẽ thấy rằng câu hỏi của bạn tự trả lời.
Trước tiên, bạn cần tạo một số dữ liệu. Bạn cần nhận "Tệp ..." và "Lưu" vào các menu. Tôi thường bắt đầu với một mảng chuỗi (mà bạn có thể dễ dàng di chuyển đến một tệp)
new String[]{"File...","+Save","Load"...}
Đây là một trong những mẫu đơn giản mà tôi đã bắt đầu. Sau đó, bạn có thể phân tích dấu + và sử dụng nó để có nghĩa là "Thả xuống một cấp trong menu khi bạn thêm một cấp độ này"
Đây chỉ là quy ước ngớ ngẩn, tự sáng chế nếu bạn không thích.
Bước tiếp theo là ràng buộc để mã chạy. Bạn có thể có tất cả họ gọi cùng một phương pháp, nhưng những gì một nỗi đau trong ass (Giant chuyển tuyên bố). Một khả năng là sử dụng sự phản chiếu để ràng buộc tên phương thức trong khi bạn đang đọc dữ liệu. Dưới đây là một giải pháp (một lần nữa nó có thể không phù hợp với thị hiếu của bạn)
new String[]{"File...[fileMenu]","+Save[saveMenu]","Load[loadMenu]"...}
Sau đó, bạn phân tích ra các điều trong dấu ngoặc vuông, phản tư móc nó lên đến một phương pháp trong lớp hiện tại của bạn và bạn đang thiết lập.
Có một sự cám dỗ mà tôi luôn luôn có vào thời điểm này và tôi đã học cách chiến đấu vì nó KHÔNG BAO GIỜ làm việc. Sự cám dỗ là sử dụng tập dữ liệu đầu tiên ("File ...") và thao tác nó để phù hợp với một số mẫu và tự động liên kết với mã của bạn (trong trường hợp này, xóa tất cả các ký tự không phải alpha, làm cho chữ cái đầu tiên thấp hơn và thêm "Menu" để lấy tên phương thức chính xác). Hãy thử điều này, nó rất hấp dẫn và có vẻ bóng bẩy, nhưng sẵn sàng từ bỏ nó khi nó không đáp ứng một số nhu cầu (chẳng hạn như hai mục menu có cùng tên chính xác trong các menu phụ khác nhau).
Một cách khác là nếu ngôn ngữ của bạn hỗ trợ đóng cửa, sau đó bạn có thể thực sự tạo tên tập tin và đóng cửa ở cùng một chỗ ..
Dù sao, một khi bạn bắt đầu viết mã như thế này, bạn sẽ thấy rằng TẤT CẢ của bạn xây dựng menu là trong một phương pháp 10 dòng duy nhất và bạn có thể thay đổi nó cho phù hợp với nhu cầu của bạn. Tôi đã có một trường hợp mà tôi đã phải thay đổi một bộ các menu để phân cấp nút và tôi đã làm nó trong 2 phút.
Cuối cùng, bạn có thể sử dụng mẫu này để thiết lập các đối tượng hành động dễ dàng và thay đổi cách dễ dàng sử dụng chúng (ở một vị trí, một dòng mã), vì vậy bạn thử nghiệm chúng. Có nhiều cách để sử dụng chúng, nhưng nếu bạn không làm những gì tôi đề xuất ở đây, bạn sẽ phải thực hiện lại trên mọi mục menu cho mọi thay đổi, điều này thực sự gây phiền nhiễu - sau một thay đổi duy nhất bạn sẽ lãng phí nhiều thời gian hơn nếu bạn vừa mới triển khai giải pháp dựa trên dữ liệu ngay từ đầu.
Điều này thực sự không phải là mã khó, nên mất khoảng một hoặc hai giờ thì bạn không bao giờ phải viết Menu mới ("... một lần nữa. Hãy tin tôi đi, loại dụng cụ này chỉ là luôn luôn đáng giá trị.
chỉnh sửa:
Tôi chỉ là luôn luôn mã dữ liệu điều khiển những ngày này.Thông thường tôi sẽ thử nghiệm một vài cách bình thường, nhận ra mẫu và refactor - và nếu bạn tái cấu trúc đúng cách, dữ liệu luôn luôn về các yếu tố và những gì bạn còn lại là đẹp, chặt chẽ và có thể duy trì.
Tôi có thể làm những gì tôi đề xuất ở trên trong vòng chưa đầy 1/2 phút (có thể là một giờ để làm phiên bản phản chiếu). Điều này gần như luôn luôn chỉ miễn là nó sẽ làm gì để sử dụng phiên bản chưa được kích hoạt, và từ đó trở đi, số tiền tiết kiệm của bạn nhân lên cho mọi thay đổi.
Điều này rất giống với những gì mọi người thích về ruby, ngoại trừ ruby dường như chèn nhiều dữ liệu hơn vào mã của họ (điều này làm cho dữ liệu của bạn trở nên khó khăn hơn rất nhiều). quốc tế hóa).
Hmm, tôi có đề cập rằng nếu bạn giỏi trích xuất dữ liệu của mình như thế này thì i18n hầu như miễn phí?
Tôi khuyên bạn nên thử một lần nào đó và xem suy nghĩ của bạn. Việc nhúng điều khiển trong các chuỗi là không cần thiết nếu nó làm bạn khó chịu. Tôi có xu hướng sử dụng mảng chuỗi/đối tượng chỉ vì chúng thực sự dễ nhập, vẫn còn trong tệp khi bạn đang mã hóa và không quan trọng để ngoại tác hóa sau này, nhưng nếu bạn thích tệp YML hoặc XML hoặc thuộc tính, hãy sử dụng bất cứ điều gì bạn thấy thoải mái với - chỉ cần trừu tượng dữ liệu của bạn từ mã của bạn!
Bản sao của http://stackoverflow.com/questions/448179/organizing-actions-in-a-swing-application#448195, như được chỉ ra bởi Dave Ray. –