Properti vs Metode

147

Pertanyaan singkat: Kapan Anda memutuskan untuk menggunakan properti (dalam C #) dan kapan Anda memutuskan untuk menggunakan metode?

Kami sibuk berdebat ini dan menemukan beberapa area di mana masih diperdebatkan apakah kami harus menggunakan properti atau metode. Salah satu contohnya adalah ini:

public void SetLabel(string text)
{
    Label.Text = text;
}

Sebagai contoh, Labeladalah kontrol pada halaman ASPX. Apakah ada prinsip yang dapat mengatur keputusan (dalam hal ini) apakah akan menjadikan ini metode atau properti.

Saya akan menerima jawaban yang paling umum dan komprehensif, tetapi itu juga menyentuh contoh yang telah saya berikan.

Trumpi
sumber
2
-1 pertanyaan ini telah ditanyakan dan dijawab sebelumnya: stackoverflow.com/questions/164527/…
Elemen
Pro dan kontra metode / bidang / properti dapat menimbulkan perdebatan panjang; beberapa penggunaan umum untuk properti: ketika Anda menginginkan bidang pribadi / terproteksi tetapi pada saat yang sama Anda ingin mengeksposnya. Penggunaan lain adalah memiliki tidak hanya pernyataan tetapi juga ekspresi (tindakan jika Anda suka) bahkan if()cek (sesuai MSDN). Tetapi ini rumit karena pengguna tidak selalu menyadari biaya pemrosesan di balik mengakses variabel (properti) (yaitu kode tidak tersedia) dan untuk alasan ketat seseorang harus membandingkan properti. Oh, dan "bonus" Anda tidak dapat menggunakan pointer dengan properti.
mireazma
Meskipun -1 diberikan di atas, saya menemukan utas ini lebih memperkaya daripada yang lain ... itulah kekuatan pemungutan suara
Marcelo Scofano

Jawaban:

154

Dari bagian Memilih Antara Properti dan Metode Panduan Desain untuk Mengembangkan Perpustakaan Kelas:

Secara umum, metode merepresentasikan tindakan dan properti merepresentasikan data. Properti dimaksudkan untuk digunakan seperti bidang, yang berarti bahwa properti tidak boleh rumit secara komputasi atau menghasilkan efek samping. Jika tidak melanggar pedoman berikut, pertimbangkan untuk menggunakan properti, daripada metode, karena pengembang yang kurang berpengalaman akan menganggap properti lebih mudah digunakan.

Ken Browning
sumber
3
Meskipun saya setuju dengan banyak hal itu, saya rasa bagian tentang efek samping itu tidak tepat. Misalnya, "Warna" sering kali merupakan properti suatu objek, dan memiliki efek samping yang jelas (mengubah warna suatu objek). Mengubah properti memiliki efek samping yang jelas dari perubahan status objek.
Erik Funkenbusch
47
Mystere Man mengubah Warna adalah efek yang diinginkan bukan efek samping. Efek samping adalah sesuatu yang tidak dimaksudkan dalam tindakan utama.
Muhammad Hasan Khan
2
@Mystere Man: pasti mengubah warna bukanlah efek samping, saya setuju sepenuhnya dengan jawaban ini
Ahmed Said
2
"Karena pengembang yang kurang berpengalaman merasa properti lebih mudah digunakan." - Seperti yang saya lihat, inilah satu-satunya alasan untuk mengekspos properti. Tapi apakah saya benar?
Tsabo
3
Apa perbedaan dalam implementasi internal properti vs metode. Apakah ada yang didorong ke tumpukan panggilan setiap kali properti digunakan? Jika tidak, bagaimana lagi cara menanganinya?
Praveen
62

Ya, jika semua yang Anda lakukan adalah mendapatkan dan mengatur, gunakan properti.

Jika Anda melakukan sesuatu yang kompleks yang dapat memengaruhi beberapa anggota data, metode yang lebih tepat. Atau jika pengambil Anda mengambil parameter atau penyetel Anda membutuhkan lebih dari satu parameter nilai.

Di tengah adalah area abu-abu di mana garis bisa sedikit kabur. Tidak ada aturan yang tegas dan cepat dan orang yang berbeda terkadang tidak setuju apakah sesuatu harus menjadi properti atau metode. Yang penting adalah menjadi (secara relatif) konsisten dengan cara Anda melakukannya (atau cara tim Anda melakukannya).

Mereka sebagian besar dapat dipertukarkan tetapi properti memberi sinyal kepada pengguna bahwa penerapannya relatif "sederhana". Oh dan sintaksnya sedikit lebih bersih.

Secara umum, filosofi saya adalah jika Anda mulai menulis nama metode yang dimulai dengan get atau set dan mengambil nol atau satu parameter (masing-masing) maka itu adalah kandidat utama untuk sebuah properti.

cletus
sumber
1
Suara negatif. Ini tidak benar. Kompleksitas pengambil atau penyetel dikemas dalam kode pengambil / penyetel. Betapa rumitnya itu tidak relevan sama sekali, juga tidak jika "mempengaruhi beberapa anggota data" Memang benar bahwa parameter non-standar atau banyak akan membutuhkan metode, tetapi jika tidak, jawaban ini tidak akurat.
Hal50000
Kalimat pertama menjelaskan semuanya. Bravo.
SWIIWII
13

Properti adalah cara untuk memasukkan atau mengambil data dari suatu objek. Mereka membuat abstraksi atas variabel atau data di dalam kelas. Mereka serupa dengan getter dan setter di Java.

Metode merangkum operasi.

Secara umum saya menggunakan properti untuk mengekspos bit tunggal data, atau kalkulasi kecil pada kelas, seperti pajak penjualan. Yang diperoleh dari jumlah item dan biayanya di keranjang belanja.

Saya menggunakan metode saat membuat operasi, seperti mengambil data dari database. Setiap operasi yang memiliki bagian yang bergerak, adalah kandidat untuk suatu metode.

Dalam contoh kode Anda, saya akan membungkusnya di properti jika saya perlu mengaksesnya di luar kelas yang berisi:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Mengatur teks:

Title.Text = "Properties vs Methods";

Jika saya hanya mengatur properti Teks dari Label, inilah cara saya melakukannya:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Mengatur teks:

Title = "Properties vs Methods";
Chuck Conway
sumber
12

Jika Anda menyetel properti sebenarnya dari objek Anda, maka Anda menggunakan properti.

Jika Anda melakukan tugas / fungsionalitas maka Anda menggunakan metode.

Dalam contoh Anda, ini adalah properti pasti yang sedang ditetapkan.

Namun, jika fungsionalitas Anda adalah AppendToLabel maka Anda akan menggunakan metode.

Robin Day
sumber
11

Mencari melalui MSDN, saya menemukan referensi tentang Properti vs Metode yang memberikan beberapa pedoman hebat untuk membuat metode:

  • Operasi tersebut adalah konversi, seperti Object.ToString.
  • Operasi ini cukup mahal sehingga Anda ingin menyampaikan kepada pengguna bahwa mereka harus mempertimbangkan untuk menyimpan hasilnya.
  • Mendapatkan nilai properti menggunakan get accessor akan memiliki efek samping yang dapat diamati.
  • Memanggil anggota tersebut dua kali berturut-turut menghasilkan hasil yang berbeda.
  • Urutan eksekusi itu penting. Perhatikan bahwa properti suatu tipe harus dapat disetel dan diambil dalam urutan apa pun.
  • Anggota tersebut statis tetapi mengembalikan nilai yang dapat diubah.
  • Anggota mengembalikan sebuah array. Properti yang mengembalikan array bisa sangat menyesatkan. Biasanya perlu untuk mengembalikan salinan larik internal sehingga pengguna tidak dapat mengubah keadaan internal. Ini, ditambah dengan fakta bahwa pengguna dapat dengan mudah menganggapnya sebagai properti yang diindeks, menyebabkan kode yang tidak efisien.
Gavin Miller
sumber
Saya setuju bahwa ini masuk akal jika berlaku. Tapi apakah saya benar, bahwa menggunakan properti melalui XAML yang mengikat di WPF tidak menyisakan pilihan selain melakukan tindakan yang sesuai di penyetel? (terutama pada SelectedItem baru untuk ComboBoxes, ListBoxes, dll.)
Nicolas
9

Anda hanya perlu melihat nama ... "Properti". Apa artinya? Kamus mendefinisikannya dengan banyak cara, tetapi dalam hal ini "atribut atau kualitas yang esensial atau berbeda atau kualitas sesuatu" paling cocok.

Pikirkan tentang tujuan tindakan tersebut. Apakah Anda, pada kenyataannya, mengubah atau mendapatkan kembali "atribut yang esensial atau berbeda"? Dalam contoh Anda, Anda menggunakan fungsi untuk menyetel properti kotak teks. Kedengarannya konyol, bukan?

Properti sebenarnya adalah fungsi. Mereka semua dikompilasi menjadi getXXX () dan setXXX (). Itu hanya menyembunyikannya dalam gula sintaksis, tetapi gula itulah yang memberikan makna semantik pada proses tersebut.

Pikirkan tentang properti seperti atribut. Mobil memiliki banyak atribut. Warna, MPG, Model, dll. Tidak semua properti dapat disetel, beberapa dapat dihitung.

Sedangkan Metode adalah tindakan. GetColor harus menjadi properti. GetFile () harus berupa sebuah fungsi. Aturan praktis lainnya adalah, jika itu tidak mengubah status objek, maka itu harus menjadi fungsi. Misalnya, CalculatePiToNthDigit (n) harus berupa fungsi, karena fungsi ini tidak benar-benar mengubah status objek Matematika yang dilampirkan.

Ini mungkin sedikit bertele-tele, tetapi intinya adalah memutuskan apa objek Anda, dan apa yang mereka wakili. Jika Anda tidak tahu apakah itu harus menjadi properti atau fungsi, mungkin tidak masalah yang mana.

Erik Funkenbusch
sumber
9

Properti secara simbolis adalah atribut objek Anda. Metode adalah perilaku objek Anda.

Label adalah sebuah atribut dan lebih masuk akal untuk menjadikannya sebagai properti.

Dalam hal Pemrograman Berorientasi Objek, Anda harus memiliki pemahaman yang jelas tentang apa itu bagian dari perilaku dan apa yang hanya atribut.

Mobil {Warna, Model, Merek}

Sebuah mobil memiliki atribut Warna, Model dan Merek oleh karena itu tidak masuk akal untuk memiliki metode SetColor atau SetModel karena secara simbolis kita tidak meminta Mobil untuk mengatur warnanya sendiri.

Jadi jika Anda memetakan kasus properti / metode ke objek kehidupan nyata atau melihatnya dari sudut pandang symantic, kebingungan Anda akan hilang.

Muhammad Hasan Khan
sumber
4

Juga nilai tambah besar untuk Properti adalah bahwa nilai properti dapat dilihat di Visual Studio selama debugging.

David Karlaš
sumber
3

Saya lebih suka menggunakan properti untuk menambahkan / mengatur metode dengan 1 parameter. Jika parameter lebih banyak, gunakan metode.

abatishchev
sumber
3

Properti seharusnya hanya set sederhana dan mendapatkan satu liner. Lebih dari itu dan itu benar-benar harus dipindahkan ke suatu metode. Kode kompleks harus selalu dalam metode.

Neil Bostrom
sumber
3

Saya hanya menggunakan properti untuk akses variabel, yaitu mendapatkan dan menyetel variabel individual, atau mendapatkan dan menyetel data dalam kontrol. Segera setelah segala jenis manipulasi data diperlukan / dilakukan, saya menggunakan metode.

Marcus L.
sumber
3

Sebagai masalah desain Properti mewakili Data atau Atribut objek kelas, Sedangkan metode adalah tindakan atau perilaku objek kelas.

Di .Net, dunia ada implikasi lain menggunakan Properties:

  • Properti digunakan dalam Penyatuan Data, sedangkan metode get_ / set_ tidak.
  • Properti pengguna serialisasi XML sebagai mekanisme alami serilisasi.
  • Properti diakses oleh kontrol PropertyGrid dan ICustomTypeDescriptor internal , yang dapat digunakan secara efektif jika Anda menulis perpustakaan kustom.
  • Properti dikontrol oleh Atribut , seseorang dapat menggunakannya dengan bijak untuk merancang perangkat lunak Berorientasi Aspek.

Kesalahpahaman (IMHO) tentang penggunaan Properti:

  • Digunakan untuk mengekspos kalkulasi kecil: Blok get ControlDesigner.SelectionRules berjumlah 72 baris !!
  • Digunakan untuk mengekspos struktur Data internal: Meskipun properti tidak dipetakan ke anggota data internal, seseorang dapat menggunakannya sebagai properti, jika itu adalah atribut kelas Anda. Viceversa, meskipun atribut properti kelas Anda tidak disarankan, untuk mengembalikan array seperti anggota data (sebagai gantinya, metode digunakan untuk mengembalikan salinan dalam anggota.)

Dalam contoh di sini bisa saja ditulis, dengan lebih banyak arti bisnis sebagai:

public String Title
{
    set { Label.Text = text; }
}
NileshChauhan
sumber
2

Properti sangat bagus karena dapat diakses oleh perancang visual studio visual, asalkan mereka memiliki akses.

Mereka digunakan jika Anda hanya mengatur dan mendapatkan dan mungkin beberapa validasi yang tidak mengakses sejumlah besar kode. Hati-hati karena membuat objek kompleks selama validasi tidaklah sederhana.

Metode lain adalah cara yang disukai.

Ini bukan hanya tentang semantik. Penggunaan properti yang tidak tepat mulai menimbulkan keanehan pada perancang visual studio visual.

Misalnya saya mendapatkan nilai konfigurasi dalam properti kelas. Kelas konfigurasi sebenarnya membuka file dan menjalankan kueri sql untuk mendapatkan nilai konfigurasi itu. Hal ini menyebabkan masalah pada aplikasi saya di mana file konfigurasi akan dibuka dan dikunci oleh studio visual itu sendiri daripada aplikasi saya karena tidak hanya membaca tetapi menulis nilai konfigurasi (melalui metode penyetel). Untuk mengatasinya, saya hanya perlu mengubahnya menjadi sebuah metode.

Jeremy Edwards
sumber
1

Berikut adalah seperangkat pedoman yang baik tentang kapan menggunakan properti vs metode dari Bill Wagner

  • Gunakan Properti jika semua ini benar: Getter harus sederhana dan oleh karena itu tidak mungkin memberikan pengecualian. Perhatikan bahwa ini berarti tidak ada akses jaringan (atau database). Salah satunya mungkin gagal, dan karena itu akan mengeluarkan pengecualian.
  • Mereka seharusnya tidak memiliki ketergantungan satu sama lain. Perhatikan bahwa ini termasuk menyetel satu properti dan membuatnya memengaruhi properti lain. (Misalnya, menyetel properti FirstName akan memengaruhi properti FullName read-only yang menyusun properti nama depan + nama belakang menyiratkan ketergantungan seperti itu)
  • Mereka harus dapat diatur dalam urutan apa pun
  • Pengambil tidak memiliki efek samping yang dapat diamati. Catatan pedoman ini tidak menghalangi beberapa bentuk evaluasi malas dalam sebuah properti.
  • Metode tersebut harus selalu segera kembali. (Perhatikan bahwa ini menghalangi properti yang membuat panggilan akses database, panggilan layanan web, atau operasi serupa lainnya).
  • Gunakan metode jika anggota mengembalikan array.
  • Panggilan berulang ke pengambil (tanpa kode intervensi) harus mengembalikan nilai yang sama.
  • Panggilan berulang ke setter (dengan nilai yang sama) seharusnya tidak menghasilkan perbedaan dari satu panggilan.

  • Get tidak boleh mengembalikan referensi ke struktur data internal (Lihat item 23). Suatu metode dapat mengembalikan salinan dalam, dan dapat menghindari masalah ini.

* Diambil dari jawaban saya untuk pertanyaan duplikat.

Chris Ballance
sumber
Jawaban teratas & diterima di sini stackoverflow.com/a/1294189/1551 Mengapa memilih downvote?
Chris Ballance
3
Saya menyadari saya agak terlambat ke pesta, tetapi suara negatif itu kemungkinan besar muncul karena Anda menyalin-tempel jawaban Anda. Dengan menyalin tempel, Anda mengakui bahwa pertanyaan ini pada dasarnya adalah duplikat dari pertanyaan lainnya. Karena itu, Anda seharusnya menandainya sebagai duplikat alih-alih menjawabnya. Saya sarankan melihat artikel di Meta untuk mengetahui bagaimana pertanyaan duplikat harus ditangani.
JoshuaTheMiller
0

Ini sederhana.

1: Gunakan properti ketika Anda ingin data Anda harus divalidasi sebelum disimpan di lapangan. Jadi dengan cara ini properti menyediakan enkapsulasi untuk bidang Anda. Karena jika Anda meninggalkan bidang Anda, pengguna akhir publik dapat menetapkan nilai apa pun yang mungkin atau mungkin tidak valid sesuai kebutuhan bisnis Anda seperti usia harus lebih dari 18. Jadi sebelum nilai menyimpan bidang yang sesuai, kita perlu memeriksa validitasnya. Dengan cara ini properti merepresentasikan data.

2: Gunakan metode ketika Anda ingin melakukan beberapa tindakan seperti Anda menyediakan beberapa data sebagai parameter dan metode Anda melakukan beberapa pemrosesan berdasarkan nilai yang diberikan dan mengembalikan nilai yang diproses sebagai output. Atau Anda ingin mengubah nilai beberapa bidang dengan perhitungan ini. "Dengan cara ini metode merepresentasikan tindakan".

Mars
sumber
-1

Saya berasal dari java dan saya menggunakan get .. set .. method untuk sementara waktu.

Ketika saya menulis kode, saya tidak bertanya pada diri sendiri: "mengakses data ini sederhana atau memerlukan proses yang berat?" karena banyak hal dapat berubah (hari ini mendapatkan kembali properti ini sederhana, tomonrow dapat memerlukan beberapa atau proses yang berat).

Hari ini saya memiliki metode SetAge (int age) tomonrow saya juga akan memiliki metode SetAge (tanggal lahir) yang menghitung usia menggunakan tanggal lahir.

Saya sangat kecewa bahwa compiler mengubah properti dalam get dan set tetapi tidak menganggap metode Get ... and Set .. saya sebagai sama.

Marco Staffoli
sumber