Apakah overhead metode objektif-c membuat pendekatan desain 'banyak metode kecil' tidak disarankan?

15

Saya biasanya lebih suka menggunakan metode kecil, seperti yang direkomendasikan, antara lain, Bob Martin in Clean Code . Saya juga sudah cukup membaca tentang internal Objective-C untuk memiliki setidaknya beberapa ide tentang cara kerja pengiriman pesannya ( seri bbums sangat informatif tentang hal ini).

Meskipun demikian, menyangkut optimasi prematur, saya ingin tahu apakah semua pekerjaan yang dilakukan Objective-c dengan objc_msgSend adalah, secara praktis, cukup signifikan untuk pendekatan 'banyak metode kecil' agar tidak disarankan untuk proyek Objective-C.

Temuan empiris sangat disambut (mungkin saya akan membuat tes sendiri kapan-kapan). Pengalaman dari siapa pun yang telah menulis proyek objektif-c besar juga akan bagus.

Klarifikasi

Nada umum pertanyaan itu disengaja. Saya tidak bertanya tentang penyempurnaan kinerja aplikasi tertentu (itulah sebabnya saya bertanya di sini daripada pada SO), tetapi lebih banyak tentang apakah karakteristik bahasa Objective-C menghambat pendekatan desain tertentu. Saya telah mengamati bahwa banyak kode yang saya lihat dari Apple, dan pihak lain (pada github dll) cenderung ke metode besar (dan kelas), dan saya bertanya-tanya apakah ini bias yang telah merangkak masuk karena bahasa diri. Tentu saja saya mungkin telah membaca kode yang salah, atau mungkin faktor budaya daripada faktor teknis yang mengarah pada kecenderungan jika ada.

(Untuk apa nilainya, saya sedang menulis Objective-C, dan saya menggunakan metode kecil)

Permintaan lebih lanjut

Saya setuju dengan kedua jawaban yang telah diberikan. Satu hal lagi yang saya ingin adalah seseorang untuk mengarahkan saya ke open source (mudah-mudahan substansial) (atau terlihat) kode-objektif C yang menggunakan metode pendek yang bagus (dan kelas kecil). Saya belum melihat apa pun di Objective-C yang belum dibandingkan dengan (misalnya) sumber fitnesse .

Cris
sumber
1
Mike Ash memiliki beberapa pasang tulisan bagus yang menunjukkan angka untuk Leopard dan iOS . Saya belum mencerna ini sepenuhnya, tetapi tampaknya untuk IMP yang di-cache biaya overhead dapat diabaikan, dan bahkan dalam pengiriman yang membutuhkan pencarian, itu cukup kecil. Jika kesan cepat ini benar, tampaknya metode kecil mungkin berdiri atau jatuh dengan alasan desain yang sama di ObjC seperti dalam bahasa lainnya.
Cris
1
Jika Anda ingin menghindari overhead itu, gunakan fungsi C.
sayap kanan
Secara teknis mungkin, tetapi banyak yang hilang dengan fungsi. Saya hanya akan mengganti metode dengan fungsi untuk bagian kode yang ditargetkan dan peka terhadap kinerja. Saya bertanya di sini tentang apakah overhead cukup bermasalah untuk mempertimbangkan kembali gaya pengkodean / desain yang disukai.
Cris
Lihat Biaya pengiriman pesan di Objective-C pada SO untuk beberapa jawaban yang baik.
Caleb
Mengapa Anda tidak sekadar membuat profil kode Anda dalam Xcode? Saya mengerti bahwa Anda bertanya secara abstrak dan bukan tentang kode tertentu, tetapi karena Anda tampaknya memiliki beberapa kode dengan banyak metode kecil, mengapa tidak menjalankannya dan lihat sendiri?
Caleb

Jawaban:

4

Saya tidak benar-benar tahu apakah overhead dapat diabaikan atau tidak. Tapi, saya lebih suka merancang sistem agar mudah dimengerti dan dipelihara dulu , dan itu biasanya berarti metode dan kelas yang kecil dan terfokus. Ini bahkan akan membantu dengan penyetelan kode selanjutnya juga (hanya karena kode lebih mudah dikelola). Juga, penting untuk membuat profil kode untuk menemukan kemacetan nyata, yang mungkin bahkan tidak terkait dengan overhead panggilan metode. Jika Anda melakukan operasi di luar proses (mis. Panggilan ke database, jaringan, sistem file), ini cenderung mendominasi runtime program.

Tapi, seperti biasa, jarak tempuh Anda mungkin berbeda ...

Jordão
sumber
Tentu saja saya setuju dengan semua ini (lihat referensi 'Paman Bob' dalam pertanyaan). Tetapi jika suatu bahasa tidak cocok secara umum untuk pendekatan desain kasus terbaik tertentu, programmer mungkin membuat pilihan lain. Saya belum melihat banyak kode Objective-C yang benar-benar mengikuti metode kecil (dan kelas, dalam hal ini pendekatan), dan saya bertanya-tanya mengapa. Saya akan menambahkan catatan ke pertanyaan.
Cris
@ Chris: "Saya belum melihat banyak kode Objective-C yang benar-benar mengikuti metode kecil" -> Hanya ingin tahu: dari tubuh kode apa Anda menarik kesimpulan seperti itu? Saya percaya akan hal itu, tetapi saya juga percaya bahwa itu bukan karena kesadaran akan optimasi mikro, tetapi lebih banyak programmer yang tidak fokus pada prinsip-prinsip desain dan pemeliharaan yang baik. Dengan kata lain, Java, C #, Ruby atau kode apa pun mereka harus mengikuti praktik yang sama ...
Jordão
Ya, itu sangat mungkin. Saya tidak memiliki basis kode tertentu dalam pikiran; hanya apa yang saya lihat selama setahun atau lebih saya telah bekerja dengan Objective-C. Seperangkat kode terbesar yang pernah saya lihat adalah hal-hal open-source dari grup Omni, dan IIRC yang memiliki banyak metode besar. Kode sampel Apple juga sering dilakukan. Tapi tentu saja (a) kode sampel hanya itu, dan (b) sampel saya mungkin tertimbang terhadap kode UI, khususnya pengontrol tampilan, dan ini dapat dikodekan secara berbeda dari lapisan yang lebih dalam.
Cris
2

Sebagian besar kode tidak akan menjadi kinerja-kritis dalam aplikasi apa pun , jadi meskipun metode overhead signifikan dibandingkan dengan bahasa lain, pendekatan optimal masih akan memiliki banyak metode kecil di sebagian besar tempat dan hanya sebatas yang membuat profil. telah terbukti kritis terhadap kinerja.

Tentu saja, ada banyak orang yang tidak tahu cara mengoptimalkan dengan benar, dan beberapa dari mereka mungkin tahu tentang metode overhead dan terlibat dalam tindakan optimasi prematur global, tetapi saya tidak percaya bahwa grup cukup besar untuk memiliki dampak yang signifikan pada ekosistem Objective-C.

Metode dan kelas besar jauh lebih mungkin untuk menjadi karya kelompok besar orang-orang yang tidak tahu atau tidak peduli tentang profiler, metode overhead atau desain yang tepat, dan yang akan cenderung menghasilkan Balls of Mud dalam bahasa apa pun . Dan ya, beberapa dari orang-orang itu bekerja pada basis kode profil tinggi di perusahaan perangkat lunak utama.

Michael Borgwardt
sumber