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.
sumber
Jawaban:
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?
sumber
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?
sumber
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.
sumber
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
sumber
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.
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,
sumber
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:
sumber
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
struct
terbuka lebar terbuka dan denganstruct
definisi 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
struct
untuk tipe string yang memilikilen
set 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
len
bidang 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
dansetters
? 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.
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
Ya, mendefinisikan antarmuka yang bersih dan berguna ("cantik" adalah kualifikasi yang buruk) adalah tentang memastikan bahwa:
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.
sumber