Điều gì tạo nên cho phong cách tốt của người Viking trong Java? [đóng cửa]


9

Tôi đã hỏi câu hỏi này trên Stackoverflow, và trước khi nó bị la ó, tôi đã nhận được lời đề nghị hữu ích từ Péter Török rằng đây có thể là một nơi tốt hơn để đăng nó.

Tôi đã lập trình ở Java được vài năm. Tôi thường thảo luận về các quyết định thiết kế với các đồng nghiệp trên cơ sở những gì tạo nên 'phong cách tốt'. Thật vậy, có một số câu hỏi / câu trả lời của StackOverflow thảo luận về một thiết kế trên cơ sở liệu một cái gì đó có phải là 'phong cách tốt' hay không.

Nhưng điều gì tạo nên 'phong cách tốt'? Giống như nhiều thứ, tôi biết nó khi tôi nhìn thấy nó ... nhưng tôi muốn có ý tưởng tốt hơn là lương tâm của tôi nói rằng thiết kế này không cảm thấy đúng.

Những điều bạn nghĩ về để tạo ra mã tốt, được thiết kế tốt là gì?

(Tôi thừa nhận rằng điều này hơi chủ quan, vì 'phong cách tốt' sẽ phụ thuộc vào nhiệm vụ trong tay). (Ngoài ra, tôi nên thêm rằng tôi không quan tâm đến các kiểu nhóm - ví dụ: "chúng tôi sử dụng thụt lề của 2 khoảng trắng thay vì 4" ... và tôi không quan tâm đến các quy ước mã Java.)

Chỉnh sửa: cảm ơn cho tất cả các câu trả lời / ý kiến ​​tốt cho đến nay. Tôi đặc biệt muốn câu trả lời có thể giúp mã hóa những điều làm cho lương tâm của lập trình viên (và có thể là dạ dày) vặn vẹo?


Trong số nhiều thứ khác được liệt kê ở đây, tôi chắc chắn sẽ đảm bảo đơn giản rằng các máy tính có thể biên dịch mã theo bất kỳ cách nào bạn viết nó, nhưng cuối cùng, mã cần phải có thể đọc được . Nhận xét như điên! Một bài kiểm tra tốt mà tôi muốn sử dụng: một người có thể chỉ đọc nhận xét của tôi để tìm hiểu mã làm gì, đầu vào và đầu ra của nó là gì và thuật toán được sử dụng để làm điều đó không?
Brian

1
@brian, làm cho mã của bạn giải thích làm thế nào . Để lại ý kiến ​​thực tế để giải thích tại sao . Nói cách khác, đừng bình luận như điên (trong trường hợp chung)

4
Brian: Kỹ thuật đó chắc chắn không được coi là thực hành tốt. Thực hành tốt phổ biến là nhằm mục đích làm cho mã của bạn tự ghi lại càng tốt (với tên biến rõ ràng và sự gắn kết chức năng), với các bình luận để giải thích "tại sao" chứ không phải "làm thế nào". Nhận xét giải thích mọi chi tiết nhỏ thường được coi là gây mất tập trung và thường nguy hiểm, vì mọi người ít có khả năng duy trì các nhận xét hơn mã.
Casey Patton

1
@Brian: Tuyên bố cuối cùng của bạn nói lên tất cả. Các đang nên có thể đọc được. Bình luận nhận được cũ. Mã không bao giờ làm. Nếu bạn cảm thấy cần bình luận, hãy cấu trúc lại cho đến khi mã rõ ràng đến mức các bình luận sẽ chỉ lặp lại những gì mã nói. Nhận xét tốt duy nhất là một bình luận cho biết lý do tại sao mã hoạt động theo một cách cụ thể - như tránh một lỗi trong thư viện của bên thứ ba - để ai đó không quay lại và thay đổi nó thành một thứ không hoạt động vì một lý do điều đó không rõ ràng ngay lập tức.
Ryan Stewart

2
Tôi đã chính thức bị hạ mình. Xin lỗi @amaidment. Tôi đoán cần phải nghiên cứu các tiêu chuẩn mã hóa tốt khi bình luận.
Brian

Câu trả lời:


17

Một vài điểm ngắn gọn:


3
+1. Có lẽ quan trọng nhất: giảm thiểu mã trùng lặp. Nếu bạn muốn cắt và dán nhiều hơn một vài mã thông báo, bạn cần trích xuất một chức năng. Ngay cả khi chức năng là một dòng mã.
kevin cline

4
Trên mã trùng lặp, tôi có lập trường sau đây. Cắt và dán = okay. Đó chỉ là mã di chuyển (giả sử bạn sử dụng dán một lần). Sao chép và dán = kinh khủng. Nếu bạn chỉ loại bỏ nút sao chép khỏi từ vựng của bạn, nhiều khả năng bạn sẽ làm đúng.
jsternberg

@jsternberg: +1 để phân biệt cắt / sao chép, nhưng tôi nhận thấy rằng rất nhiều người nói "cắt / dán" khi họ có nghĩa là "sao chép / dán". Tôi không biết sự khác biệt đã mất như thế nào.
Ryan Stewart

5
Đừng tự biên tự diễn. Đừng tự biên tự diễn. Đừng tự biên tự diễn.
cấu hình

1
@configurator, bạn ngửi thấy một chút buồn cười ...

9

Thêm vào danh sách của Ryan:

  • Thực hiện theo các nguyên tắc RẮN
  • Đảm bảo rằng mã của bạn không có quá nhiều phức tạp theo chu kỳ
  • Kiểm tra Driven Java luôn là một điều tốt
  • Nếu bạn có một xFactoryFactorylớp học, bạn đang làm sai :-)
  • Với các thư viện mã nguồn mở trong hệ sinh thái Java, việc phát minh lại bánh xe là kiểu xấu
  • Sử dụng thời gian Joda cho ngày và thời gian

Tôi sẽ dừng ở đó.


2
Nhưng còn HammerFactoryFactoryFactorylớp thì sao? ;-)
Wayne Molina

@Wayne, Các nhà máy là một dấu hiệu cho thấy một số quyết định cần phải trì hoãn và FactoryFactoryFactories chỉ ra rằng có một quyết định thực sự cần phải được đưa ra trong thời gian chạy nhưng không thể.

Tôi biết, tôi đã mỉa mai và tham khảo bài báo đó về lý do tại sao J2EE quá phức tạp, với HammerFactories và HammerFactoryFactories và tôi nghĩ rằng HammerFactoryFactoryFactories. :)
Wayne Molina

@Martijn - cảm ơn vì liên kết RẮN; Tôi đã không đi qua điều đó trước đây. Bạn đề nghị sử dụng JodaTime; đây có phải chỉ là sự ác cảm (thích hợp) đối với các lớp Lịch / Ngày Java không? Điều gì về JSR 310 (kế thừa của JodaTime)?
trả tiền vào

Hy vọng JSR-310 sẽ biến nó thành Java 8 (có một nhóm chúng tôi đang cố gắng thử và giúp thực hiện điều đó, liên hệ với tôi nếu bạn muốn tham gia). Trong khi đó, thời gian Joda là std defacto để xử lý ngày và giờ trong Java. Có rất nhiều điều sai với hệ thống Ngày và Lịch của Java mà tôi thậm chí không biết bắt đầu từ đâu ;-). Kẻ giết người là Ngày có thể thay đổi và không có khái niệm về thời gian hoặc thời gian hoặc ... không, tôi sẽ dừng ở đó :-).
Martijn Verburg

1

Trong khi đánh giá cao câu trả lời của người khác, tôi nghĩ chỉ công bằng khi chia sẻ một vài điều tôi nghĩ về khi cố gắng viết mã tốt:

  • những gì cần biết về lớp / phương thức / biến này? tức là kiến ​​thức này nên sống ở đâu?

  • Làm thế nào mã này có thể ảnh hưởng đến bộ nhớ / hiệu suất của ứng dụng của tôi? (Tôi thừa nhận rằng 'tối ưu hóa sớm là gốc rễ của mọi tội lỗi'; vì vậy tôi không khuyên bạn nên dành nhiều thời gian để tối ưu hóa, mà là ý thức trong khi ban đầu viết mã của mình.)

  • rõ ràng (từ mã, và cấu trúc mã) cái này làm gì? (Tôi cố gắng tuân theo câu châm ngôn: "Phấn đấu không để mọi người có thể hiểu, cố gắng làm cho mọi người không thể hiểu sai".)


1

Đọc lớp String và ArrayList để biết các ví dụ tuyệt vời về lập trình Java thích hợp. Nhưng chúng rất súc tích, gần như kiểu C, không nhất thiết phải là mã duy trì với các tài liệu java tối thiểu. Thực tế phổ biến tại cửa hàng của tôi là không có bình luận, vì vậy tôi cố gắng nhận xét bằng mã bằng cách sử dụng tên var verbose camelCase và sử dụng quá nhiều dòng mới để phân định một dòng suy nghĩ từ một dòng khác. Tôi vẫn tranh luận bằng cách sử dụng các tab để tách vars khỏi giá trị của chúng. Các tab có thể tăng cường khả năng đọc, IMO, nhưng chỉ khi được thực hiện tối thiểu và nó rất chủ quan. Tôi thấy đó thực sự là về khán giả. Không có câu trả lời tốt nhất ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.