Properti di bawah ARC: Selalu atau hanya publik?

9

Setelah membaca sebuah artikel dengan rendah hati bernama "Perintah Kode: Praktik Terbaik untuk Pengodean Objective-C" oleh Robert McNally sedikit kurang dari dua tahun yang lalu, saya mengadopsi praktik menggunakan properti untuk hampir setiap anggota data kelas Objective-C saya ( perintah ke 3 pada Mei 2012). McNally mencantumkan alasan ini untuk melakukan hal itu (penekanan saya):

  1. Properti memberlakukan pembatasan akses (seperti hanya baca)
  2. Properti menegakkan kebijakan manajemen memori (kuat, lemah)
  3. Properti memberikan peluang untuk mengimplementasikan setter dan pengambil kustom secara transparan.
  4. Properti dengan setter atau pengambil kustom dapat digunakan untuk menegakkan strategi keselamatan ulir.
  5. Memiliki satu cara untuk mengakses variabel instan meningkatkan pembacaan kode.

Saya menempatkan sebagian besar properti saya dalam kategori pribadi, jadi nomor 1 dan 4 biasanya bukan masalah yang saya hadapi. Argumen 3 dan 5 lebih 'lunak', dan dengan alat yang tepat dan konsistensi lainnya mereka bisa menjadi non-isu. Jadi akhirnya, bagi saya argumen yang paling berpengaruh adalah nomor 2, manajemen memori. Saya sudah melakukan ini sejak itu.

@property (nonatomic, strong) id object; // Properties became my friends.

Untuk beberapa proyek terakhir saya, saya telah beralih menggunakan ARC, yang membuat saya ragu apakah membuat properti untuk hampir semua hal masih merupakan ide bagus atau mungkin sedikit berlebihan. ARC menangani memori yang mengelola objek Objective-C untuk saya, yang bagi sebagian besar stronganggota berfungsi dengan baik jika Anda hanya mendeklarasikan ivars. Tipe C yang harus Anda kelola secara manual, sebelum dan sesudah ARC, dan weakpropertinya kebanyakan milik publik.

Tentu saja saya masih menggunakan properti untuk apa pun yang membutuhkan akses dari luar kelas, tetapi kebanyakan hanya segelintir properti, sementara sebagian besar anggota data terdaftar sebagai ivars di bawah header implementasi

@implementation GTWeekViewController
{
    UILongPressGestureRecognizer *_pressRecognizer;
    GTPagingGestureRecognizer *_pagingRecognizer;
    UITapGestureRecognizer *_tapRecognizer;
}

Sebagai percobaan saya telah melakukan ini sedikit lebih ketat, dan pindah dari properti untuk semuanya memiliki beberapa efek samping positif yang bagus.

  1. Persyaratan kode anggota data ( @property/ @synthesize) menyusut menjadi hanya deklarasi ivar.
  2. Sebagian besar self.somethingreferensi saya dibersihkan hingga adil _something.
  3. Sangat mudah dibedakan mana data anggota yang bersifat pribadi (ivar) dan mana yang bersifat publik (properti).
  4. Terakhir, rasanya 'lebih seperti ini adalah tujuan dari properti yang dimaksudkan Apple, tapi itu spekulasi subyektif.

Pada pertanyaan : Saya perlahan-lahan meluncur ke sisi gelap, menggunakan lebih sedikit dan lebih sedikit properti yang mendukung implementasi-ivars. Dapatkah Anda memberi saya sedikit alasan mengapa saya harus tetap menggunakan properti untuk semuanya, atau mengkonfirmasi pemikiran saya saat ini tentang mengapa saya harus menggunakan lebih banyak ivars dan lebih sedikit properti hanya jika diperlukan? Jawaban paling persuasif untuk kedua belah pihak akan menerima nilai saya.

EDIT: McNally menimbang di Twitter, mengatakan : "Saya pikir alasan utama saya untuk tetap menggunakan properti adalah: satu cara untuk melakukan segalanya, itu melakukan segalanya (termasuk KVC / KVO.)"

Epologee
sumber

Jawaban:

5

Dapatkah Anda memberi saya sedikit alasan mengapa saya harus tetap menggunakan properti untuk semuanya, atau mengkonfirmasi pemikiran saya saat ini tentang mengapa saya harus menggunakan lebih banyak ivars dan lebih sedikit properti hanya jika diperlukan?

Saat ini, saya pikir itu adil untuk mengatakan bahwa itu sebagian besar masalah gaya. Seperti yang Anda katakan, manfaat manajemen memori dari properti kurang penting dengan ARC. Di sisi lain, "manfaat" untuk kembali ke akses ivar langsung juga tidak terlalu menarik:

  1. Deklarasi properti @ sangat mirip dengan deklarasi ivar. Menghindari arahan @synthesize sepertinya bukan kemenangan besar - kita tidak berbicara tentang banyak kode.

  2. The foo.somethingsintaks ini bisa dibilang jauh lebih baik daripada _something. Sintaks akses properti jelas dirancang agar terlihat seperti dan bekerja seperti sintaks dot C untuk mengakses anggota struktur. Menjadi eksplisit tentang objek yang Anda akses (apakah itu selfatau sesuatu yang lain) sangat membantu. (Beberapa orang - bukan saya! - menganjurkan self->somethingakses ivar untuk alasan ini.) Konvensi garis bawah terkemuka untuk ivar baik-baik saja, tetapi tidak digunakan secara konsisten oleh semua kode Objective-C.

  3. Properti tampaknya merupakan pilihan yang lebih baik untuk mengakses data yang disimpan dalam objek lain dari kelas yang sama (yang diizinkan di bawah akses "pribadi") dan untuk diakses oleh subkelas (seperti "dilindungi" C ++). Jadi ide 'properties == public' agak buram.

  4. Perasaan saya adalah bahwa properti dimaksudkan untuk menyederhanakan manajemen memori dan memberikan beberapa manfaat lainnya. Seperti yang Anda katakan, dengan manfaat manajemen memori menurun, properti tampak kurang menarik.

Jalur yang Anda pilih - kembali ke akses ivar langsung untuk data internal - sepertinya merupakan pilihan yang sangat masuk akal dan tidak ada alasan yang jelas untuk mengubah jalur Anda. Tetapi berpegang teguh pada properti juga cukup masuk akal - kelemahannya tidak signifikan, dan ada beberapa manfaat bagus seperti kepatuhan KVO dan gaya akses anggota yang lebih konsisten.

Properti bukan langkah terakhir dalam evolusi Objective-C, dan saya tidak berharap bahwa ARC akan menjadi baik. Saya tidak memiliki informasi spesifik, tetapi sepertinya dugaan bagus bahwa fitur tambahan mungkin ditambahkan di beberapa titik yang membuat properti lebih menarik atau kurang menarik. Kita harus menunggu dan melihat apa yang terjadi.

Caleb
sumber
1
Hai @ Caleb, terima kasih telah meluangkan waktu dan menulis posting yang solid. Saya belum memikirkan aspek KVO. Saya memang sangat ingin tahu ke mana Apple mengambil semua ini. ARC as terasa sebagai satu dari serangkaian langkah. Saya akan menunggu untuk melihat apakah ada orang lain yang mau mempertimbangkan masalah ini, jika tidak pertimbangkan cek yang ditandai.
Epologee
1
@epologee Senang membantu. Satu lagi item untuk ditambahkan ke kolom plus untuk ivars adalah Anda dapat melihatnya dengan mudah di debugger. Itu juga berlaku untuk properti, jika Anda secara eksplisit mendeklarasikan ivar yang digunakan properti. Gula yang disintesis tidak muncul di debugger. (Saya tidak akan terkejut melihat perubahan itu suatu hari nanti.)
Caleb
-1

Saya juga telah merenungkan pertanyaan ini. Dalam Pendapat saya yang sederhana, hanya menggunakan properti untuk pengakses membuat kode jauh lebih mudah dibaca. Anda dapat segera melihat variabel apa yang dimaksudkan untuk diakses secara publik. Dan secara pribadi, selalu mengetikkan @property (...) di depan sebuah variabel memakan waktu.

Alex Boudreau
sumber
Hai Alex, saya pikir Anda lebih baik menjawab pertanyaan terbaru di sini di SE. Saya tidak setuju dengan argumen yang memakan waktu. Saya tidak menulis kode yang menghemat waktu saya dalam menulis, saya suka menulis kode yang menyelamatkan diri saya di masa depan atau waktu orang lain untuk memahaminya. Yang mengatakan, suara -1 bukan milikku. Akan menyenangkan bagi orang itu untuk mengklarifikasi suara.
Epologee