Apakah dianggap praktik yang buruk untuk menambahkan logika di setter properti?

28

Saya masuk ke proyek dan saya melihat bahwa pengembang lain menambahkan banyak logika di setter properti yang disintesis. Saya mengerti bagaimana ini bekerja, tetapi saya pikir itu membuat sulit untuk memahami aliran program; saat membaca kode, setiap kali saya melihat self.something = whatever, saya selalu memeriksa apakah somethingsetter ditimpa.

Apa pendapat Anda tentang topik ini? Apakah Anda pikir ini adalah tanda arsitektur yang buruk atau solusi yang rumit?

Saya akan senang membaca lebih lanjut tentang ini jika Anda memiliki tautan / sumber yang relevan, terlalu sulit untuk mendapatkan hasil google yang baik jadi saya memutuskan untuk bertanya di sini juga.

Terima kasih atas jawaban apa pun dan harap dicatat bahwa saya sedang berbicara tentang tujuan C jika Anda belum melihat tag (walaupun saya rasa ini bukan masalah khusus bahasa).

phi
sumber
5
Logika macam apa? Tidak ada yang salah dalam menempatkan logika validasi, misalnya. Di sisi lain, seorang penyetel yang mengirim beberapa peristiwa, menyebut layanan web dan memperbarui UI sepenuhnya salah.
Arseni Mourzenko
@MainMa Saya setuju bahwa validasi baik-baik saja - mungkin menambahkan beberapa pengamat juga, kan? Bisakah Anda memberikan beberapa contoh dari apa yang Anda anggap lebih tepat untuk dimasukkan ke dalam setter?
phi
memang, pengamat itu benar. Adapun hal-hal yang sesuai untuk penyetel, saya membiarkan pengembang yang lebih berpengalaman menjawab pertanyaan ini.
Arseni Mourzenko

Jawaban:

44

Apakah dianggap praktik yang buruk untuk menambahkan logika di setter properti?

Tidak

Properti diciptakan untuk memungkinkan desainer kelas untuk memiliki logika yang melekat pada antarmuka yang mudah diakses dan tugas lapangan.

Seberapa banyak? Itu tergantung pada tanggung jawab kelas. Berikut adalah beberapa hal yang masuk akal untuk dimasukkan ke dalam setter properti:

  • perbarui beberapa nilai turunan
  • beri tahu pengamat bahwa keadaan kelas telah berubah
  • menyebarkan perubahan ke beberapa objek yang terkandung
  • menyebarkan perubahan ke toko dukungan
  • melakukan validasi

Pemrograman lebih mudah ketika kelas memiliki antarmuka yang membuat jelas apa yang dapat dilakukan kelas, tanpa membuat penelepon berpikir tentang bagaimana hal itu dilakukan. Menempatkan logika di belakang properti setter memungkinkan kelas untuk menyembunyikan implementasi mereka di belakang antarmuka yang sederhana. Untuk beberapa kelas, tidak ada metode yang diperlukan. Putar saja kenop dengan mengatur properti dan baca output dengan mendapatkan properti.

kevin cline
sumber
13
Lakukan validasi ...
Robert Harvey
Seberapa baik memuat ulang koleksi tampilan atau tampilan tabel dalam metode penimpa setter?
Krishnan
15

Setter biasanya digunakan untuk mengubah keadaan suatu objek tanpa efek samping yang signifikan atau perhitungan berat, gunakan metode dan fungsi untuk itu. Alasan utama untuk implementasi setter adalah mengubah dan mempertahankan status yang valid . Jadi, membatasi rentang, mengatur bendera untuk meminta perhitungan ulang, atau menyesuaikan properti terkait benar-benar baik.

Rob van der Veer
sumber
7

Saya tidak tahu tentang tujuan C, tetapi seperti yang Anda katakan, sepertinya pertanyaan yang cukup umum untuk bahasa OO apa pun. Pertama-tama dan benar-benar terkait dengan itu, apakah memiliki setter dan getter di tempat pertama adalah masalah diskusi (dalam beberapa kasus keberadaan mereka dibenarkan oleh penggunaan kerangka kerja atau perpustakaan).

Saya percaya bahwa nama metode harus menjelaskan apa yang dilakukan dan semua metode. Selain itu dokumentasi yang terkait dengan metode itu harus menggambarkannya dengan cara yang lebih eksplisit. Dalam pengertian ini nama metode dalam bentuk "set" + {kata benda} tidak boleh memiliki efek samping selain menetapkan nilai variabel dan itu harus menjadi satu-satunya tindakan yang terkait dengannya. Memeriksa bahwa argumen itu valid, dapat diterima tetapi harus dijelaskan dalam dokumentasinya.

DPM
sumber
1
+1 untuk "apakah memiliki setter dan getter". Dan +1 lainnya untuk "nama metode harus menjelaskan apa fungsinya".
aviv