Apakah ada istilah yang digunakan ketika variabel internal dinyatakan publik dan dapat diakses?

10

Jika seseorang menulis kode sehingga variabel internal $ _fields dapat diakses tanpa menggunakan metode pengambil / penyetel, apakah ada istilah yang tepat untuk menggambarkan itu?

Sesuatu yang cukup sopan untuk digunakan dengan manajemen :)

PeterB
sumber
9
Kurang enkapsulasi?
Oded
@Oded Saya pikir Anda benar - kurangnya / enkapsulasi yang buruk menggambarkannya dengan baik
PeterB
Dua frasa yang saya pikirkan ketika mencoba menjawab pertanyaan ini adalah "abstraksi bocor" dan "pelonggaran longgar" - apa yang masing-masing merujuk (di luar kepala saya)?
PeterB
1
Abstraksi Leaky adalah ketika Anda mencoba untuk abstrak konsep tetapi tidak benar-benar bekerja - konsep yang mendasarinya masih bocor (ORM lebih dari SQL dan kerangka kerja web melalui HTTP / HTML cenderung abstraksi bocor).
Oded
@ PeterB - untuk menambah penjelasan Oded, lihat ini: joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

Jawaban:

30

Mengekspos anggota pribadi yang tidak pernah menjadi hal yang baik dalam masyarakat yang sopan ...

Praktek ini adalah kurangnya / enkapsulasi yang buruk.

Oded
sumber
6
1, Nah, Anda tidak akan mendapatkan Anda kemaluannya keluar di kantor kan?
StuperUser
6
-1: Enkapsulasi benar-benar terjadi dan terjadi dengan baik. Tapi itu tidak didokumentasikan melalui kode sumber dengan cara yang diterima secara umum. Beberapa bahasa (seperti Python) tidak memiliki variabel benar-benar pribadi, namun masih mempraktikkan enkapsulasi.
S.Lott
6
@Oded: Enkapsulasi adalah konsep desain . Bahasa yang berbeda memiliki implementasi konsep yang berbeda pula. Bahasa dengan deklarasi pribadi memungkinkan satu implementasi. Bahasa pemrograman fungsional dengan objek stateless mungkin memiliki implementasi yang berbeda. Python (yang kurang private) memiliki implementasi konsep enkapsulasi.
S.Lott
1
@ S Lott; Oded - Enkapsulasi baik dan mengandalkan kode di mana variabel pribadi yang sering diakses langsung dari kelas lain adalah enkapsulasi yang buruk. Dalam python, Anda melakukan ini dengan mengakses variabel privat nama-hancur dari kelas lain atau mengabaikan konvensi awalan garis bawah tunggal (meskipun jika pengambil Anda melakukan perilaku lain; benar-benar harus digunakan __untuk mangling nama). Bahasa lain juga dapat memiliki enkapsulasi yang buruk, misalnya, refleksi di Jawa dan pointer aritmatika dalam C ++ untuk mendapatkan variabel pribadi. Python tidak membuat sintaksis yang rumit.
dr jimbob
2
@drjimbob: Kode python jarang menggunakan __nama mangling. Tanpa __itu, desainnya masih mencerminkan enkapsulasi yang baik. Mengklaim bahwa "publik" berarti "kekurangan / enkapsulasi yang buruk" adalah salah. Konsepnya masih ada. Kode sumber tidak memiliki dekorasi yang sesuai.
S.Lott
10

Selain kurangnya enkapsulasi yang telah disebutkan oleh Oded, tergantung pada bahasa pemrograman dan paradigma itu juga bisa menjadi "data lama biasa" (di mana itu tidak selalu merupakan antipattern atau kode bau).

Joris Timmermans
sumber
4

Saya pernah mendengar istilah "objek telanjang" sebelumnya.

Raku
sumber
1
Ini tentu saja merupakan cara yang membingungkan untuk menyebutkan mereka yang mempertimbangkan Pola Objek Telanjang
Matthieu
1
Ya, itu membuat saya bingung juga.
Raku
2

Ini disebut tas properti.

Biasanya ini digunakan untuk memegang set properti yang mungkin terkait (masing-masing berpotensi menjadi objek kelas yang memiliki penentu akses yang sesuai atau tidak). Tetapi struktur di sekitarnya hanyalah sekumpulan properti.

Martin York
sumber
2

Ini disebut "tidak mengikuti standar pengkodean khusus".

OP menulis:

variabel internal $ _fields dapat diakses tanpa menggunakan metode pengambil / penyetel

Itu mungkin bertentangan dengan standar Anda, dan (karenanya) itu mungkin kode bau. Tapi itu tidak selalu enkapsulasi yang buruk. Mengekspos variabel internal (seperti dalam "hanya penggunaan internal") lebih dari pengambil dan setters ke dunia luar akan lebih buruk.

Pertanyaannya adalah: apakah harus $_fieldsdapat diakses oleh dunia luar?

Jika demikian, kami memiliki kasus di mana Anda akan menambahkan metode pengambil / penyetel. Metode-metode ini tidak merangkum apa pun kecuali fakta yang $_fieldsmerupakan variabel dari beberapa jenis (sebagai lawan dari sesuatu yang dihitung / diambil / dll dengan cepat). Bergantung pada bahasanya, Anda mungkin masih akan membocorkan jenisnya (alias detail implementasi) ke luar. Apakah Anda selalu ingin getter / setter, atau hanya ketika "diperlukan" adalah masalah standar pengkodean.

Jika $_fieldsharus tidak dapat diakses, maka, baik, tidak mengaksesnya. Apakah Anda harus mencegah orang lain mengaksesnya pada tingkat bahasa (pribadi dan teman) atau tidak (yang mungkin memudahkan debugging dalam keadaan tertentu) adalah - lagi - masalah standar pengkodean.

Masalah enkapsulasi sepenuhnya ortogonal untuk ini. Melanggar enkapsulasi sangat mungkin dilakukan dengan getter dan setter. Bahkan lebih mudah untuk menyelinap ke dalam, karena bel alarm kebanyakan orang tidak berdering ketika mereka melihat sekelompok getter dan setter - kode yang tampaknya mengikuti praktik terbaik. Kode, yang mungkin memperkenalkan dependensi lebih banyak pada detail implementasi internal daripada variabel yang dipanggil $_fieldsyang tidak ditentukan private.

Saya penggemar analogi yang buruk: Menyebut enkapsulasi yang buruk itu seperti memanggil seseorang yang memegang senjata pembunuh.

rwos
sumber
1

Saya akan memanggil variabel semacam itu variabel anggota publik .

Olivier Jacot-Descombes
sumber
-2

jika metode penyetel / pengambil Anda tidak lebih dari

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

kemudian hanya membuat variabel kemaluan hanya menyimpan beberapa mengetik di luar beberapa kasus tepi di mana perbedaan itu penting.

Ryathal
sumber
3
Hanya karena itu yang dilakukan oleh para pengambil dan penyetel Anda sekarang tidak berarti seperti itulah yang akan selalu terjadi. Dan jika menambahkan validasi ke setter membutuhkan menyisir puluhan ribu baris kode untuk menemukan di mana pun properti diakses, Anda akan langsung meledakkan selusin detik yang Anda selamatkan dengan sengaja menghindari enkapsulasi pertama kali.
Plutor
@Putor: Jika hanya itu yang bisa dilakukan objek (mis., Karena itu mewakili pesan yang dikirim ke proses lain atau catatan dalam database) maka tidak masalah; itu adalah hal-hal yang harus dilestarikan.
Donal Fellows