Bagaimana anda mengakses Object properties dari dalam metode objek?

Apa "murni" atau "benar" cara untuk mengakses objek's sifat dari dalam metode objek yang tidak getter/setter method?

Aku tahu itu dari luar objek anda harus menggunakan getter/setter, tapi dari dalam akan anda lakukan:

Jawa:

String property = this.property;

PHP:

$property = $this->property;

atau akan anda lakukan:

Jawa:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

Maafkan saya jika saya Java adalah sedikit off, it's sudah setahun sejak saya diprogram di Jawa...

EDIT:

Tampaknya orang-orang menganggap saya berbicara tentang pribadi atau dilindungi variabel/sifat saja. Ketika saya belajar OO saya diajarkan untuk menggunakan getter/setter untuk setiap properti, bahkan jika itu adalah publik (dan sebenarnya saya tidak pernah diberitahu untuk membuat setiap variabel/properti publik). Jadi, saya mungkin akan mulai berangkat dari asumsi yang salah dari mendapatkan pergi. Tampaknya bahwa orang-orang menjawab pertanyaan ini mungkin mengatakan bahwa anda harus memiliki sifat umum dan yang mereka don't perlu getter dan setter, yang bertentangan dengan apa yang diajarkan kepada saya, dan apa yang saya bicarakan, meskipun mungkin yang perlu dibahas juga. Yang's mungkin topik yang baik untuk pertanyaan yang berbeda meskipun...

Larutan

Ini perang agama potensi, tapi tampaknya bagi saya bahwa jika anda're menggunakan getter/setter, anda harus menggunakannya secara internal juga - menggunakan keduanya akan menyebabkan masalah pemeliharaan jalan (misalnya seseorang menambahkan kode ke setter yang kebutuhan untuk menjalankan setiap kali tamu adalah set dan properti yang ditetapkan secara internal w/o yang setter dipanggil).

Komentar (2)

Secara pribadi, saya merasa seperti itu's penting untuk tetap konsisten. Jika anda memiliki getter dan setter, gunakanlah. Satu-satunya waktu saya akan mengakses lapangan secara langsung adalah ketika pengakses memiliki banyak overhead. Ini mungkin merasa seperti anda're kembung kode anda tidak perlu, tetapi hal ini tentu dapat menghemat banyak sakit kepala di masa depan. Contoh klasik:

Kemudian, anda mungkin keinginan untuk mengubah cara bahwa lapangan pekerjaan. Mungkin itu harus dihitung on-the-fly atau mungkin anda ingin menggunakan jenis yang berbeda untuk backing store. Jika anda mengakses properties langsung, perubahan seperti itu dapat mematahkan banyak sekali kode dalam satu membengkak foop.

Komentar (0)

I'm cukup terkejut melihat bagaimana bulat sentimen adalah bahwa `getter dan setter yang baik dan bagus. Saya sarankan pembakar artikel oleh Allen Holub "Getter Dan Setter Jahat". Memang, judul untuk nilai kejutan, tapi penulis membuat poin yang valid.

Pada dasarnya, jika anda memiliki getter dan setter untuk masing-masing dan setiap bidang pribadi, anda membuat bidang-bidang sebagai baik sebagai publik. Anda'd menjadi sangat sulit untuk mengubah tipe field pribadi tanpa efek riak untuk setiap kelas yang menyebut bahwa pengambil.

Selain itu, dari ketat OO pandang, objek harus menanggapi pesan (metode) yang sesuai dengan mereka (mudah-mudahan) satu tanggung jawab. Sebagian besar getter dan setter don't masuk akal untuk konstituen mereka benda-benda;Pen.dispenseInkOnto(Permukaan) lebih masuk akal untuk saya daripada Pen.getColor().

Getter dan setter juga mendorong pengguna kelas untuk meminta objek untuk beberapa data, melakukan perhitungan, dan kemudian menetapkan beberapa nilai lainnya dalam objek, yang lebih dikenal sebagai pemrograman prosedural. Anda'a akan lebih baik untuk hanya memberitahu objek untuk melakukan apa yang anda akan untuk di tempat pertama; juga dikenal sebagai Informasi Ahli idiom.

Getter dan setter, bagaimanapun, adalah kejahatan yang diperlukan pada batas lapisan-UI, ketekunan, dan sebagainya. Akses terbatas untuk kelas's internal, seperti C++'s friend kata kunci, Jawa's paket protected access, .NET's akses internal, dan Teman Kelas Pola dapat membantu anda mengurangi visibilitas `getter dan setter untuk hanya orang-orang yang membutuhkan mereka.

Komentar (0)

Hal ini tergantung pada bagaimana properti yang digunakan. Sebagai contoh, katakanlah anda memiliki mahasiswa objek yang memiliki nama properti. Anda bisa menggunakan metode Get untuk menarik nama dari database, jika belum't telah diambil sudah. Dengan cara ini anda akan mengurangi panggilan yang tidak perlu ke database.

Sekarang mari's mengatakan anda memiliki pribadi integer counter di objek yang menghitung berapa kali nama telah disebut. Anda mungkin ingin menggunakan metode Get dari dalam objek karena itu akan menghasilkan yang tidak valid menghitung.

Komentar (2)

PHP menyediakan beberapa cara untuk menangani hal ini, termasuk metode sihir __dapatkan dan __set, tapi aku lebih suka eksplisit getter dan setter. Berikut ini's mengapa:

  1. Validasi dapat ditempatkan di setter (dan getter untuk hal ini)
  2. Intellisense bekerja dengan metode eksplisit
  3. Tidak ada pertanyaan apakah sebuah properti hanya-baca, hanya menulis atau membaca-menulis
  4. Mengambil virtual properties (yaitu, nilai yang dihitung) terlihat sama seperti biasa sifat
  5. Anda dapat dengan mudah mengatur properti objek yang tidak pernah benar-benar didefinisikan di mana saja, yang kemudian masuk berdokumen
Komentar (0)

aku hanya pergi ke laut di sini?

Mungkin ;)

Pendekatan lain akan memanfaatkan private/protected metode untuk benar-benar melakukan yang mendapatkan (caching/db/dll), dan publik wrapper untuk itu bertahap count:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

dan kemudian dari dalam objek itu sendiri:

PHP:

$name = $this->_getName();

Dengan cara ini anda masih bisa menggunakan argumen pertama untuk sesuatu yang lain (seperti mengirim sebuah flag untuk menentukan apakah atau tidak untuk digunakan data cache di sini mungkin).

Komentar (0)

Aku harus kehilangan poin di sini, mengapa kau menggunakan getter dalam sebuah objek untuk mengakses properti dari objek itu?

Mengambil ini untuk kesimpulan pengambil harus memanggil getter, yang harus memanggil getter.

Jadi saya'd mengatakan dalam sebuah objek, metode akses properti secara langsung, terutama melihat panggilan lain metode dalam objek tersebut (yang hanya akan mengakses properti secara langsung pula kemudian kembali) ini hanya sia-sia, boros latihan (atau saya salah paham pertanyaan).

Komentar (1)

saya akan mengatakan lebih baik menggunakan metode pengakses bahkan di dalam objek. Berikut ini adalah poin-poin yang datang ke pikiran saya langsung:

  1. harus dilakukan dalam kepentingan menjaga konsistensi dengan mengakses dibuat di luar objek.

  2. Dalam beberapa kasus, ini metode pengakses bisa melakukan lebih dari sekedar mengakses lapangan; mereka bisa melakukan beberapa proses tambahan (yang meskipun jarang). Jika ini adalah kasus, dengan mengakses lapangan secara langsung anda akan hilang bahwa pengolahan tambahan dan program anda bisa pergi serba salah jika proses ini selalu dilakukan selama mereka mengakses

Komentar (0)

Jika dengan "murni" anda berarti "paling enkapsulasi", maka saya biasanya menyatakan semua bidang saya sebagai pribadi dan kemudian menggunakan ini.bidang dari dalam kelas itu sendiri, tapi semua kelas-kelas lain, termasuk subclass, akses contoh negara yang menggunakan getter.

Komentar (0)

The purist OO cara ini untuk menghindari kedua dan ikuti Hukum Demeter dengan menggunakan Katakan Tidak't Ask pendekatan.

Alih-alih mendapatkan nilai objek's properti, yang erat pasangan dua kelas, menggunakan objek sebagai parameter misalnya

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

Di mana properti itu asli jenis, misalnya int, menggunakan metode akses, nama itu untuk masalah domain tidak pemrograman domain.

  doSomethingWithProperty( this.daysPerWeek() ) ;

Ini akan memungkinkan anda untuk menjaga enkapsulasi dan post-kondisi atau tergantung invariants. Anda juga dapat menggunakan metode penyetel untuk mempertahankan pra-kondisi atau tergantung invariants, namun don't jatuh ke dalam perangkap penamaan mereka setter, kembali ke Hollywood Prinsip untuk penamaan ketika menggunakan idiom.

Komentar (0)

Saya bisa salah karena saya'm otodidak, tapi saya tidak PERNAH pengguna umum properti di Jawa kelas, mereka selalu pribadi atau dilindungi, sehingga di luar kode yang harus diakses oleh pengambil/penyetel. It's baik untuk pemeliharaan / modifikasi tujuan. Dan untuk di dalam kelas kode... Jika metode pengambil sepele saya menggunakan properti secara langsung, tapi saya selalu menggunakan metode setter karena aku bisa dengan mudah menambahkan kode untuk peristiwa kebakaran ini jika aku mau.

Komentar (0)

i've ditemukan dengan menggunakan setter/getter membuat kode lebih mudah dibaca. Saya juga suka mengontrol memberikan ketika kelas-kelas lain menggunakan metode dan jika saya mengubah data properti akan menyimpan.

Komentar (0)

Bidang swasta dengan publik atau dilindungi dan offline. Akses ke nilai-nilai yang harus pergi melalui sifat, dan akan disalin ke variabel lokal jika mereka akan digunakan lebih dari sekali dalam satu metode. Jika dan HANYA jika anda memiliki sisa aplikasi anda sehingga benar-benar tweak, mengguncang keluar, dan jika tidak dioptimalkan untuk mana mengakses nilai-nilai dengan pergi melalui mereka assosciated properti telah menjadi bottleneck (Dan itu tidak akan PERNAH terjadi, saya jamin) harus anda bahkan mulai mempertimbangkan membiarkan sesuatu yang lain dari sifat-touch dukungan mereka variabel ini diatas.

.NET developer dapat menggunakan automatic properti untuk menegakkan ini karena anda dapat't bahkan melihat dukungan variabel pada saat desain.

Komentar (0)

Jika saya tidak't mengedit properti I'll menggunakan get_property() metode publik kecuali's acara khusus seperti MySQLi objek dalam objek lain di mana kasus I'll hanya umum properti dan menyebutnya sebagai $obj->object_property.

Di dalam objek itu's selalu $this->properti untuk saya.

Komentar (0)

Itu tergantung. It's lebih banyak masalah gaya dari apa pun, dan tidak ada aturan keras.

Komentar (0)

Nah, tampaknya dengan C# 3.0 sifat' default implementasi, keputusan ini diambil untuk anda; anda HARUS mengatur properti menggunakan (mungkin pribadi) properti setter.

Saya pribadi hanya menggunakan pribadi anggota-balik ketika tidak melakukan hal itu akan menyebabkan objek untuk jatuh kurang dari yang diinginkan negara, seperti ketika inisialisasi atau ketika caching/lazy loading yang terlibat.

Komentar (0)

Saya suka jawaban oleh cmcculloh, tapi sepertinya yang paling benar adalah jawaban oleh Greg Hurlman. Gunakan getter/setter sepanjang waktu jika anda mulai menggunakan mereka dari getgo dan/atau yang digunakan untuk bekerja dengan mereka.

Sebagai samping, saya pribadi menemukan bahwa menggunakan getter/setter membuat kode lebih mudah dibaca dan di-debug nanti.

Komentar (0)

Seperti yang dinyatakan dalam beberapa komentar di: kadang-Kadang anda harus, kadang-kadang anda tidak't. Sebagian besar tentang pribadi variabel adalah bahwa anda dapat melihat semua tempat-tempat yang mereka digunakan ketika anda mengubah sesuatu. Jika anda getter/setter melakukan sesuatu yang anda butuhkan, gunakan itu. Jika itu doesn't peduli anda memutuskan.

Sebaliknya kasus dapat dibuat bahwa jika anda menggunakan getter/setter dan ada perubahan getter/setter mereka harus menganalisis semua tempat getter dan setter digunakan secara internal untuk melihat jika itu macam-macam ada sesuatu.

Komentar (0)