Untuk menentukan pengambil dan setter mana? [Tutup]

13

Apakah ada praktik terbaik untuk menentukan penetapan getter dan setter? Tampaknya ada dua praktik:

  • pasang getter / setter
  • getter pertama, lalu setter (atau sebaliknya)

Untuk menjelaskan perbedaannya di sini adalah contoh Java dari pasangan pengambil / penyetel:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Dan di sini adalah contoh Java getter pertama, kemudian setters:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Saya pikir jenis pemesanan yang terakhir lebih jelas baik dalam kode dan diagram kelas tapi saya tidak tahu apakah itu cukup untuk mengesampingkan jenis pemesanan lainnya.

NN
sumber

Jawaban:

7

Cara pertama. Jika memungkinkan, selalu kelompokkan bersama atau tetap dekat dengan fungsi terkait yang beroperasi pada anggota yang sama.

Jika Anda mengatur kode Anda dengan cara ini membuatnya lebih jelas dan lebih mudah untuk refactor, karena jika satu kelas dapat diperhitungkan dari yang lain yang melakukan terlalu banyak, potongan yang dapat difaktorkan biasanya berputar di sekitar variabel anggota tertentu.

Secara umum lebih mudah untuk melakukan debug, memahami dan memanipulasi kode ketika Anda dapat melihat semua pada halaman yang sama seluruh siklus hidup suatu objek / variabel. Saya akan mengatakan bahwa tata letak kode terutama didasarkan pada superfisinalitas seperti ruang lingkup dan urutan abjad akan benar-benar berarti Anda kehilangan peluang untuk refactor karena Anda tidak dapat melihatnya.

Benediktus
sumber
Apakah Anda ingin menyertakan argumen lebih lanjut mengapa fungsi yang beroperasi pada anggota yang sama harus disimpan bersama?
NN
Menambahkan beberapa alasan.
Benediktus
25

Jika Anda berada dalam tim, lakukan apa yang biasanya mereka lakukan. Kalau tidak, pilih saja yang Anda sukai. Pada skala pilihan desain penting ini mungkin di suatu tempat dekat "jempol mana yang harus saya gunakan untuk menekan tombol spasi?"

axblount
sumber
7
Setuju sepenuhnya. Ini muncul di bawah judul "jangan berkeringat dengan hal-hal kecil", yang seharusnya menjadi aturan standar pengkodean semua orang # 0 (Ini adalah aturan # 0 dalam "Standar
Penyandian
Saya yakin orang banyak berdebat tentang ibu jari mana yang harus mereka gunakan untuk menekan spasi)))
superM
@Michael, aku juga pencuri. Saya mencoba menggunakan secara eksklusif kiri saya tetapi itu sangat sulit dan mengetik saya melambat hingga merangkak.
axblount
@ Maxblount Saya tangan kanan, tapi selalu gunakan ibu jari kiri saya. Baru saja mencoba hak saya dan memiliki pengalaman yang sama seperti yang Anda gambarkan. Saya juga mengetik "y" dengan tangan kiri saya untuk beberapa alasan.
KChaloux
6

Itu juga bisa bergantung pada bahasanya. Di Jawa tidak ada keuntungan nyata untuk salah satu urutan, tetapi dalam C #, misalnya, Anda memiliki konsep "properti", yang mengelompokkan pengambil dan penyetel bersama-sama, jadi itu semacam menegakkan pemesanan itu. Dalam bahasa seperti C ++, di mana Anda mungkin menginginkan visibilitas berbeda pada getter vs setter (mis. Setter pribadi, pengambil publik), Anda mungkin akan melakukan yang sebaliknya, karena pengubah visibilitas diberikan satu kali untuk beberapa metode, daripada secara individual untuk masing-masing .

Darrel Hoffman
sumber
4

Sejauh yang saya tahu, tidak ada satu konvensi pun. Bagian Konvensi Java Java tentang organisasi file tidak secara eksplisit menyebutkan penempatan getter dan setter, tetapi dikatakan:

Metode-metode ini harus dikelompokkan berdasarkan fungsi alih-alih oleh cakupan atau aksesibilitas.

Ini tidak memberikan panduan apa pun - Saya dapat berpendapat bahwa penempatan mana pun memenuhi kriteria ini.

Sesuatu yang perlu dipertimbangkan adalah bahwa IDE modern memungkinkan Anda untuk memiliki lebih banyak tampilan abstrak dari struktur file Anda daripada sebagai komponen kode teks. Ini, ditambah dengan alat pencarian yang kuat, akan membuatnya mudah untuk menavigasi file dan menemukan metode yang sesuai bahkan dalam file besar.

Sebagai contoh, Eclipse menyediakan tampilan Outline yang memungkinkan Anda mengurutkan dan memfilter metode dan bidang dengan cara yang berbeda, dan menavigasi langsung ke tempat mereka berada dalam file. NetBeans memiliki fungsi yang serupa, dan saya menduga sebagian besar IDE lain juga melakukannya.

Satu-satunya saat ini mungkin penting adalah jika Anda membaca kode di luar IDE Anda. Contoh mungkin menggunakan alat peninjau kode eksternal atau melihat delta dari sistem kontrol versi Anda.

Solusi terbaik adalah dengan konsisten di seluruh file dalam suatu proyek. Temukan standar, dokumentasikan, dan patuhi.

Thomas Owens
sumber
1

Kelompokkan pengambil dan penyetel untuk satu bidang bersama, berpasangan.

Mengelompokkan semua getter bersama-sama dan semua setter bersama membuat sulit untuk menentukan bidang mana yang baru saja getter atau hanya setter.

Ketika saya membaca kode atau mencari fungsionalitas tertentu saya membayangkan sebuah kelas memiliki bidang, dengan masing-masing bidang memiliki pengambil dan penyetel. Tidak masuk akal bagi saya untuk kelas memiliki kelompok getter dan kelompok setter, masing-masing memiliki bidang.

M. Dudley
sumber
Jadi, Anda berargumen bahwa getter untuk suatu bidang harus dipasangkan dengan getter untuk bidang itu karena membuatnya lebih mudah untuk meninjau bagaimana bidang tertentu dalam suatu kelas ditangani?
NN
Itu, dan model konseptual dari apa kelas itu. Kelas harus diatur terutama oleh fungsionalitas. Saat membuat kelas, Anda mungkin memutuskan bahwa itu membutuhkan bidang yang dapat dilihat secara publik dan dapat diubah. Itu adalah "fungsi" konseptual, bukan ekspresi sintaksis melalui metode pengambil dan penyetel.
M. Dudley
0

Java IDE pernah dapat menghasilkan getter dan setter untuk Anda. Cukup gunakan fungsionalitas itu dan tinggalkan urutan metode-metode itu seperti IDE yang menciptakannya. Ini adalah kode yang dihasilkan, jangan disentuhnya secara tidak perlu.

pengguna281377
sumber
Saya sadar akan hal ini. Namun, misalnya di Eclipse Anda dapat memilih di antara berbagai pemesanan .
NN
Baik. Opsi default "Bidang dalam pasangan pengambil / penyetel" tampaknya lebih berguna, karena Anda dapat menambahkan lebih banyak bidang dan menghasilkan lebih banyak pengakses nanti tanpa harus khawatir metode mana yang berjalan, cukup taruh keduanya di akhir.
user281377