Apakah orang banyak menggunakan const saat pemrograman di Objective C?

Jawaban:

21

Karena cara objek Objective-C bekerja, constmenyerah 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 NSStringargumen 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 constatau finalobjek referensi dalam bahasa OO lainnya.

Sebagai perbandingan, constbekerja sepenuhnya berbeda dalam C ++. Jika saya mendapatkan constreferensi ke objek C ++, saya hanya diizinkan memanggil constfungsi 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 mutableoleh perancang kelas. Jadi bayangkan saya memiliki beberapa tipe MutableStringC ++ yang setara dengan NSMutableStringdi 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 constoperasi, fungsi menghapus constkualifikasi 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".


sumber
Terima kasih. Jadi tidak ada cara untuk mencegah modifikasi melalui const modifier.
user4951
Baik. Kompiler masih memperlakukan constdekorasi 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.
5
Saya percaya constmasih bisa berguna di Objective C untuk menyatakan bahwa pointer ke suatu objek tidak pernah ditugaskan untuk menunjuk ke objek yang berbeda . Yaitu dengan NSString * const xAnda tahu bahwa xakan selalu string yang sama dan bukan string yang berbeda.
tboyce12
3

Sejauh Objective C pergi - saya tidak memprogram di dalamnya, jadi tidak bisa menjawab pertanyaan. Pertanyaan yang saya bisa jawab adalah "Haruskah orang constbanyak 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 consts, sampai suatu hari sesuatu yang buruk terjadi dan mereka memiliki momen "Ah ha" - "Oh, itulah constgunanya". 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 constkarena 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.

mattnz
sumber
0

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.

pengguna4951
sumber