Apakah ada strategi yang lebih baik daripada mengandalkan kompiler untuk menangkap kesalahan?

8

Saya sudah pemrograman dalam C dan C ++ untuk beberapa waktu, meskipun saya akan mengatakan saya jauh dari menjadi ahli. Untuk beberapa waktu, saya telah menggunakan berbagai strategi untuk mengembangkan kode saya seperti tes unit, desain uji coba, ulasan kode dan sebagainya.

Ketika saya menulis program pertama saya di BASIC, saya mengetik di blok panjang sebelum menemukan mereka tidak akan berjalan dan itu adalah mimpi buruk untuk debug. Jadi saya belajar menulis sedikit dan kemudian mengujinya.

Hari-hari ini, saya sering menemukan diri saya berulang kali menulis sedikit kode kemudian menggunakan kompiler untuk menemukan semua kesalahan. Tidak apa-apa jika mengambil kesalahan ketik tetapi ketika Anda mulai menyesuaikan jenis parameter dll hanya untuk membuatnya kompilasi Anda dapat mengacaukan desain. Tampaknya juga kompiler masuk ke dalam proses desain padahal seharusnya hanya digunakan untuk memeriksa sintaksis.

Ada bahaya di sini karena terlalu mengandalkan kompiler untuk membuat program saya lebih baik. Apakah ada strategi yang lebih baik dari ini?

Samar-samar saya ingat beberapa waktu lalu sebuah artikel di sebuah perusahaan yang mengembangkan jenis kompiler C di mana file header tambahan juga menentukan prototipe. Idenya adalah bahwa inkonsistensi dalam definisi API akan lebih mudah ditangkap jika Anda harus mendefinisikannya dua kali dengan cara yang berbeda.

koan
sumber
Andalkan programmer untuk menangkap kesalahan ... melalui analisis, pemahaman, pengujian, dan kompilasi.
dietbuddha

Jawaban:

13

Jangan sesuaikan hal untuk membuatnya dikompilasi. Sesuaikan segala sesuatunya menjadi benar . Jika "dirancang" sehingga tipe parameter tidak cocok, maka perancang tidak tahu apa yang mereka lakukan.

Jika Anda tidak ingin bergantung pada kompiler, maka tingkatkan pengetahuan bahasa Anda. Pelajari struktur definisi dan deklarasi, dan periksa kesalahan apa yang Anda tulis sebelum kompilasi. Dan gunakan ulasan kode.

Gagasan prototipe ekstra itu terdengar buruk. Jika Anda salah mendesain, apa yang membuat desain kedua salah? Dan dengan menggunakan berbagai format / paradigma / dll untuk hal yang sama, Anda cenderung membingungkan orang. Saya akan memastikan semua orang memahami format utama sehingga Anda dapat fokus pada mendapatkan desain yang benar pertama kali, daripada menggandakan pekerjaan desain untuk menangkap kesalahan. Seperti yang lainnya, desain harus di-refactored, tetapi saya tidak berpikir melakukannya dua kali untuk memulai dengan sangat masuk akal.

Matius Baca
sumber
Saya pikir perancang (saya) tidak mengingat parameter ke fungsi lainnya dengan benar, mungkin karena saya memikirkan versi desain sebelumnya.
koan
File header kedua tidak ditulis dalam standar C dan saya pikir itu adalah bentuk prototipe tingkat yang lebih tinggi. Idenya adalah bahwa jika dua definisi Anda yang berbeda mendefinisikan hal yang sama maka desain Anda lebih cenderung benar. Itu bukan dua file header C standar tetapi dengan "mengetik" yang berbeda.
koan
Tapi itu pada tahap implementasi, kan? Apa pun caranya, ubah saja untuk mengikuti desain atau ubah desain menjadi benar ... jangan hanya membuat kompiler senang;). Saya akan memperbarui jawaban saya untuk mencerminkan penjelasan Anda tentang prototipe.
Matius Baca
Saya mengerti maksud Anda dan saya pikir itu adalah jawaban yang baik tetapi pada tahap apa Anda mengatakan "Wah, saya perlu menghentikan semua implementasi dan kembali untuk mendapatkan desain yang benar", karena 'hanya mengubah desain' dapat dilakukan dengan cepat, juga cepat, menyeluruh atau terlalu teliti ...
koan
Itu pertanyaan yang sangat sulit dijawab. Saya pikir ini lebih merupakan perasaan berbasis pengalaman daripada yang lain, kecuali ketika Anda menemukan "whoa, kami benar-benar salah memahami masalah ini, perlu melakukan desain ulang".
Matius Baca
4

Jujur, saya percaya tujuan Anda SELALU adalah untuk menulis sebuah program yang dikompilasi pertama kali. Saya menyadari bahwa ini sulit dan mungkin tidak akan sering terjadi, tetapi itu tetap harus menjadi tujuan Anda. Pikirkan perangkat lunak sebagai perangkat keras. Buatlah diri Anda percaya bahwa mahal untuk mengkompilasi ulang kode Anda (seperti membuat ulang papan). Complier bukan debugger dan tidak seharusnya diperlakukan seperti itu.

Pemda
sumber
+1 untuk "kompiler bukan debugger"
Joris Meys
Menarik. Saya selalu merasa jauh lebih nyaman jika saya menemukan kesalahan karena pasti ada dalam kode saya, hanya saja saya belum menemukannya. Pertanyaan saya bukan tentang debugging; Saya mencari strategi untuk merancang atau menulis kode yang lebih efektif dalam menghasilkan kode yang baik. Misalnya, jika kompiler Anda memberikan lebih dari X pesan kesalahan non-sepele, Anda harus berhenti dan memikirkan kembali desain; atau sesuatu.
koan
Saya pikir cara terbaik Anda dalam mempelajari cara menulis kode yang baik adalah dengan membaca buku. Saya merekomendasikan Kode Selesai. Ini adalah buku terbaik yang saya pribadi baca tentang perangkat lunak secara umum.
Pemdas
Saya merasa Anda mencoba untuk meniadakan masalah dengan tidak memakainya. Itu bukan hal yang buruk, tetapi pada akhirnya akan ada masalah yang muncul selama kompilasi, tidak ada yang sempurna setelah semua.
koan
1
Sementara kompiler bukan debugger - salah satu cara pilihan saya untuk melakukan refactoring tertentu adalah membuatnya sedemikian rupa sehingga kode lama tidak akan dikompilasi (dengan mengganti nama mungkin). Memudahkan untuk menemukan hal-hal yang terlewatkan.
sdg
3

Kompiler tidak dapat menemukan semua kesalahan sehingga tidak ada gunanya berpura-pura bisa. Yang dapat ditemukan hanyalah kesalahan sintaks dan kesalahan ketik. Sudah cukup baik sehingga saya membiarkannya melakukan bagian dari pekerjaan itu (meskipun hari ini lingkungan menangkap 99% dari mereka sendiri sebelum Anda mencapai kompilasi) tetapi saya sangat tahu itu bukan semua kesalahan.

Satu-satunya waktu saya mengandalkan informasi semacam itu untuk memberi tahu saya apa yang harus ditulis adalah ketika saya mendapatkan hal-hal seperti itu mengatakan kepada saya itu tidak dapat secara otomatis mengubah ganda menjadi float - jika di mana Anda mengirim data mengharapkan mengapung (dan karena apa yang saya lakukan saat ini adalah bermain dengan pustaka XNA yang melakukan hal ini) dan sumber mengembalikan dua kali lipat (seperti halnya pustaka matematika C #) maka Anda hanya perlu mengonversi.

Loren Pechtel
sumber
1

Kompiler adalah alat. Seperti semua alat, mereka bisa disalahgunakan.

Saat pertama kali memulai dengan bahasa, tidak ada salahnya menggunakan kompiler secara membabi buta untuk menguji program Anda. Begitulah cara belajar bekerja, tebak, dan periksa. Namun, itu tidak berarti Anda harus terus kode seperti itu.

Adalah kepentingan terbaik Anda untuk memahami bahasa dengan cukup baik sehingga Anda dapat menyusun program di kepala Anda. Maka Anda akan menghabiskan lebih sedikit waktu menunggu kompiler selesai.

Saya mengatakan itu mungkin yang terbaik bahwa program selalu dalam beberapa baris / blok kode yang dapat dikompilasi.

Jeremy Heiler
sumber
0

Kebanyakan IDE modern menangkap banyak masalah kompiler dan saya kira saya telah menjadi sangat bergantung pada ini juga.

Mungkin kembali ke file teks dan kompiler baris perintah?

ozz
sumber
Saya tidak menggunakan IDE! Mungkin saya harus mulai? Saya selalu berpikir saya harus tetapi tidak pernah menemukan satu yang saya sukai.
koan