Terkadang, meski tidak sering, saya harus memasukkan logika matematika ke dalam kode saya. Konsep yang digunakan sebagian besar sangat sederhana, tetapi kode yang dihasilkan tidak - banyak variabel dengan tujuan yang tidak jelas, dan beberapa operasi dengan maksud yang tidak begitu jelas. Saya tidak berarti bahwa kode tidak dapat dibaca atau unmaintainable, hanya saja waaaay lebih sulit untuk memahami daripada soal matematika yang sebenarnya. Saya mencoba mengomentari bagian-bagian yang paling sulit untuk dipahami, tetapi ada masalah yang sama seperti hanya dalam mengkodekannya - teks tidak memiliki kekuatan ekspresif matematika .
Saya mencari cara yang lebih efisien dan mudah dipahami untuk menjelaskan logika di balik beberapa kode kompleks, lebih disukai dalam kode itu sendiri. Saya telah mempertimbangkan TeX - menulis dokumentasi dan membuatnya secara terpisah dari kode. Tapi kemudian saya harus belajar TeX, dan dokumentasinya tidak akan ada dalam kode itu sendiri. Hal lain yang saya pikirkan adalah mengambil gambar dari notasi matematika, persamaan dan diagram yang ditulis pada kertas / papan tulis, dan memasukkannya ke dalam javadoc.
Apakah ada cara yang lebih sederhana dan lebih jelas?
PS Memberikan nama deskriptif ( timeOfFirstEvent
bukan t1
) ke variabel sebenarnya membuat kode lebih verbose dan bahkan lebih sulit dibaca.
sumber
Jawaban:
Hal yang benar untuk dilakukan dalam keadaan seperti itu adalah mengimplementasikan algoritma, formula, atau apa pun dengan nama variabel yang persis sama seperti pada sumber dunia nyata primer (sejauh bahasa pemrograman memungkinkan ini), dan memiliki komentar singkat di atasnya yang mengatakan sesuatu seperti "perhitungan jarak Levenshtein seperti yang dijelaskan dalam [Knuth1968]", di mana kutipan menghubungkan ke deskripsi matematika yang mudah diakses.
(Jika Anda tidak memiliki referensi seperti itu, tetapi matematika Anda bagus dan bermanfaat, mungkin Anda harus mempertimbangkan untuk menerbitkannya sendiri. Katakan saja.)
sumber
y = m*x + c
Anda menggunakan m, x dan c sebagai variabelEulerLinearMomentum
sebenarnya kurang dapat dibacam
. Intinya adalah bahwa kode sumber bukan media yang disukai untuk mengekspresikan rumus, jadi penekanannya harus pada membuatnya mudah untuk memverifikasi bahwa kode melakukan hal yang sama dengan rumus yang dicetak, bukan bahwa kode memenuhi persyaratan program.Ketika saya harus mengimplementasikan algoritma seperti itu, ada beberapa hal yang saya lakukan.
Sebisa mungkin, pisahkan algoritma dengan metode sendiri atau lebih disukai kelas. Proyek saya saat ini memiliki
Math
kelas yang setara untuk menambahkan algoritma yang kompleks.Berikan ringkasan tentang apa yang seharusnya dilakukan algoritma dalam istilah awam termasuk akronim atau referensi singkatan untuk istilah tersebut. Saya melakukan ini dalam metode itu sendiri, sehingga ia hidup dengan kode.
Berikan ringkasan algoritma dalam istilah teknis / matematika dan sertakan referensi eksternal yang saya ketahui. Sekali lagi, saya melakukan ini dengan metode itu sendiri sehingga memiliki peluang yang lebih baik untuk tetap relevan. Teks biasa tidak bagus dalam hal ini, jadi saya akan mengutip istilah matematika sebaik mungkin dan mengklarifikasi dalam komentar kurung di sampingnya. Sebagai contoh,
x^y (x raised to the power y)
Dokumentasikan bagaimana saya memecah algoritma menjadi beberapa komponen dan menunjukkan apa yang masing-masing variabel wakili dalam algoritma. misalnya.
t1 is time of first event
Kode algoritma dan komentar bagian-bagian yang kompleks. Pada dasarnya, saya akan menambahkan komentar di mana saja saya mengambil langkah yang tidak jelas atau langsung dalam algoritma itu sendiri. Saya terutama memastikan saya berkomentar pintasan tidak jelas dan mengapa mereka baik-baik saja yang mungkin saya ambil dalam implementasi.
Tulis beberapa tes unit yang akan memvalidasi operasi algoritma.
Akhirnya, jika itu benar-benar kompleks, maka saya pasrah dengan fakta bahwa saya memiliki kode itu untuk sisa waktu saya di proyek itu.
Saya tidak suka mengandalkan dokumen eksternal agar orang lain memahami kode tersebut. Ya, kadang-kadang diperlukan terutama ketika masuk ke detail misterius. Tetapi bila memungkinkan, saya mencoba untuk menyimpan semuanya di dalam kode itu sendiri sehingga memiliki peluang untuk tetap diperbarui dan mudah ditemukan. Dalam hal ini, saya menghargai aksesibilitas ke informasi daripada ekspresifitas dokumentasi.
sumber
Dalam proyek kami, yang berputar di sekitar penelitian dalam ekonomi keuangan kuantitatif, kami menggunakan BANYAK matematika, dan kami mengikuti kombinasi dari apa yang telah diposting:
Berikan tautan ke sumber utama yang Anda gunakan. Bagi kami, cara termudah untuk melakukan itu adalah menggunakan BibTex-handle, yang pada dasarnya merupakan ID untuk kertas yang dapat dilihat oleh semua orang yang terlibat. Bergantung pada sumber spesifik, kami juga menambahkan referensi persamaan secara teratur.
Berikan penjelasan untuk semua variabel. Sekali lagi, kami menggunakan Tex untuk itu jika kertas aslinya menggunakan huruf Yunani atau lainnya. Alasan untuk ini adalah bahwa cukup banyak kertas dan buku menggunakan notasi yang berbeda. Jika seseorang perlu mengerjakan ulang matematika, ini membuatnya jauh lebih mudah.
Coba kode persamaan dalam satu potong. Jauh lebih mudah untuk mengenali hal itu. JANGAN memposting Kode-Tex dari persamaan penuh ke dalam kode - baik persamaannya sangat pendek, dan memposting tex berantakan dan berlebihan, atau persamaannya sangat besar, dan kode tex tidak berguna, kecuali jika Anda mengompilasinya (Gunakan a referensi sebagai gantinya). Membongkar persamaan menjadi potongan-potongan kecil membuatnya sangat sulit untuk memahami apa yang terjadi (jika Anda pandai matematika setidaknya).
IMHO, realisasi paling penting adalah bahwa rumus sering bergantung pada konteks. Setiap makalah matematika yang saya tahu membutuhkan waktu untuk mengatur lingkungan model; Anda harus melakukan hal yang sama.
sumber
Kamu benar. Karena Anda sudah mencari cara untuk melakukannya di luar kode, dan Tex adalah kerja keras selain memiliki kurva belajar yang curam, rekomendasi saya adalah sebagai berikut:
Gunakan OpenOffice.org/LibreOffice Editor Persamaan Matematika.
Gratis. Terbuka.
Anda dapat menggunakannya baik secara visual atau Anda dapat menulis persamaan dalam bahasa khusus.
Anda tidak harus segera belajar bahasa karena ketika Anda menggunakan GUI, "kode" dihasilkan di panel untuk Anda lihat.
Di panel atas Anda dapat "menggambar" persamaan menggunakan pallete. Di panel bawah notasi setara dihasilkan. Anda dapat melakukannya sebaliknya setelah Anda memahami notasi, menulis notasi di panel bawah dan melihat output grafis di panel atas.
sumber