Có bất kỳ quy ước đặt hàng phương thức Java nào không? [đóng cửa]


159

Tôi đã có một lớp học lớn (40 phương pháp hoặc hơn) là một phần của gói tôi sẽ gửi dưới dạng công việc khóa học. Hiện tại, các phương thức này khá lộn xộn về mặt tiện ích công cộng / riêng tư, v.v. và tôi muốn đặt hàng chúng một cách hợp lý. Có một cách tiêu chuẩn để làm điều này? Ví dụ, các trường thông thường được liệt kê trước các phương thức, (các) hàm tạo được liệt kê trước các phương thức khác và getters / setters cuối cùng; Còn các phương pháp còn lại thì sao?


Cũng lưu ý rằng khi làm việc với mã như thế này, hầu hết các IDE đều cho phép bạn xem định nghĩa của bất cứ điều gì bên dưới con trỏ tự động. Điều này có nghĩa là bạn không phải làm gì ngoài việc liếc nhìn.
Thorbjørn Ravn Andersen

Nếu bạn có 40 phương thức trong một lớp - bạn đang làm sai
Ben

Câu trả lời:


132

Một số quy ước liệt kê tất cả các phương thức công khai trước, sau đó đến tất cả các phương thức riêng tư - điều đó có nghĩa là dễ dàng tách API khỏi việc triển khai, ngay cả khi không có giao diện liên quan, nếu bạn hiểu ý tôi là gì.

Một ý tưởng khác là nhóm các phương thức liên quan lại với nhau - điều này giúp dễ dàng phát hiện ra các đường nối nơi bạn có thể chia lớp lớn hiện có của mình thành nhiều nhóm nhỏ hơn, nhắm mục tiêu hơn.


1
+1. Tôi thích sắp xếp theo tầm nhìn. Xấu hổ Eclipse không thể làm điều này một cách tự động (nó sẽ luôn nhóm tất cả các hàm tạo lại với nhau và tất cả các phương thức cùng nhau.)
finnw

16
@finnw, nộp báo cáo lỗi. Những điều lạ lùng đã được biết là được thực hiện từ đó.
Thorbjørn Ravn Andersen

3
@Ben: Kinh nghiệm của tôi là bất kỳ "không bao giờ" sẽ có ngoại lệ.
Jon Skeet

1
@JonSkeet trong một vài trường hợp, trong đó các quy ước đặt hàng không còn phù hợp, ví dụ các lớp kiểm tra. Không viết mã xấu là lời khuyên tốt hơn so với cách sắp xếp mã xấu.
Bến

1
@Ben: Tôi nghĩ chúng ta sẽ phải đồng ý không đồng ý. Tôi đã viết mã nơi có rất nhiều thành viên tự nhiên, mà không vi phạm bất kỳ mối quan tâm nào, v.v.
Jon Skeet

121
  1. Biến lớp (tĩnh): Đầu tiên là biến lớp công khai, sau đó là biến được bảo vệ và sau đó là riêng tư.

  2. Biến sơ thẩm: Đầu tiên là công khai, sau đó được bảo vệ và sau đó là riêng tư.

  3. Người xây dựng

  4. Phương thức: Các phương thức này nên được nhóm theo chức năng thay vì theo phạm vi hoặc khả năng truy cập. Ví dụ, một phương thức lớp riêng có thể ở giữa hai phương thức cá thể công khai. Mục tiêu là để đọc và hiểu mã dễ dàng hơn.

Nguồn: http://www.oracle.com/technetwork/java/codeconventions-141855.html


4
Đây là 15 tuổi và có lẽ hơi lỗi thời với sự xuất hiện của các IDE hiện đại ...
assylias

16
@assylias: IMO, khả năng đọc độc lập với IDE. Giữ công khai trước khi riêng tư thường tốt hơn.
saurabheights

40

Liên kết chính xác hơn với «Quy ước mã»: «Tuyên bố lớp và giao diện»


8
+1, afaik - đây là bài viết DUY NHẤT thực sự trả lời câu hỏi. CÓ, có một thứ tự tiêu chuẩn theo lệnh của Oracle và Sun: 1. bình luận công khai, 2. lớp, 3. bình luận nội bộ, 4. dữ liệu tĩnh, 5. dữ liệu cá thể, 6. ctor, 7. phương thức và trong mỗi nhóm phần hợp lý, không phải bởi khả năng tiếp cận.
John Henckel

@VadimKirilchuk «Lưu trữ Internet» đã bị rớt xuống
Timofey Gorshkov


15

Không chắc chắn nếu có tiêu chuẩn được chấp nhận toàn cầu nhưng sở thích của riêng tôi là;

  • nhà xây dựng đầu tiên
  • Các phương thức tĩnh tiếp theo, nếu có một phương thức chính, luôn luôn trước các phương thức tĩnh khác
  • phương thức không tĩnh tiếp theo, thường theo thứ tự tầm quan trọng của phương thức theo sau bởi bất kỳ phương thức nào mà nó gọi. Điều này có nghĩa là các phương thức công khai gọi các phương thức lớp khác xuất hiện ở phía trên và phương thức riêng gọi không có phương thức nào khác thường kết thúc ở phía dưới
  • phương pháp tiêu chuẩn như toString, equalshashcodetiếp theo
  • getters và setters có một vị trí đặc biệt dành riêng ở cuối lớp

Tôi thực sự thích các hàm tạo cuối cùng bởi vì một hàm tạo được viết đúng nên làm rất ít việc khác ngoài việc gán các đối số của nó cho các thuộc tính.
GordonM

@GordonM Tại sao bạn nghĩ như vậy? Tôi sẽ đi xa như để tranh luận ngược lại là đúng. Bạn phải luôn nghĩ về API sạch nhất cho các lớp của bạn. Và đó thường không phải là cách chúng được lưu trữ, vì vậy tôi thường xử lý khá nhiều để giải thoát người gọi khỏi gánh nặng này
Neuron

@GordonM Tôi không nói về tác dụng phụ. Vì vậy, không có thay đổi cho danh sách đã được thông qua hoặc bất cứ điều gì giống nhau. Chỉ cần truyền và thiết lập các giá trị yêu cầu Lớp cho bạn biết rất nhiều về việc triển khai, điều không nên xảy ra
Neuron

@LonelyNeuron Tôi không chắc chắn những gì bạn đang nói ở đây, nhưng có vẻ như bạn đang nói rằng nhà xây dựng nên thực hiện nhiều công việc thiết lập ngoài việc gán các đối số của nó cho trạng thái bên trong. Điều này chắc chắn là sai, bởi vì nó có nghĩa là mọi thứ đang xảy ra bằng "phép thuật". Một cuộc gọi đến new Thing()chỉ nên dẫn đến một điều mới được khởi tạo. Nó không nên dẫn đến kết nối cơ sở dữ liệu được mở, các tệp được ghi, v.v.
GordonM

@LonelyNeuron Có các phụ thuộc trong hàm tạo không cho bạn biết bất cứ điều gì về việc triển khai của lớp ngoài các phụ thuộc của nó là gì. Đây là một điều tốt, không phải là một điều xấu.
GordonM

12

40 phương thức trong một lớp là hơi nhiều.

Sẽ có ý nghĩa khi chuyển một số chức năng sang các lớp khác - được đặt tên phù hợp -. Sau đó, nó là dễ dàng hơn nhiều để có ý nghĩa.

Khi bạn có ít hơn, việc liệt kê chúng theo thứ tự đọc tự nhiên sẽ dễ dàng hơn nhiều. Một mô hình thường xuyên là liệt kê những thứ trước hoặc sau khi bạn cần chúng, theo thứ tự bạn cần chúng.

Điều này thường có nghĩa là main()đi trên hoặc dưới cùng.


1
bạn rất đúng - đây không phải là vấn đề đặt hàng
kostja

4
Bạn không phải lúc nào cũng có lựa chọn, ví dụ nếu bạn đang triển khai một giao diện với rất nhiều phương pháp.
vây

5
Đây là một Hoạt động Android, vì vậy có rất nhiều mà chỉ đơn giản không thể đi bất cứ nơi nào khác, onPause(), onResume()vv, cũng như tất cả của tôi OnClickListenerlĩnh vực, trong đó, mặc dù họ là những lĩnh vực, không nhìn hoặc cư xử như họ vì vậy nó hợp lý để liệt kê chúng một cách riêng biệt
fredley

@finnw, các lớp trừu tượng là tốt đẹp và có thể sử dụng cho mục đích này.
Thorbjørn Ravn Andersen

11

"Quy ước" của tôi: tĩnh trước cá thể, công khai trước riêng tư, hàm tạo trước các phương thức, nhưng phương thức chính ở dưới cùng (nếu có).


2

Ngoài ra, nhật thực cung cấp khả năng sắp xếp các thành viên lớp cho bạn, nếu bạn vì một lý do nào đó trộn lẫn chúng:

Mở tệp lớp của bạn, đi đến "Nguồn" trong menu chính và chọn "Sắp xếp thành viên".

lấy từ đây: Các phương thức sắp xếp trong Eclipse


1

Bạn đang sử dụng Eclipse? Nếu vậy tôi sẽ gắn bó với thứ tự sắp xếp thành viên mặc định, bởi vì điều đó có thể quen thuộc nhất với bất kỳ ai đọc mã của bạn (mặc dù đó không phải là thứ tự sắp xếp yêu thích của tôi.)

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.