Menggabungkan getter dan setter

16

Pustaka JavaScript seperti jQuery, menggabungkan 'getter' dan 'setter' dalam antarmuka pemrograman misalnya:

 $('element').css({'color','blue'});

akan mengatur warna atau

 $('element').css();

akan mendapatkan css untuk sebuah elemen.

Apakah ada nama untuk pola seperti itu dan apakah itu praktik yang baik untuk digunakan dalam aplikasi?

yannis
sumber

Jawaban:

12

Martin Fowler baru-baru ini menamakannya pengambil dan penyetel berlebih di artikel ini :

Saya telah mencari-cari di Javascript baru-baru ini dan satu hal yang mengejutkan saya adalah kebiasaan menggunakan nama fungsi yang sama untuk pengambil dan penyetel. Jadi, jika Anda ingin mengetahui ketinggian spanduk di jQuery, Anda akan menggunakan $("#banner").height()dan jika Anda ingin mengubah ketinggian yang akan Anda gunakan $("#banner").height(100).

Kebaktian ini akrab bagi saya, karena digunakan oleh Smalltalk. Anda mungkin mendapatkan nilai dengan banner heightdan mengubahnya dengan banner height: 100. Mengetahui itu adalah konvensi smalltalk sudah cukup untuk mengharapkan saya menyukainya, karena saya memiliki cinta yang jauh tetapi tetap pada bahasa itu. Tetapi bahkan hal-hal terbaik memiliki kekurangan, dan saya tidak bisa menyembunyikan ketidaksukaan saya untuk gaya pengkodean ini ...

Terlepas dari preferensi ini, Anda harus mengikuti konvensi bahasa yang Anda hadapi. Jika saya menulis Smalltalk lagi saya masih akan menggunakan height:100agar tetap konsisten dengan konvensi bahasa. Javascript, bagaimanapun, tidak dicatat karena memiliki konvensi yang kuat, jadi di sini saya lebih suka untuk menghindari konvensi ini, bahkan jika itu digunakan oleh jQuery ...

louisgab
sumber
1
Sementara saya biasanya setuju dengan sebagian besar dari apa yang dikatakan Fowler, saya tidak setuju dengan ketidaksukaannya untuk ini. Alasannya adalah bahwa JavaScript tidak memiliki konvensi yang kuat seperti Smalltalk, yang membuatnya dapat digunakan di sana. Namun, jQuery memang memiliki konvensi yang kuat, dan JavaScript bukan jQuery. jQuery adalah framework.
CaffGeek
@ Chad, saya harus tidak setuju dengan bacaan Anda tentang itu. Argumennya adalah bahwa ia tidak memiliki kesederhanaan dan konsistensi. Dia bilang dia menggunakannya di Smalltalk karena konsistensi dengan truf lainnya keprihatinannya. Dia tidak berpendapat bahwa konvensi Smalltalk entah bagaimana mengurangi atau menghilangkan masalah.
Winston Ewert
2

Ini disebut "metode overloading" dalam bahasa OO atau "overload fungsi" dalam bahasa non-OO.

Apakah itu praktik yang baik atau tidak merupakan topik perdebatan yang hampir sama banyaknya dengan getter / setter vs anggota publik. Orang-orang di sisi pro dan kontra mungkin memotong gigi mereka pada bahasa yang memiliki fitur ini atau tidak dan diatur dalam cara mereka. Saya menggunakannya dan menyukai latihan ini karena sejumlah alasan:

  • Konteks yang digunakan cukup baik memisahkan satu dari yang lain.
  • Menambah getatau setke nama metode menambah verbositas.
  • Jika ada beberapa getter (misalnya, satu untuk intdan satu untuk double), mengubah jenis LHS dari suatu tugas ( int x = foo.bar()vs. double x = foo.bar()) tidak memerlukan perubahan kode ( barAsInteger()vs barAsDouble()) ke sisi kanan jika kelas menyediakan keduanya. Sisi buruknya adalah kadang-kadang sulit untuk mengetahui dengan tepat metode apa yang dipanggil hanya dengan melihat kode.
Blrfl
sumber
Ini juga disebut "function overloading" di C ++.
DeadMG
Kedua istilah ini berlaku untuk C ++ karena memiliki kedua metode dan fungsi telanjang bulat.
Blrfl
1

Karena JavaScript tidak memiliki properti aktual (di mana pengaturan nilai sebenarnya dapat mengeksekusi kode), derai adalah yang mengimplementasikan idiom properti. (Bahkan jika Anda menyebutnya sesuatu yang lain.)

Jadi, dalam bahasa yang mengimplementasikan properti nyata, Anda akan melakukan ini sebagai gantinya:

element.css = ...
x = element.css

Jika Anda menggunakan pola JavaScript dalam bahasa yang menangani properti, Anda akan melakukan sesuatu yang tidak normal. Itu kemungkinan bukan ide yang bagus. Tangani properti seperti bahasa yang dimaksudkan untuk menanganinya, jadi Anda tidak membingungkan orang lain yang bekerja dengan Anda.

John Fisher
sumber
+ msgstr "di mana pengaturan nilai sebenarnya dapat mengeksekusi kode". Ini sebenarnya tidak benar lagi. Itu sudah menjadi bagian dari spesifikasi sejak ECMA 5
Demian Brecht
@ Demian: Tapi, JQuery berfungsi di peramban yang tidak menerapkan ECMA 5.
John Fisher
Saya tidak menyebutkan apa pun tentang kompatibilitas lintas-browser, hanya saja kutipannya tidak tepat seperti yang tertulis.
Demian Brecht
@ Demian: Teks "JavaScript tidak memiliki properti aktual" sudah benar jika Anda menganggap bahwa itu menggunakan versi JavaScript yang paling umum tersedia. Karena kita sedang mendiskusikan dalam konteks implementasi JQuery, pernyataan itu akan benar. Terima kasih telah menunjukkan bahwa versi JavaScript yang lebih baru memiliki properti yang sebenarnya.
John Fisher
0

Saya pikir Anda sedang mencari properties

terima kasih
sumber
Itu nama untuk fungsionalitas yang disediakan dalam C # (dan mungkin bahasa .NET lainnya?) Yang mirip dengan ini, tetapi itu tidak benar-benar sama.
Thomas Owens
Terima kasih, tidak benar-benar Anda mungkin memiliki kasus katakanlah di mana Anda mengatur atau mendapatkan gaji orang dalam suatu aplikasi person.salary('10000')atau person.salary()atau serupa.
yannis
1
Saya tidak mengerti caranya. "Properti dibaca dan ditulis seperti bidang", yang tidak benar dalam contoh di posting asli. Di sana, panggilan metode eksplisit dibuat. Ini sangat mirip, tetapi tidak persis sama.
Thomas Owens
1
@yannis Ini tidak benar. JavaScript memiliki sintaks untuk properti, dan itu bukan apa yang Anda jelaskan dalam pertanyaan asli sama sekali. Lihat en.wikipedia.org/wiki/Property_(programming)#JavaScript untuk cara mengimplementasikan dan menggunakan properti dalam JavaScript.
Thomas Owens
0

Saya agak menentang hal itu karena alasan sederhana: Kelas, Metode atau Fungsi seharusnya hanya melakukan satu hal - menurut saya, dan menggabungkan getterdan settermetode akan melanggar aturan itu. Hasilnya:

  1. The returnnilai fungsi bervariasi berdasarkan jika getter atau setter blok dijalankan. Yang satu ini hanya dapat membawa Anda ke mimpi buruk rawatan. Metode Anda harus mengembalikan hanya satu jenis data / objek dalam kasus apa pun - atau mengembalikan null, falseatau melempar exceptionjika terjadi kesalahan.
  2. Tes Unit Penulisan akan lebih sulit karena fungsi ini bertanggung jawab untuk dua fungsi yang sama sekali berbeda.
  3. Menulis dokumentasi untuk metode atau fungsi seperti itu lebih sulit untuk alasan yang jelas.
  4. Ini tidak akan konsisten ketika beberapa metode pengambil diperlukan - seperti yang telah disebutkan dalam Blrfljawaban.
Mahdi
sumber