Mendokumentasikan logika matematika dalam kode

19

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 ( timeOfFirstEventbukan t1) ke variabel sebenarnya membuat kode lebih verbose dan bahkan lebih sulit dibaca.

jmruc
sumber
5
Belajar TeX sebenarnya tidak terlalu sulit. Jika Anda memiliki kode online di mana saja, MathJax akan mencetaknya dalam waktu singkat. Harap ingat ada bahasa-bahasa seperti HAL / S di mana kekhawatiran Anda telah digaungkan sejak lama.
Pemburu Rusa
4
Bukan untuk membunyikan klakson saya sendiri, tetapi di sini adalah salah satu contoh: meta.stackexchange.com/a/49787/141513 Idenya adalah untuk menulisnya sehingga seseorang yang melihatnya dapat memahami apa fungsinya, bahkan jika mereka tidak mengerti matematika di baliknya. Nama fungsi / variabel yang baik dan satu atau dua komentar sederhana biasanya cukup untuk melakukan itu.
BlueRaja - Danny Pflughoeft
lihat juga: "Komentar adalah bau kode"
agas

Jawaban:

32

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.)

Kilian Foth
sumber
4
@JustinC tidak, saya pikir dia berarti nama variabel yang sama yaitu jika dikatakan y = m*x + cAnda menggunakan m, x dan c sebagai variabel
jk.
5
@JustinC yang saya maksudkan: gunakan hanya nama variabel dan konstan yang ada dalam publikasi - biasanya itu adalah nama satu huruf seperti n, f, q atau mungkin n_i. Saya setuju dengan OP yang EulerLinearMomentumsebenarnya kurang dapat dibaca m. 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.
Kilian Foth
1
Saya setuju dengan strategi itu; Namun, teks yang sedang kita bicarakan adalah kode yang memiliki kendala mendasar, termasuk ketelitian / skala dan perilaku tertentu (diberi host atau target yang dikenal). Anda tidak menentukan atau merancang model matematika, Anda menerapkannya dalam kode (dalam banyak kasus). Tanpa menggunakan nama yang tepat yang menggambarkan apa yang direpresentasikan jauh lebih sulit untuk memverifikasi niat.
JustinC
2
+1. Jika rujukannya adalah publikasi terbaru, berikan hyperlink DOI ke koran. Contoh dx.doi.org/10.1000/182 . Inilah yang dirancang untuk DOI - URL pendek dan standar untuk publikasi, dijamin tidak akan pernah berubah.
MarkJ
2
@KeithS sangat tergantung, untuk persamaan kecil di mana setiap variabel memiliki makna fisik baik-baik saja, tetapi bagaimana jika Anda menerapkan katakanlah sebuah algoritma FFT di mana akan ada beberapa hasil parsial tanpa makna fisik. Dalam situasi ini Anda benar-benar harus mencocokkan literatur matematika karena itu adalah bahasa domain
jk.
8

Ketika saya harus mengimplementasikan algoritma seperti itu, ada beberapa hal yang saya lakukan.

  1. Sebisa mungkin, pisahkan algoritma dengan metode sendiri atau lebih disukai kelas. Proyek saya saat ini memiliki Mathkelas yang setara untuk menambahkan algoritma yang kompleks.

  2. 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.

  3. 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)

  4. 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

  5. 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.

  6. 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
6

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:

  1. 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.

  2. 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.

  3. 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.

zuiqo
sumber
1
Menjelaskan konteks secara terperinci adalah ide bagus, dengan fokus pada 'mengapa' sebelum 'bagaimana' benar-benar dapat membantu.
jmruc
3

teks tidak memiliki kekuatan ekspresif matematika

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.

masukkan deskripsi gambar di sini

Tulains Córdova
sumber
Lalu apa? Sertakan kode teks biasa untuk notasi matematika dalam kode asli sebagai komentar, atau ambil tangkapan layar dan gunakan Javadoc seperti kata OP yang mungkin dia lakukan dengan TeX?
dodgethesteamroller
@dodgethesteamroller Ya, jawaban saya mengatakan "Karena Anda sudah mencari cara untuk melakukannya di luar kode, dan Tex adalah kerja keras .."
Tulains Córdova