Karena cara objek Objective-C bekerja, const
menyerah menjadi penegakan dan mulai menjadi notasi untuk programmer. Pertimbangkan program ini:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Itu sebenarnya tidak akan dikompilasi di sini (saya menggunakan dentang): kompiler dapat mendeteksi upaya untuk memodifikasi tipe C primitif dan memancarkan kesalahan. Tetapi sekarang bandingkan dengan program ini:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
Meskipun fungsinya meneruskan pointer konstan ke objek konstan, masih mungkin untuk bermutasi objek.
Dalam pemrograman berorientasi objek, cara terbaik untuk menegakkan sifat konstan suatu objek adalah membuat objek tersebut tidak dapat diubah - yaitu tidak menyediakan metode apa pun yang dapat mengubah keadaannya. Bayangkan bahwa fungsi di atas mengambil NSString
argumen alih-alih NSMutableString
, dan bahwa saya telah melewatkan literal @"Hello"
alih-alih salinan yang dapat diubah. Saat ini, secara wajar, tidak ada peluang untuk memutasikan objek yang lewat [*]. Objective-C tidak memiliki cara untuk menegakkan itu, tidak seperti const
atau final
objek referensi dalam bahasa OO lainnya.
Sebagai perbandingan, const
bekerja sepenuhnya berbeda dalam C ++. Jika saya mendapatkan const
referensi ke objek C ++, saya hanya diizinkan memanggil const
fungsi anggota pada objek itu. Fungsi-fungsi ini menjaga const
-ness objek, baik dengan tidak membuat perubahan atau dengan hanya memodifikasi variabel anggota yang secara eksplisit telah ditandai mutable
oleh perancang kelas. Jadi bayangkan saya memiliki beberapa tipe MutableString
C ++ yang setara dengan NSMutableString
di Objective-C. Setara dengan contoh saya di atas akan terlihat seperti:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Ini pasti tidak akan dikompilasi: selain appendString()
tidak menjadi const
operasi, fungsi menghapus const
kualifikasi dari referensi tipe yang membutuhkan a const_cast
.
[*] Saya berharap ada beberapa cara yang berbelit-belit untuk melakukannya, tetapi sekarang kita masuk ke ranah satu programmer mencoba menyabotase yang lain dengan melakukan hal-hal "pintar".
const
dekorasi sebagai sesuatu yang berarti sehingga Anda mendapatkan contortions seperti alias atau gips untuk menekan peringatan, tetapi tidak ada perubahan pada perilaku program sebagai akibat dari contortions ini.const
masih bisa berguna di Objective C untuk menyatakan bahwa pointer ke suatu objek tidak pernah ditugaskan untuk menunjuk ke objek yang berbeda . Yaitu denganNSString * const x
Anda tahu bahwax
akan selalu string yang sama dan bukan string yang berbeda.Sejauh Objective C pergi - saya tidak memprogram di dalamnya, jadi tidak bisa menjawab pertanyaan. Pertanyaan yang saya bisa jawab adalah "Haruskah orang
const
banyak menggunakan saat pemrograman di Objective C?" - yang itu adalah "Ya" yang pasti.Constness pada dasarnya adalah fitur keamanan perangkat lunak yang digunakan untuk membuat program lebih dapat diandalkan dan dipelihara. Banyak programmer tumbuh tanpa benar-benar menghargai nilai
const
s, sampai suatu hari sesuatu yang buruk terjadi dan mereka memiliki momen "Ah ha" - "Oh, itulahconst
gunanya". Sangat mungkin untuk menulis program tanpa konstanta, hampir tidak mungkin untuk membuat program seperti itu dapat diandalkan.Banyak contoh kode tidak benar-benar program, hanya cuplikan yang dirancang untuk menampilkan fitur tertentu. Mereka tidak menggunakannya
const
karena mengalihkan perhatian dari titik sampel mencoba untuk membuat. Jenis kode lain yang Anda lihat adalah kode yang ditulis oleh programmer yang tidak berpengalaman yang mendasarkan apa yang mereka lakukan pada contoh yang telah mereka pelajari, atau mereka yang tahu tentang konstanta, dan terlalu malas untuk menggunakannya.sumber
Saya sudah lama tidak menggunakan objektif-c.
Namun, saya heran mengapa tidak ada orang yang menyebutkan aspek ini.
Objective-c sudah memiliki sesuatu yang berhubungan dengan konstanta. Mutabilitas
Sebagai contoh, Nstring * akan menunjuk ke string yang konstan. Jika Anda ingin string yang dapat Anda modifikasi, Anda menggunakan NMutableString atau sesuatu seperti itu. NMutableString itu akan memberikan metode tambahan yang memungkinkan orang untuk memodifikasi string.
Sekarang, bagaimana jika Anda ingin pointer itu sendiri menjadi konstanta. Saya tidak pernah perlu khawatir tentang hal itu ketika mengkode proyek yang sangat besar.
Jadi saya pikir itu sebabnya.
sumber