Apa kode indah di C ++, dan mengapa sebagian besar programmer sangat peduli? [Tutup]

8

Karena sebagian besar proyek menggunakan C ++ API, mereka menangani kendala API dan kendala proyek itu sendiri.

Saya seorang pemula dalam pemrograman, saya tidak suka menggunakan OOP sama sekali karena tidak ada yang berhasil menjelaskan kepada saya MENGAPA sangat penting untuk membatasi diri Anda dengan ruang lingkup pribadi untuk mencegah programmer lain untuk merusak konsistensi organisasi data dari beberapa jenis.

Saya masih bisa ok dengan OOP, karena masih memungkinkan untuk membuat beberapa hal besar seperti Qt dan Ogre3D, tetapi itu hanya API, bukan aplikasi, dan kode-kode itu harus sempurna sehingga tidak ada yang bisa mengkritik pekerjaan.

Saya tidak mengerti mengapa sebagian besar programmer, karena mereka membuat aplikasi dan bukan API, ingin melakukan kode sempurna seperti mereka merancang beberapa kode genius, dan membuang waktu untuk ini.

jokoon
sumber
19
Berikan beberapa tahun untuk kembali ke kode lama Anda yang tidak sempurna dan mencoba menambahkan fitur ke dalamnya, memperbaiki bug di dalamnya, dll. Anda akan melihat mengapa orang-orang peduli untuk mendapatkannya dengan benar dan sejelas mungkin yang pertama waktu sekitar.
R0MANARMY
Lihat (pertanyaan ini) [ programmers.stackexchange.com/q/65216/8823] . Bukan karena Anda bukan seorang programmer, tetapi karena ada beberapa deskripsi yang baik tentang mengapa kode yang indah itu baik
Austin Hyde
2
Apakah pertanyaan ini tentang kode cantik, OOP, atau ruang lingkup pribadi? Saya benar-benar tidak tahu.
Sean McMillan
1
Wow ... tidak tahu harus mulai dari mana. Semoga saya tidak pernah melihat atau bekerja dengan kode Anda ...
Rig
1
Kode yang baik dan API yang baik memiliki banyak kesamaan. Kode OOP yang baik harus memiliki antarmuka yang terlihat persis seperti API yang dirancang dengan baik.
rwong

Jawaban:

12

Pernahkah Anda mendengar pepatah "No man is an island" ?

Bagi kebanyakan programmer ini benar. Hampir tidak ada orang yang menulis kode yang "hanya sebuah aplikasi". Pada banyak aplikasi non-sepele satu programmer menulis UI yang perlu mudah dimodifikasi oleh seorang desainer. Itu juga harus memungkinkan untuk data yang jelas mengikat ke logika bisnis (Pengontrol, ViewModel, atau apa pun yang Anda ingin menyebutnya). Programmer lain menulis controller itu, yang seringkali sangat kompleks, tetapi perlu cukup sederhana agar mudah dikonsumsi oleh programmer front-end. Kode logika bisnis itu menggunakan kode dari siapa pun yang menulis lapisan data (Model, Repositori, dll.). Anda tidak harus menggunakan OOP, namun, apa yang cukup bagus untuk OOP adalah memungkinkan Anda untuk merangkum logika di balik antarmuka sehingga orang lain yang bekerja dengan Anda dapat menggunakan kode Anda tanpa merusaknya (dengan asumsi Anda menguji antarmuka itu!). Abstraksi bukan peluru perak,

Jadi, Anda mungkin berkata sekarang, "Serius, saya pengecualian dan tidak ada yang akan melihat kode saya atau bekerja sama sekali". Cukup adil, tetapi ketika Anda perlu memperbaiki bug di aplikasi itu beberapa bulan dari sekarang, atau ingin menambahkan beberapa fitur, Anda mungkin akan melihat bahwa orang yang menulis kode itu dulu dan orang yang mengubahnya sekarang adalah dua orang yang sama sekali berbeda. Kita sering berasumsi bahwa kita akan mengingat hal-hal, yang merupakan inti dari mengapa kita menulis kode ceroboh, tetapi kenyataannya adalah bahwa diri Anda enam bulan dari sekarang tidak akan mengingat peretasan yang Anda masukkan ke dalam aplikasi Anda sekarang. Diri masa depan Anda akan memiliki cukup banyak untuk dihadapi, jadi mengapa tidak memberinya istirahat?

Morgan Herlocker
sumber
43

Orang bodoh mana pun dapat menulis kode yang dapat dimengerti komputer. Pemrogram yang baik menulis kode yang dapat dimengerti manusia. ~ Martin Fowler

Singkatnya, itulah sebabnya Anda ingin peduli dengan kode yang indah.

Anda tidak menulis kode untuk komputer. Komputer hanya memahami kode biner (yang dihasilkan dari kode sumber Anda melalui kompiler dan interpreter). Itu tidak peduli tentang keindahan atau kejelasan atau bahkan apakah kode Anda melakukan apa yang seharusnya dilakukan.

Anda menulis kode untuk sesama programmer. Dan mereka melakukan hal yang sama untuk Anda. Jika Anda tidak dapat memahami sepotong kode yang ditulis oleh orang lain, maka menurut Anda apa peluang Anda untuk menemukan dan memperbaiki bug atau menambahkan fungsionalitas baru?

wolfgangsz
sumber
1
Saya akan menambahkan bahwa sangat mudah untuk menulis kode cryptic totaly dalam C ++, dan inilah mengapa ini bahkan lebih penting dalam bahasa ini!
deadalnix
1
Yah saya tidak benar-benar setuju dengan kutipan ini, kode dapat digunakan kembali adalah kode yang baik, benar, tetapi bahasa dibuat agar pemrogram dapat bekerja lebih cepat, tidak harus dibaca oleh pemrogram lain. Sangat menyakitkan untuk membaca kode, jadi memberikan komentar, atau mengubah desain untuk membuatnya lebih dimengerti oleh manusia, ya, tapi desain yang bagus tidak selalu datang dengan "mudah dimengerti". Suatu program dapat menjalankan tugas-tugas sederhana dan rumit, dan bahasa pemrograman dapat membatasi seberapa baik Anda dapat merancang aplikasi canggih. Memprogram bahasa membuat segalanya lebih mudah, bukan lebih menarik.
jokoon
3

Apa yang orang lain katakan seperti Anda tidak pernah tahu jika Anda mungkin memerlukan kode Anda lagi di masa depan adalah hal yang benar.

Tetapi bagi saya ada satu poin utama, mengapa saya selalu mencoba menulis kode yang indah:

Ini pelatihan untuk menjadi lebih baik.

Jika saya mempelajari sesuatu yang baru tentang bahasa yang saya gunakan atau tentang beberapa konsep pemrograman umum, saya segera mencoba memanfaatkannya, mencoba menjadikannya bagian dari alur kerja harian saya dan rantai alat mental.

Jika Anda hanya membaca tentang sesuatu seperti OOP, Anda akan melupakan sebagian besar dalam beberapa minggu. Dan Anda tidak akan pernah mendapatkan pelatihan cara menerapkannya dengan benar untuk masalah besar selama Anda tidak mengajar diri sendiri dengan menerapkannya pada masalah kecil.

Contoh:

Mengapa penting untuk membatasi diri Anda dengan ruang lingkup pribadi?

Dalam proyek kecil tidak. Beberapa bahasa (misalnya Ruby) bahkan mencegah enkapsulasi semacam ini sampai tingkat tertentu. Tapi ada kegunaannya. Banyak.

Dan menggunakannya disertai dengan masalah tertentu dan banyak detail yang harus Anda pelajari. Menggunakannya dalam proyek kecil akan mengajarkan Anda hal ini. Anda akan dapat melihat beberapa pesan kesalahan dari kompiler Anda yang baru bagi Anda dan dalam proyek kecil Anda akan dapat menemukan sumber masalahnya dengan lebih mudah.

Anda belajar tentang ruang nama di C ++. Tidak perlu begitu banyak bagi mereka dalam proyek-proyek kecil. Hal yang sama berlaku untuk struktur genaral file header dan termasuk. Anda dapat mempelajari semua ini sejak dini dalam perlindungan basis kode kecil.

thorsten müller
sumber
1

Ini semua tentang keharusan mempertahankan kode warisan. Dan dalam beberapa bulan kode yang Anda tulis sekarang akan menjadi kode warisan yang juga harus Anda pertahankan.

Pengkodean untuk Psikos Keras

Penjaga penjara
sumber
1
  1. Apa yang dikatakan R0MANARMY dalam komentarnya. Kode Clean & "beautiful" memudahkan Anda untuk membaca, memahami, memelihara, mengubah, dan memperbaiki di masa depan, tidak hanya untuk diri Anda sendiri, tetapi untuk orang lain yang datang setelah Anda.

  2. Beberapa orang, ketika mereka melakukan sesuatu, mencoba membuatnya menjadi yang terbaik yang mereka bisa, dengan cara terbaik, jadi itu "sempurna", atau dalam hal ini, "indah". Saya telah menemukan bahwa ada tumpang tindih besar antara set orang dan pengembang ini (termasuk saya!).

Perlu diingat, bahwa "cantik", "bersih", atau "anggun" adalah istilah yang sangat subjektif yang berarti berbeda bagi orang yang berbeda. Dari apa yang saya lihat, kode yang secara luas dianggap cantik, bersih, dan / atau elegan,

  • Mudah dibaca dan dimengerti
  • Tidak memiliki, atau sedikit, kode yang tidak perlu diletakkan di sekitar
  • Mudah diperluas dan / atau modular
  • Didokumentasikan dengan baik
  • Mengikuti standar apa pun untuk bahasa / teknologi terkait
  • Dan tidak melakukan hal yang tidak terduga (mis. Efek samping dalam metode accessor)
Austin Hyde
sumber
1

Saya setuju pada hal rawatan. Coba saja buat sendiri proyek yang relatif besar, dan Anda akan melihat semua kekacauan yang mengikat tangan Anda saat memperbaiki bug, menambahkan fitur baru, dll. Tetapi untuk berbicara tentang kecantikan:

Kode yang indah adalah kualitas produk yang diinginkan karena (setidaknya, C ++) pemrograman adalah ART.

tanaman merambat
sumber
1
Meskipun dengan diperkenalkannya lambdas sekarang tidak banyak melibatkan hiu di formaldahyde
Martin Beckett
1

[...] tidak ada yang berhasil menjelaskan kepada saya MENGAPA sangat penting untuk membatasi diri Anda dengan ruang lingkup pribadi untuk mencegah pemrogram lain merusak semacam konsistensi organisasi data.

Dalam tim yang cukup kecil dengan basis kode yang cukup kecil yang benar-benar terkoordinasi dengan baik dengan standar yang baik (bisa saja menjadi satu orang), Anda sering dapat menemukan perangkat lunak yang andal yang membiarkan semua data di tempat terbuka bagi siapa saja untuk disentuh dengan semua bidang data dari structterbuka lebar terbuka dan dengan structdefinisi terbuka lebar bagi siapa saja yang menyertakan header itu untuk diakses. Hukum Murphy tidak selalu berlaku dalam kasus-kasus itu.

Tapi saya telah bekerja dalam skenario yang berlawanan dari basis kode besar dengan jutaan LOC sejak tahun 80-an dengan tim pengembang besar dari seluruh dunia di mana kami hanya bertemu secara langsung setiap beberapa bulan, terkoordinasi secara longgar, kadang-kadang terkoordinasi secara longgar, kadang-kadang nyaris tidak berbicara bahasa yang sama, tidak ada standar pengkodean kecuali untuk SDK yang orang sering tidak mengikuti, tidak ada tes unit / integrasi, menggunakan SVN tanpa bercabang dan kadang-kadang pergi 6 minggu tanpa memeriksa kode, hanya untuk membom kami dengan bug, dan Baru pada saat itulah saya benar-benar memahami nilai menyembunyikan informasi dan mempertahankan invarian .

Saya berurusan dengan bug di mana saya bahkan tidak bisa mereproduksi masalah secara konsisten di mesin saya, dan kadang-kadang tidak ada dari kita yang bisa di antara seluruh tim. Dan ketika saya akhirnya beruntung dapat mereproduksi masalah yang dilaporkan pengguna atau sesuatu yang mirip setelah semua jenis coba-coba (dan coba-coba sering memakan waktu berjam-jam karena ketidakefisienan perangkat lunak kami dikombinasikan dengan menjalankannya dalam debug terhadap produksi pengguna akhir) data sering butuh 15+ menit hanya untuk mendapatkan data untuk dimuat), saya akan melacaknya ke sesuatu seperti structuntuk tipe string yang memiliki lenset ke nomor negatif sampah, seperti panjang string -921141282.

Itu seharusnya tidak pernah terjadi, tetapi siapa yang melakukannya? Jadi saya harus mengatur memory breakpoints dan mencari tahu, dan ketika saya akhirnya melakukannya, itu seperti interaksi cascading variabel tidak diinisialisasi yang digunakan secara hitung yang akhirnya ditambahkan ke lenbidang string yang diatur ke nomor sampah negatif, dan kode itu belum telah dimodifikasi bertahun-tahun. Itu terbang di bawah radar.

Dan sepanjang waktu setelah menemukan banyak bug seperti ini, saya berpikir, seberapa besar keandalan perangkat lunak kita jika hanya digunakan getters dan setters? Getters dan setters umumnya menunjukkan jenis terburuk dari desain antarmuka yang mungkin, tetapi setter setidaknya bisa memicu kegagalan pernyataan jika seseorang mencoba mengatur panjang string ke nilai negatif. Kita bisa menangkap bug itu bertahun-tahunsebelum pada waktu yang tepat diperkenalkan dalam hitungan detik, bukan titik puncak dari upaya investigasi. Dan itu hanya berpikir egois sebagai pengembang; itu tidak mencakup semua jam kesedihan itu bisa menyelamatkan pengguna dan tim QA juga. Anda tahu sistem Anda berada di tempat yang sangat buruk ketika Anda bermimpi tentang betapa lebih baiknya jika menggunakan setter dan getter dalam menghadapi 35 bug terakhir yang Anda habiskan untuk memperbaiki.

Kami bahkan punya kasus di mana structs didokumentasikan dengan cara yang menyatakan bahwa tidak ada orang lain yang harus mengakses bidang data tersebut, hanya untuk menemukan tempat di sistem mengakses bidang data tersebut.

Jadi ini adalah jenis hal yang hanya dapat Anda hargai sepenuhnya dengan menghadapi skenario terburuk, tetapi Anda akan sering kecuali Anda cukup beruntung untuk menghabiskan sisa hidup Anda bekerja pada basis kode yang lebih kecil dengan tim yang terkoordinasi dengan baik dan standar pengkodean yang kuat.

Apa kode cantik di C ++ [...]?

Itu yang sulit. Saya masih mencoba mencari tahu itu. Sebagian besar kode yang saya anggap indah telah saya tulis selama bertahun-tahun, atau setidaknya dapat diandalkan dan relatif tidak lekang oleh waktu dan stabil (tidak perlu / menginginkan perubahan) ditulis dalam C dan baru-baru ini Lua. Saya masih berjuang untuk menulis kode C ++ yang tampaknya lulus ujian waktu ke titik di mana saya tidak merenungkannya beberapa tahun kemudian dan setidaknya berharap saya bisa mengubahnya. Saya merasa sudah semakin mudah sejak C ++ 11, tetapi saya perlu beberapa tahun untuk mengetahui seberapa baik kode saya berhasil bertahan tanpa perlu perubahan untuk memastikannya. Bagi saya "keindahan" pamungkas adalah "stabilitas", seperti dalam kode yang tidak perlu dan bahkan tidak menggoda perubahan lebih lanjut tetapi masih relevan dan berguna untuk tahun-tahun mendatang, karena itu '


sumber
0

Ya, mendefinisikan antarmuka yang bersih dan berguna ("cantik" adalah kualifikasi yang buruk) adalah tentang memastikan bahwa:

  1. Pengguna mengerti dengan sedikit rasa sakit bagaimana menggunakan objek Anda (atau sistem objek) hanya dengan membaca antarmuka itu.
  2. Pengguna akan mengalami kesulitan menggunakan objek / sistem dengan cara yang salah - antarmuka membuatnya sulit untuk melakukan sesuatu yang salah atau masalah sinyal awal.
  3. Antarmuka menggambarkan abstraksi yang berguna.

Poin 1. dan 2. mengharuskan Anda untuk berpikir banyak tentang kontrak yang Anda buat dengan pengguna Anda. Kontrak itu, atau protokol, adalah cara untuk berkomunikasi dengan pengguna bagaimana ia dapat menggunakan sistem Anda. Sebagai contoh, fungsi anggota read-only (fungsi anggota konstituen) memberi tahu banyak tentang dalam situasi yang Anda harus dapat memanggil fungsi itu. Dengan cara yang sama, atribut dari masing-masing fungsi menyelam pengguna untuk mengumpulkan dan memberikan informasi minimal yang diperlukan untuk sistem untuk bekerja.

Semua poin menunjukkan bahwa antarmuka Anda seharusnya hanya menampilkan layanan yang bermanfaat bagi pengguna. Pertama membatasi penggunaan sistem oleh pengguna hanya untuk apa sistem dibuat. Kedua, dengan menghindarinya untuk memanipulasi keadaan internal dengan cara yang salah. Jadi, cara termudah dalam C ++ untuk mencapai hal ini adalah dengan menempatkan semua anggota sebagai pribadi dan secara eksplisit menyatakan layanan apa yang disediakan sistem Anda, menggunakan fungsi anggota atau global (dalam ruang nama). Cara lain adalah dengan menggunakan idiom PImpl.

Ketiga, dan yang paling penting: antarmuka Anda harus menyediakan abstraksi yang berguna, artinya pengguna tidak harus memahami implementasi. Ketika saya mengendarai mobil atau mesin cuci, saya tidak ingin tahu bagaimana itu dibangun di dalam (bahkan jika saya seorang geek teknologi ...). Saya hanya perlu menggunakannya dan tidak perlu repot dengan apa yang ada di dalamnya.

Sulit.

Definisi protokol apa pun, seperti merancang bahasa pemrograman atau merancang kelas tidak sejelas yang Anda pikirkan sebelumnya. Banyak pengalaman diperlukan untuk menghargai subtelties dari antarmuka penghubung.

Semua itu tidak jelas ketika Anda mendefinisikan struktur atau kelas yang mewakili konsep tingkat yang sangat rendah. Semakin tinggi yang Anda dapatkan dari perangkat keras, semakin banyak yang Anda butuhkan untuk memiliki antarmuka yang bersih, jelas & bermanfaat.

Klaim
sumber