TD; DR:
Ada beberapa kebingungan tentang apa yang saya tanyakan, jadi di sini adalah ide penggerak di balik pertanyaan:
Saya selalu ingin pertanyaannya seperti apa itu. Saya mungkin tidak mengartikulasikannya dengan baik pada awalnya. Tetapi maksud selalu " adalah kode modular, terpisah, longgar, berpasangan, dipisahkan, " lebih jelas berdasarkan sifatnya sendiri daripada " unit tunggal monolitik, melakukan segalanya di satu tempat, satu file, digabungkan dengan erat " kode. Selebihnya hanyalah perincian dan berbagai manifestasi dari ini yang saya jumpai dulu atau sekarang atau nanti. Pasti lebih lambat pada skala tertentu. Seperti disk yang tidak terdefrag, Anda harus mengambil kepingan dari mana-mana. Lebih lambat. Tentunya. Tetapi haruskah saya peduli?
Dan pertanyaannya bukan tentang ...
bukan tentang mikro-optimasi, optimasi prematur, dll. Ini bukan tentang "mengoptimalkan bagian ini atau itu sampai mati".
Lalu apa itu?
Ini adalah tentang keseluruhan metodologi dan teknik dan cara berpikir tentang penulisan kode yang muncul seiring waktu:
- "menyuntikkan kode ini ke kelas Anda sebagai ketergantungan"
- "tulis satu file per kelas"
- "Pisahkan tampilan Anda dari basis data, pengontrol, domain".
- jangan menulis kode kunci tunggal spaghetti homogen, tetapi tulis banyak komponen modular terpisah yang bekerja bersama
Ini tentang cara dan gaya kode yang saat ini - dalam dekade ini - dilihat dan didukung dalam sebagian besar kerangka kerja, yang diadvokasi di konvensi, diteruskan melalui komunitas. Ini adalah pergeseran pemikiran dari 'blok monolitik' ke 'layanan mikro'. Dan dengan itu muncul harga dalam hal kinerja dan overhead tingkat mesin, dan beberapa overhead tingkat programmer juga.
Pertanyaan Asli berikut:
Dalam bidang Ilmu Komputer, saya telah memperhatikan perubahan penting dalam pemikiran dalam hal pemrograman. Saya menemukan saran yang cukup sering seperti ini:
- tulis kode fungsi-bijaksana yang lebih kecil (lebih dapat diuji dan dipelihara dengan cara ini)
- refactor kode yang ada menjadi potongan kode yang lebih kecil dan lebih kecil sampai sebagian besar metode / fungsi Anda hanya beberapa baris panjang dan jelas apa tujuan mereka (yang menciptakan lebih banyak fungsi, dibandingkan dengan blok monolitik yang lebih besar)
- tulis fungsi yang hanya melakukan satu hal - pemisahan masalah, dll (yang biasanya membuat lebih banyak fungsi dan lebih banyak bingkai pada tumpukan)
- buat lebih banyak file (satu kelas per file, lebih banyak kelas untuk keperluan dekomposisi, untuk keperluan lapisan seperti MVC, arsitektur domain, pola desain, OO, dll, yang menciptakan lebih banyak panggilan sistem file)
Ini adalah perubahan dibandingkan dengan praktik pengkodean "lama" atau "usang" atau "spageti" di mana Anda memiliki metode yang mencakup 2500 baris, dan kelas besar dan objek dewa melakukan segalanya.
Pertanyaan saya adalah ini:
ketika panggilan turun ke kode mesin, ke 1s dan 0s, ke instruksi perakitan, ke piring-piring HDD, saya harus sama sekali prihatin bahwa kode OO saya dipisahkan dengan sempurna kelas dengan berbagai fungsi kecil dan metode refactored kecil-ke-kecil dan metode menghasilkan juga overhead ekstra banyak?
Detail
Meskipun saya tidak akrab dengan bagaimana kode OO dan panggilan metode yang ditangani di ASM pada akhirnya, dan bagaimana panggilan DB dan panggilan kompiler diterjemahkan ke lengan aktuator bergerak pada piring HDD, saya punya beberapa ide. Saya berasumsi bahwa setiap panggilan fungsi tambahan, panggilan objek, atau panggilan "#include" (dalam beberapa bahasa), menghasilkan satu set instruksi tambahan, dengan demikian meningkatkan volume kode dan menambahkan berbagai overhead "pengkabelan kode", tanpa menambahkan kode "berguna" yang sebenarnya. . Saya juga membayangkan bahwa optimasi yang baik dapat dilakukan untuk ASM sebelum benar-benar dijalankan pada perangkat keras, tetapi optimasi itu hanya dapat melakukan banyak hal juga.
Oleh karena itu, pertanyaan saya - berapa banyak overhead (dalam ruang dan kecepatan) yang memisahkan kode (kode yang dibagi menjadi ratusan file, kelas, dan pola desain, dll) benar-benar diperkenalkan dibandingkan dengan memiliki "satu metode besar yang berisi semuanya dalam satu file monolitik ", karena overhead ini?
UPDATE untuk kejelasan:
Saya mengasumsikan bahwa mengambil kode yang sama dan membaginya, refactoring keluar, decoupling menjadi lebih banyak fungsi dan objek dan metode dan kelas akan menghasilkan semakin banyak parameter melewati antara potongan kode yang lebih kecil. Karena pastinya, kode refactoring harus membuat utas terus berjalan, dan itu membutuhkan pengoperan parameter. Lebih banyak metode atau lebih banyak kelas atau lebih banyak Metode Pabrik pola desain, menghasilkan lebih banyak overhead melewatkan berbagai bit informasi lebih dari itu dalam satu kelas monolitik atau metode.
Dikatakan di suatu tempat (kutipan TBD) bahwa hingga 70% dari semua kode terdiri dari instruksi MOV ASM - memuat register CPU dengan variabel yang tepat, bukan perhitungan yang sebenarnya sedang dilakukan. Dalam kasus saya, Anda memuat waktu CPU dengan instruksi PUSH / POP untuk memberikan tautan dan parameter yang melewati berbagai bagian kode. Semakin kecil Anda membuat potongan kode, semakin banyak "tautan" overhead diperlukan. Saya prihatin bahwa keterkaitan ini menambah mengasapi dan memperlambat perangkat lunak dan saya bertanya-tanya apakah saya harus khawatir tentang ini, dan berapa banyak, jika ada sama sekali, karena generasi saat ini dan masa depan programmer yang sedang membangun perangkat lunak untuk abad berikutnya , harus hidup dengan dan menggunakan perangkat lunak yang dibangun menggunakan praktik ini.
PEMBARUAN: Banyak file
Saya menulis kode baru sekarang secara perlahan menggantikan kode lama. Secara khusus saya perhatikan bahwa salah satu kelas lama adalah ~ 3000 file baris (seperti yang disebutkan sebelumnya). Sekarang menjadi seperangkat 15-20 file yang terletak di berbagai direktori, termasuk file uji dan tidak termasuk kerangka PHP yang saya gunakan untuk mengikat beberapa hal bersama-sama. Lebih banyak file datang juga. Ketika datang ke disk I / O, memuat beberapa file lebih lambat daripada memuat satu file besar. Tentu saja tidak semua file dimuat, mereka dimuat sesuai kebutuhan, dan ada opsi cache caching dan memory caching, namun saya masih percaya bahwa loading multiple files
dibutuhkan lebih banyak pemrosesan dari loading a single file
pada memori. Saya menambahkan itu untuk keprihatinan saya.
UPDATE: Ketergantungan Suntikan semuanya
Kembali ke ini setelah beberapa saat .. Saya pikir pertanyaan saya disalahpahami. Atau mungkin saya memilih untuk salah paham beberapa jawaban. Saya tidak berbicara tentang optimalisasi mikro karena beberapa jawaban telah dipilih, (setidaknya saya pikir menyebut apa yang saya bicarakan tentang optimasi mikro adalah keliru) tetapi tentang pergerakan "Kode refactor untuk melonggarkan kopling ketat", secara keseluruhan , di setiap level kode. Saya datang dari Zend Con baru-baru ini di mana gaya kode ini telah menjadi salah satu poin inti dan centerpieces dari konvensi. Decouple logic from view, view from model, model from database, dan jika Anda bisa, decouple data dari database. Ketergantungan-menyuntikkan segalanya, yang kadang-kadang berarti hanya menambahkan kode kabel (fungsi, kelas, boilerplate) yang tidak melakukan apa - apa, tetapi berfungsi sebagai titik jahitan / kait, dengan mudah menggandakan ukuran kode dalam banyak kasus.
UPDATE 2: Apakah "memisahkan kode menjadi lebih banyak file" secara signifikan mempengaruhi kinerja (di semua tingkat komputasi)
Bagaimana filosofi compartmentalize your code into multiple files
dampak komputasi saat ini (kinerja, pemanfaatan disk, manajemen memori, tugas pemrosesan CPU)?
saya berbicara tentang
Sebelum...
Di masa lalu yang hipotetis namun tidak terlalu jauh, Anda dapat dengan mudah menulis satu mono-blok dari file yang memiliki model dan tampilan dan pengontrol spaghetti atau tidak-kode-spaghetti, tetapi itu akan menjalankan semuanya begitu sudah dimuat. Melakukan beberapa tolok ukur di masa lalu dengan menggunakan kode C, saya menemukan bahwa JAUH lebih cepat untuk memuat satu file 900Mb ke dalam memori dan memprosesnya dalam potongan besar daripada memuat banyak file yang lebih kecil dan memprosesnya dalam makanan perdamaian yang lebih kecil potongan melakukan pekerjaan yang sama pada akhirnya.
.. Dan sekarang*
Hari ini saya menemukan diri saya melihat kode yang menunjukkan buku besar, yang memiliki fitur seperti .. jika item adalah "pesanan", tampilkan pesanan blok HTML. Jika item baris dapat disalin, cetak blok HTML yang menampilkan ikon dan parameter HTML di belakangnya memungkinkan Anda untuk membuat salinan. Jika item dapat dipindahkan ke atas atau ke bawah, tampilkan panah HTML yang sesuai. Dll. Saya bisa, melalui Zend Framework createpartial()
panggilan, yang pada dasarnya berarti "panggil fungsi yang mengambil parameter Anda dan sisipkan ke file HTML terpisah yang juga dipanggil". Bergantung pada seberapa detail yang ingin saya dapatkan, saya dapat membuat fungsi HTML terpisah untuk bagian terkecil dari buku besar. Satu untuk panah ke atas, panah ke bawah, satu untuk "dapatkah saya menyalin item ini", dll. Mudah membuat beberapa file hanya untuk menampilkan sebagian kecil halaman web. Mengambil kode saya dan kode Zend Framework di belakang layar, sistem / tumpukan mungkin memanggil hampir 20-30 file berbeda.
Apa?
Saya tertarik pada aspek, keausan pada mesin yang dibuat dengan mengklasifikasikan kode menjadi banyak file terpisah yang lebih kecil.
Sebagai contoh, memuat lebih banyak file berarti menempatkannya di berbagai tempat sistem file, dan di berbagai tempat HDD fisik, yang berarti lebih banyak HDD mencari dan membaca waktu.
Untuk CPU itu mungkin berarti lebih banyak konteks switching dan memuat berbagai register.
Dalam sub-blok ini (pembaruan # 2) saya tertarik lebih ketat tentang bagaimana menggunakan banyak file untuk melakukan tugas yang sama yang dapat dilakukan dalam satu file, mempengaruhi kinerja sistem.
Menggunakan Zend Form API vs HTML sederhana
Saya menggunakan Zend Form API dengan praktik OO modern terbaru dan terhebat, untuk membangun formulir HTML dengan validasi, mentransformasikannya POST
menjadi objek domain.
Butuh 35 file untuk membuatnya.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
Semuanya bisa diganti dengan beberapa file HTML + PHP + JS + CSS sederhana, mungkin total 4 file ringan.
Apakah lebih baik? Apakah ini layak? ... Bayangkan memuat 35 file + banyak file perpustakaan Zend Zramework yang membuatnya berfungsi, vs 4 file sederhana.