2010-02-27 26 views
5

Có vẻ như có một số cuộc tranh luận về tái cấu trúc để sử dụng Generics java trong nhóm hiện tại của tôi. Câu hỏi tôi có là các tiêu chuẩn ngành hiện hành về việc tái cấu trúc mã Java cũ để tận dụng một số tính năng này là gì? Tất nhiên theo tiêu chuẩn công nghiệp, tôi đang đề cập đến các phương pháp hay nhất. Một liên kết đến một cuốn sách hoặc một trang web với những cuốn sách được liệt kê sẽ được trao cho phiếu bầu vì đó là cách ít chủ quan nhất để xử lý câu hỏi này.Java refactor to Generics tiêu chuẩn công nghiệp

+0

Cuộc tranh luận chính xác trong nhóm của bạn là gì? Liệu có chấp nhận, làm thế nào để nhận nuôi, hay cái gì khác? –

+0

Dường như có một cuộc chiến thánh thiện đang diễn ra về những gì nên và không nên làm. Nó bây giờ là xuống đến là nó có giá trị mức độ nỗ lực, do những điều có khả năng mong manh. Đó là những lời tôi đã nghe nói xung quanh, không phải của tôi. – Woot4Moo

Trả lời

4

Các giấy tờ từ nhóm nghiên cứu MIT này có thể cung cấp cho bạn một số hướng dẫn hữu ích:

3

Sử dụng Generics java chắc chắn là một ý tưởng hay. Nó tương thích ngược. Vì vậy, codebase bạn không thể chuyển đổi sẽ tiếp tục làm việc với mã mới.

EDIT: Tôi đã đề cập đến type erasure làm lý do tương thích ngược.

+2

cảm ơn thông tin hữu ích, tuy nhiên có bất kỳ bộ tiêu chuẩn nào về những gì cần được tái cấu trúc thành generics và không chỉ làm điều đó vì mục đích thực hiện nó. – Woot4Moo

+1

@ Woot4Moo - không có tiêu chuẩn như vậy. Đó là một quyết định cần phải được thực hiện trên cơ sở từng trường hợp cụ thể. –

1

Thực tiễn tốt nhất để áp dụng Generics? Cách thực hành tốt nhất đầu tiên là "làm". Cố gắng loại bỏ càng nhiều phôi càng tốt trong mã của bạn. Nếu bạn muốn làm cho cuộc sống của bạn dễ dàng hơn, hãy sử dụng "Tái tạo" của IntelliJ - chỉ cần trỏ nó vào toàn bộ codebase của bạn, để nó hoạt động, và sau đó thực hiện một chút dọn dẹp.

+0

câu hỏi bây giờ trở thành là nó làm vì lợi ích của việc làm hoặc làm bởi vì nó thích hợp? – Woot4Moo

+0

Làm điều đó nếu bạn có thể kéo nó ra. Đôi khi, việc viết các lớp chung không chứa container có thể khó khăn (học cách sử dụng các giới hạn trên, dưới và nhiều giới hạn). Nguyên tắc tốt nhất của ngón tay cái là nếu bạn đang truyền một giá trị đến * từ * cuộc gọi chung, thì rất có thể sự phát triển của bạn không đủ tốt hoặc bạn đã nhấn một trong số ít trường hợp góc mà hệ thống kiểu không thể diễn tả. Có cảm giác an toàn giả được cung cấp bởi generics và nhìn thấy hệ thống của bạn thất bại trong thời gian chạy với ClassCastException có thể là một kinh nghiệm rất bực bội. – ddimitrov

+0

@ Woot4Moo - rõ ràng là, bạn KHÔNG nên làm điều đó chỉ vì lợi ích của việc đó! –

8

Tôi không nghĩ rằng mù quáng theo những gì người khác tuyên bố là "thực hành tốt nhất" hoặc "tiêu chuẩn công nghiệp" là một ý tưởng hay. Bạn đang ở vị trí tốt nhất để quyết định xem việc thay đổi mã của bạn có đáng giá hay không.

Các câu hỏi bạn cần trả lời là những lợi ích nào bạn sẽ nhận được từ việc nâng cấp mã cũ, chi phí sẽ là bao nhiêu và rủi ro là gì?

Lợi ích chính là bạn sẽ được cải thiện việc kiểm tra kiểu biên dịch, điều này sẽ giúp phát hiện lỗi trong mã mới sử dụng mã được cập nhật. Nó thậm chí có thể làm nổi bật lỗi trong mã hiện có. Mã sử ​​dụng Generics, trong khi đôi khi khá tiết, thường dễ đọc hơn vì nó là rõ ràng về những loại nào là hợp lệ trong ngữ cảnh nào. Bạn cũng sẽ không còn phải chặn/bỏ qua cảnh báo trình biên dịch.

Chi phí là khoảng thời gian cần thiết để thực hiện và kiểm tra các thay đổi cần thiết để giới thiệu Generics. Bất cứ khi nào bạn thực hiện thay đổi mã, có khả năng bạn có thể giới thiệu lỗi, vì vậy đó là một rủi ro. Lợi ích có lớn hơn chi phí không? Điều đó phụ thuộc vào số lượng mã bạn có, cách mã được sử dụng và những nhu cầu khác mà bạn có trong thời gian của bạn.

+0

Thật vậy, tôi đã được tái cấu trúc gói theo gói chỉ khi nó có ý nghĩa cho mỗi một. –

+0

+1 cho "kiểm tra cải tiến mã mới". Tôi muốn sử dụng Generics chỉ cho mã mới và cập nhật lớp mã cũ cho lớp chỉ khi tôi cần phải chạm vào lớp đó anyway. – Thilo

1

Nhóm của bạn nên cân bằng lợi ích của việc tái cấu trúc quy mô lớn so với chi phí và rủi ro kỹ thuật và kinh doanh khi thực hiện điều này ... và các ưu tiên khác mà nhóm của bạn có.

Đối số và phương pháp "thực hành tốt nhất" từ những người không hiểu dự án của bạn và bối cảnh kinh doanh đơn giản là không liên quan ở đây.

1

Thực tiễn tốt nhất không tồn tại. Đó là một thuật ngữ kỳ lạ cho thấy cánh cửa đóng lại trên 'tốt nhất' của một giải pháp cụ thể ... Sử dụng Generics? Vâng. Ngay. Đó là một hành trình khó xử, vì rất nhiều các thư viện lớn (Hibernate, Spring) vẫn không nắm lấy chúng hoàn toàn .. nhưng theo kinh nghiệm của tôi, đối phó với sự pha trộn của generics và dũng cảm-phôi vẫn làm cho một cơ sở mã tốt hơn không sử dụng tất cả.

Tôi cũng làm cho chính sách chuyển đổi khi bạn chạm vào thay vì một số nhiệm vụ tái cấu trúc khổng lồ.

0

Tốt hơn nên nên tái cấu trúc để sử dụng Generics. Không cần thiết vì vậy đừng coi đây là nhiệm vụ cấp bách, nhưng bạn có thể cân nhắc không sử dụng Generics là Hình thức nợ kỹ thuật nhẹ - vì vậy nếu bạn có thời gian và cơ sở mã được lên kế hoạch để có một cuộc sống liên tục lâu dài thì đáng để đầu tư nâng cấp nó.

Những lợi ích chính là:

  • Better thời gian biên dịch kiểm tra kiểu này sẽ làm giảm lỗi
  • Remove phôi không cần thiết từ mã nguồn của bạn, mà làm cho mã dễ đọc hơn
  • Nó vẫn là ngược tương thích với mã cũ (nhờ loại tẩy xoá)

Không có nhược điểm thực sự - vấn đề tiềm ẩn duy nhất tôi có thể nghĩ là nếu bạn muốn chuyển mã trở lại các phiên bản Java trước đó mà không có hỗ trợ chung. Nhưng đó sẽ là một điều rất khác thường!

Nếu bạn quyết định cấu trúc lại thành Generics sau đó tôi khuyên bạn nên theo các bước sau:

  1. Bật tất cả các cảnh báo trình biên dịch của bạn (Eclipse có cảnh báo khá tốt)
  2. Thêm kiểu generic đến lớp ví dụ đầu tiên của bạn MyClass<T>
  3. Sau đó thay đổi loại chữ ký/trường nội bộ/cấu trúc dữ liệu để sử dụng T
  4. Bạn có thể có nhiều cảnh báo/lỗi trong suốt mã tại thời điểm này. Điều này là OK, chỉ cần làm việc thông qua họ và sửa chữa tất cả. Thường thì IDE của bạn có thể "khắc phục nhanh" nhiều người trong số họ.
  5. trường hợp Write/kiểm tra cấu trúc lại chứng minh các tính năng chung

Nó là khá nhanh chóng để làm tất cả điều này - Tôi nghĩ rằng tôi quản lý để cấu trúc lại khoảng 10.000 dòng mã thư viện Java để sử dụng Generics trong vòng chưa đầy một ngày, bao gồm việc cập nhật một số mã máy khách.