Saya memiliki tugas pekerjaan rumah dan saya perlu mengevaluasi pendekatan mana yang lebih baik menurut GRASP "Variasi yang Dilindungi". Saya menemukan pertanyaan tentang Stack Overflow tentang pemisahan file header dan kode di C ++ .
Namun, apa yang saya ingin tahu mengapa Java tidak mengikuti C ++ dalam mempromosikan pemisahan antara definisi kelas dan implementasi kelas. Apakah ada keuntungan dengan metode Java, lebih dari metode C ++?
java
programming-languages
c++
Etienne Noël
sumber
sumber
private
, jadi implementasinya akan mengetahui ukurannya, danprivate
fungsi anggota juga.Jawaban:
Berapa banyak baris kode dalam program berikut?
Anda mungkin menjawab 7 (atau 6 jika Anda tidak menghitung garis kosong, atau 4 jika Anda tidak menghitung kawat gigi).
Namun kompiler Anda melihat sesuatu yang sangat berbeda:
Ya, itu 18,7 KLOC hanya untuk "Halo, dunia!" program. Kompilator C ++ harus menguraikan semua itu. Ini adalah alasan utama mengapa kompilasi C ++ memakan waktu begitu lama dibandingkan dengan bahasa lain, dan mengapa bahasa modern menghindari file header.
Pertanyaan yang lebih baik adalah
Mengapa tidak C ++ memiliki file header?
C ++ dirancang untuk menjadi superset dari C, jadi ia harus menyimpan file header untuk kompatibilitas.
OK, jadi mengapa C memiliki file header?
Karena model kompilasi terpisah yang primitif. File objek yang dihasilkan oleh kompiler C tidak menyertakan informasi tipe apa pun, jadi untuk mencegah kesalahan tipe Anda perlu memasukkan informasi ini dalam kode sumber Anda.
Menambahkan deklarasi tipe yang tepat memperbaiki bug:
Perhatikan bahwa tidak ada
#include
s. Tetapi ketika Anda menggunakan sejumlah besar fungsi eksternal (yang sebagian besar program akan), secara manual menyatakan mereka menjadi membosankan dan rentan kesalahan. Jauh lebih mudah menggunakan file header.Bagaimana bahasa modern dapat menghindari file header?
Dengan menggunakan format file objek berbeda yang menyertakan informasi jenis. Misalnya, format file Java * .class menyertakan "deskriptor" yang menentukan jenis bidang dan parameter metode.
Ini bukan penemuan baru. Sebelumnya (1987), ketika Borland menambahkan "unit" yang dikompilasi secara terpisah ke Turbo Pascal 4.0, ia memilih untuk menggunakan
*.TPU
format baru daripada Turbo C*.OBJ
untuk menghapus kebutuhan file header.sumber
OBJ
file daripadaTPU
...Java memiliki antarmuka untuk menentukan kontrak. Ini memberikan tingkat abstraksi yang lebih tinggi dari apa yang dibutuhkan penelepon dan implementasi yang sebenarnya. yaitu penelepon tidak perlu tahu kelas pelaksana, hanya perlu tahu kontrak yang didukungnya.
Katakanlah Anda ingin menulis metode yang memperlambat semua kunci / nilai dalam Peta.
Metode ini dapat memanggil entrySet () pada antarmuka abstrak yang dihapus dari kelas yang mengimplementasikannya. Anda dapat memanggil metode ini dengan.
sumber
#define interface class
.virtual
kata kunci untuk mendapatkan polimorfisme dan ini tidak memiliki penalti kinerja jika Anda hanya menggunakan satu atau dua jenis beton, seperti yang ada di Jawa. Bisakah Anda mengarahkan saya ke dokumentasi tentang cara kerjanya di C ++?Terus terang, header ada sebagai kecelakaan historis. Ini adalah sistem yang sangat buruk, tidak ada bahasa lain yang begitu mengerikan, dan siapa pun yang tidak harus berurusan dengan mereka harus bersukacita.
sumber
Header ada untuk memungkinkan kompilasi terpisah. Dengan #termasuk header, compiler tidak perlu tahu apa-apa tentang struktur biner dari kode C ++ yang dikompilasi, dan dapat meninggalkan pekerjaan itu ke linker terpisah. Java tidak menggunakan linker terpisah dengan kompilernya, dan karena file .class didefinisikan secara ketat, kompiler dapat membacanya untuk menentukan semua anggotanya dengan semua tipenya, tanpa perlu mendeklarasikan ulang mereka di setiap unit kompilasi.
Anda dapat memasukkan semua implementasi dalam header C ++, tetapi hal itu menyebabkan kompilator mengkompilasi ulang setiap kali #include, memaksa linker untuk memilah dan membuang salinan duplikat.
sumber
Java mempromosikan pemisahan definisi dan implementasi kelas, itu hanya tergantung dari mana Anda melihat.
Ketika Anda penulis kelas Java, Anda bisa melihat definisi kelas serta implementasinya dalam satu file. Ini menyederhanakan proses pengembangan karena Anda hanya perlu pergi ke satu tempat untuk mempertahankan kelas, Anda tidak perlu beralih di antara dua file (.h dan .cpp seperti yang Anda lakukan di C ++). Namun, ketika Anda adalah konsumen kelas Anda hanya berurusan dengan definisi, melalui file .class yang dikemas dalam .jar atau .class mandiri
C ++ memungkinkan Anda untuk memisahkan definisi dan implementasi, tetapi bersifat ad-hoc. Misalnya, tidak ada yang menghentikan Anda menulis metode inline di dalam file header, dan untuk kelas template ini wajib. File header juga mencantumkan variabel anggota apa pun, yang terlihat oleh siapa saja yang melihat file header, meskipun mereka adalah detail implementasi dari kelas dan tidak relevan bagi konsumen.
sumber