Apakah ada konvensi pemesanan metode Java? [Tutup]

159

Saya memiliki kelas ish besar (sekitar 40 metode) yang merupakan bagian dari paket yang akan saya kirimkan sebagai program kerja. Saat ini, metodenya cukup campur aduk dalam hal utilitas publik / swasta dll dan saya ingin memesannya dengan cara yang masuk akal. Apakah ada cara standar untuk melakukan ini? Misalnya, bidang biasanya didaftar sebelum metode, konstruktor terdaftar sebelum metode lain, dan pengambil / penampung terakhir; bagaimana dengan metode yang tersisa?

fredley
sumber
Perhatikan juga bahwa ketika bekerja dengan kode seperti ini, sebagian besar IDE memungkinkan Anda untuk melihat definisi apa pun yang ada di bawah kursor secara otomatis. Ini berarti Anda tidak perlu melakukan apa pun kecuali melirik.
Thorbjørn Ravn Andersen
Jika Anda memiliki 40 metode dalam satu kelas - Anda melakukannya dengan salah
Ben

Jawaban:

132

Beberapa konvensi mendaftar semua metode publik terlebih dahulu, dan kemudian semua yang pribadi - itu artinya mudah untuk memisahkan API dari implementasi, bahkan ketika tidak ada antarmuka yang terlibat, jika Anda mengerti maksud saya.

Gagasan lain adalah mengelompokkan metode yang terkait bersama - ini membuatnya lebih mudah untuk melihat jahitan di mana Anda dapat membagi kelas besar yang ada menjadi beberapa yang lebih kecil, lebih bertarget.

Jon Skeet
sumber
1
+1. Saya lebih suka mengurutkan berdasarkan visibilitas. Malu Eclipse tidak dapat melakukan ini secara otomatis (itu akan selalu mengelompokkan semua konstruktor bersama-sama dan semua metode bersama.)
finnw
16
@finnw, ajukan laporan bug. Hal-hal aneh telah diketahui diimplementasikan dari sana.
Thorbjørn Ravn Andersen
3
@ Ben: Pengalaman saya adalah bahwa "tidak pernah" akan memiliki pengecualian.
Jon Skeet
1
@JonSkeet dalam beberapa kasus, di mana konvensi pemesanan tidak lagi relevan, kelas uji misalnya. Tidak menulis kode yang buruk lebih baik disarankan daripada bagaimana mengatur kode yang buruk.
Ben
1
@ Ben: Saya pikir kita harus setuju untuk tidak setuju. Saya sudah menulis kode di mana terdapat banyak anggota secara alami, tanpa melanggar pemisahan kekhawatiran, dll.
Jon Skeet
121
  1. Variabel kelas (statis): Pertama variabel kelas publik, kemudian yang dilindungi, dan kemudian pribadi.

  2. Variabel Instance: Pertama publik, kemudian dilindungi, dan kemudian pribadi.

  3. Konstruktor

  4. Metode: Metode-metode ini harus dikelompokkan berdasarkan fungsi alih-alih oleh cakupan atau aksesibilitas. Sebagai contoh, metode kelas privat dapat berada di antara dua metode instance publik. Tujuannya adalah membuat membaca dan memahami kode lebih mudah.

Sumber: http://www.oracle.com/technetwork/java/codeconventions-141855.html

Michael
sumber
4
Ini berusia 15 tahun dan mungkin sedikit ketinggalan jaman dengan kemunculan IDE modern ...
assylias
16
@assylias: IMO, keterbacaan tidak tergantung pada IDE. Menjaga agar publik sebelum pribadi biasanya lebih baik.
saurabheights
40

Tautan yang lebih tepat ke «Konvensi Kode»: «Deklarasi Kelas dan Antarmuka»

Timofey Gorshkov
sumber
8
+1, afaik - ini adalah HANYA posting yang benar-benar menjawab pertanyaan. YA ada urutan standar seperti yang ditentukan oleh Oracle dan Sun: 1. komentar publik, 2. kelas, 3. komentar internal, 4. data statis, 5. data contoh, 6. ctors, 7. metode, dan dalam setiap grup bagian secara logis, bukan oleh aksesibilitas.
John Henckel
@VadimKirilchuk «Internet Archive» sedang down ...
Timofey Gorshkov
15

Tidak yakin apakah ada standar yang diterima secara universal tetapi preferensi saya sendiri;

  • konstruktor terlebih dahulu
  • Metode statis selanjutnya, jika ada metode utama, selalu sebelum metode statis lainnya
  • Metode non statis selanjutnya, biasanya dalam urutan signifikansi metode diikuti oleh metode apa pun yang dipanggil. Ini berarti bahwa metode publik yang memanggil metode kelas lain muncul di bagian atas dan metode pribadi yang tidak memanggil metode lain biasanya berakhir di bagian bawah
  • metode standar suka toString, equalsdan hashcodeselanjutnya
  • getter dan setter memiliki tempat khusus yang disediakan tepat di bagian bawah kelas
Qwerky
sumber
Saya benar-benar lebih suka konstruktor yang terakhir karena konstruktor yang ditulis dengan benar harus melakukan sangat sedikit selain menetapkan argumennya ke properti.
GordonM
@GordonM Mengapa menurut Anda begitu? Saya akan mengatakan yang sebaliknya itu benar. Anda harus selalu memikirkan API terbersih untuk kelas Anda. Dan itu sering kali bukan cara mereka disimpan, jadi saya sering melakukan sedikit pemrosesan untuk meringankan penelepon dari beban ini
Neuron
@GordonM Saya tidak berbicara tentang efek samping. Jadi tidak ada perubahan pada daftar yang disahkan atau apa pun yang sama. Hanya dengan melewatinya dan menetapkan nilai mengharuskan Kelas memberi tahu Anda banyak tentang penerapannya, yang seharusnya tidak menjadi masalah
Neuron
@LonelyNeuron Saya tidak yakin apa yang Anda katakan di sini, tetapi sepertinya Anda mengatakan konstruktor harus melakukan banyak pekerjaan pengaturan selain menetapkan argumennya ke keadaan internal. Ini jelas salah, karena itu berarti segala sesuatu terjadi dengan "sihir". Panggilan ke new Thing()seharusnya hanya menghasilkan Hal baru yang dipakai. Seharusnya tidak mengakibatkan koneksi database dibuka, file ditulis, dll.
GordonM
@LonelyNeuron Memiliki dependensi dalam konstruktor tidak memberi tahu Anda apa pun tentang implementasi kelas selain apa dependensinya. Ini adalah hal yang baik, bukan yang buruk.
GordonM
12

40 metode dalam satu kelas sedikit banyak.

Apakah masuk akal untuk memindahkan beberapa fungsionalitas ke kelas - kelas lain yang sesuai namanya. Maka itu jauh lebih mudah untuk dimengerti.

Bila jumlah Anda lebih sedikit, jauh lebih mudah untuk menuliskannya dalam urutan membaca alami. Paradigma yang sering adalah untuk membuat daftar hal-hal baik sebelum atau setelah Anda membutuhkannya, sesuai urutan Anda membutuhkannya.

Ini biasanya berarti bahwa main()berjalan di atas atau di bawah.

Thorbjørn Ravn Andersen
sumber
1
Anda begitu benar - ini bukan masalah pemesanan
kostja
4
Anda tidak selalu punya pilihan, misalnya jika Anda mengimplementasikan antarmuka dengan banyak metode.
finnw
5
Ini adalah sebuah Kegiatan Android, jadi ada banyak yang tidak bisa pergi ke tempat lain, onPause(), onResume()dll, serta semua saya OnClickListenerbidang, yang, meskipun mereka bidang, tidak terlihat atau berperilaku seperti mereka jadi masuk akal untuk daftar secara terpisah.
fredley
@finnw, kelas abstrak bagus dan dapat digunakan untuk tujuan ini.
Thorbjørn Ravn Andersen
11

"Konvensi" saya: statis sebelum contoh, publik sebelum pribadi, konstruktor sebelum metode, tetapi metode utama di bagian bawah (jika ada).

Eljenso
sumber
2

Juga, gerhana menawarkan kemungkinan untuk menyortir anggota kelas untuk Anda, jika Anda karena suatu alasan mencampuradukkan mereka:

Buka file kelas Anda, pergi ke "Sumber" di menu utama dan pilih "Sort Anggota".

diambil dari sini: Metode pengurutan di Eclipse

Stephan Richter
sumber
1

Apakah Anda menggunakan Eclipse? Jika demikian, saya akan tetap dengan urutan sortir anggota default, karena itu kemungkinan besar akan familiar bagi siapa pun yang membaca kode Anda (walaupun itu bukan urutan sortir favorit saya.)

menemukan
sumber