Mengapa kita perlu menulis file header?

12

Sebelum Anda mengeluarkan komentar snarky Anda, saya tahu - ini adalah pertanyaan nooby. Ini adalah pertama kalinya saya menggunakan bahasa berbasis C.

Saya seorang mahasiswa sarjana yang sedang belajar Objective C untuk kursus ilmu komputer tentang pengembangan ponsel. Saya tahu bahwa, dalam lingkungan akademik, banyak pertimbangan di dunia nyata tidak diperlukan karena Anda membangun proyek yang lebih kecil, bekerja dalam tim yang lebih kecil, dll.

Tetapi profesor kami menuntut - dan XCode mendukung - file header .h untuk setiap file implementasi .m. Bagi saya, sepertinya ini seperti pekerjaan yang sibuk. Saya harus memastikan saya menyalin setiap metode tanda tangan dan variabel instan ke file lain. Jika saya mengubah satu file, saya harus memastikan itu konsisten dengan file lainnya. Sepertinya hanya sekelompok gangguan kecil seperti itu.

Tapi saya tahu harus ada penggunaan dunia nyata untuk file header. Jawaban yang bagus akan menjawab keduanya:

  1. Untuk apa file header bermanfaat untuk file implementasi? Apa tujuannya?
  2. Mengapa kita sebagai programmer harus secara manual menulis file header kita? Sepertinya mereka dapat dengan mudah dihasilkan secara otomatis.

Terima kasih sebelumnya!

Hartley Brody
sumber
Apakah XCode mendukung refactoring otomatis sehingga jika Anda mengubah tanda tangan di header itu secara otomatis disebarkan ke implementasi (dan sebaliknya)? Atau mungkin ada plugin yang mendukungnya? Saya tahu itu sakit untuk dilakukan secara manual.
FrustratedWithFormsDesigner
Reaksi pertama saya ketika saya belajar tentang file header adalah "pasti ada cara untuk melakukan itu secara otomatis". Saya cukup bingung ketika saya mencoba mencari alat yang akan membantu itu dan tidak menemukan pilihan yang bagus dan jelas.
Hartley Brody
Saya terkejut fungsi tersebut tidak ada. Saya tahu Eclipse dapat melakukan refactoring untuk Java, saya tidak tahu apakah plugin C / C ++ dapat melakukan header / impl refactoring. Saya kira jika tidak ada alat seperti itu untuk XCode, itu mungkin sesuatu yang layak dikembangkan. ;)
FrustratedWithFormsDesigner

Jawaban:

9
  1. Pendeknya;

    • File header mendefinisikan API untuk sebuah modul. Ini adalah daftar kontrak yang dapat dihubungi pihak ketiga. Modul ini dapat dianggap sebagai kotak hitam untuk pihak ketiga.

    • Implementasi mengimplementasikan modul. Itu adalah bagian dalam kotak hitam. Sebagai pengembang modul Anda harus menulis ini, tetapi sebagai pengguna modul pihak ketiga Anda tidak perlu tahu apa-apa tentang implementasinya. Header harus berisi semua informasi yang Anda butuhkan.

  2. Beberapa bagian dari file header dapat dibuat secara otomatis - deklarasi metode. Ini akan mengharuskan Anda untuk membubuhi keterangan implementasi karena kemungkinan ada metode pribadi dalam implementasi yang tidak merupakan bagian dari API dan tidak termasuk dalam header.

File header terkadang memiliki informasi lain di dalamnya; ketik definisi, definisi konstan dll. Ini termasuk dalam file header, dan bukan dalam implementasi.

Luke Graham
sumber
Tetapi kapan seseorang akan berada dalam situasi di mana mereka perlu menggunakan kode saya, tetapi hanya memiliki akses ke file .h? Bukankah mereka masih membutuhkan .m untuk menjalankannya?
Hartley Brody
1
Saya memahami perlunya abstraksi pada level teoretis, jika Anda mengubah detail implementasi, tapi saya tidak yakin kapan situasi seperti ini akan muncul.
Hartley Brody
10
Terkadang, biasanya karena alasan komersial, Anda mungkin ingin mengizinkan seseorang menggunakan kode Anda, tetapi tidak memiliki akses ke implementasi Anda. Dalam hal ini Anda akan memberikan file header dan kode pustaka atau objek yang telah dikompilasi.
Luke Graham
Ahh, begitu. Tidak menganggap kode sudah dikompilasi, sehingga dapat digunakan tetapi tidak dapat dibaca. Terima kasih!
Hartley Brody
3
Juga, mengapa saya ingin membaca implementasinya untuk mengetahui cara menggunakan kode Anda? Seharusnya cukup untuk membaca file header.
Per Johansson
5

Alasan utama untuk tajuk adalah untuk dapat melakukannya #includedi beberapa file lain, sehingga Anda dapat menggunakan fungsi dalam satu file dari file lainnya. Header mencakup (hanya) cukup untuk dapat menggunakan fungsi, bukan fungsi itu sendiri, jadi (kami berharap) kompilasi itu jauh lebih cepat.

Mempertahankan keduanya secara terpisah sebagian besar hasil dari tidak ada yang pernah menulis editor yang mengotomatiskan proses dengan sangat baik. Sebenarnya tidak ada banyak alasan mengapa mereka tidak dapat melakukannya, dan beberapa bahkan mencoba - tetapi para editor yang telah melakukannya tidak pernah melakukannya dengan sangat baik di pasar, dan semakin banyak editor arus utama yang belum mengadopsinya.

Jerry Coffin
sumber
2

Termasuk header memungkinkan kode Anda untuk memanggil fungsi atau metode yang ditulis di tempat lain dan yang mungkin atau mungkin tidak menjadi bagian dari proyek / build perangkat lunak Anda, tetapi yang dapat ditemukan oleh 'linker' ketika Anda sedang membangun perangkat lunak.

Misalnya, ketika Anda memanggil fungsi di pustaka C standar maka Anda tidak ingin harus memasukkan semua jeroan fungsi itu di dalam proyek Anda - Anda hanya berharap program Anda dapat memanggilnya.

Tetapi kompiler Anda perlu diberi tahu bahwa fungsi tersebut ada di suatu tempat bahkan jika ia tidak dapat melihat kode dan header melakukannya. Ketika kompiler selesai, penghubung dipanggil dan terlihat untuk 'menghubungkan' bit-bit kode Anda yang dibiarkan menggantung, seperti panggilan perpustakaan.

adrianmcmenamin
sumber
1

File header terutama digunakan untuk mendeklarasikan dan menyertakan tanda tangan (yaitu nama fungsi, nilai balik dan argumen) dari fungsi Anda di file lain. Kompiler perlu mengetahui tanda tangan ini ketika menyusun dan menautkan file Anda bersama-sama.

Baca artikel ini untuk informasi lebih lanjut.

Bernard
sumber