Koddaki matematiksel mantığın belgelenmesi


19

Bazen, sık olmasa da, koduma matematik mantığı dahil etmek zorundayım. Kullanılan kavramlar çoğunlukla çok basittir, ancak sonuçta ortaya çıkan kod değildir - belirsiz amacı olan çok sayıda değişken ve çok açık olmayan bir amacı olan bazı işlemler. Ben bu sadece o kod okunamaz veya unmaintainable anlamına gelmez waaaay gerçek matematik problemi daha iyi anlamak zor. Anlaması en zor kısımları yorumlamaya çalışıyorum, ama sadece onları kodlamakla aynı sorun var - metin matematiğin ifade gücüne sahip değil .

Karmaşık kodların bazılarının arkasındaki mantığı, tercihen kodun kendisinde açıklamanın daha verimli ve kolay anlaşılır bir yolunu arıyorum. Ben TeX düşünmüştüm - belgeleri yazma ve koddan ayrı olarak oluşturma. Ama sonra TeX öğrenmek zorunda kalacaktım ve dokümantasyon kodun kendisinde olmayacak. Düşündüğüm bir başka şey de, kağıt / beyaz tahta üzerine yazılan matematiksel gösterimlerin, denklemlerin ve diyagramların resmini çekmek ve javadoc'a dahil etmek.

Daha basit ve daha açık bir yol var mı?



PS Değişkenlere açıklayıcı isimler vermek ( timeOfFirstEventyerine t1) kodu daha ayrıntılı ve daha da zor okunur hale getirir.


5
TeX öğrenmek aslında o kadar da zor değil. Kodunuzu herhangi bir yerde çevrimiçi olarak edindiyseniz, MathJax kodu hemen hiçbir zaman yarıya kadar basmayacaktır. Lütfen endişelerinizin uzun zaman önce yankılandığı HAL / S gibi diller olduğunu unutmayın .
Deer Hunter

4
Kendi kornamı devirmek değil, ama işte bir örnek: meta.stackexchange.com/a/49787/141513 Fikir, ona bakan birinin anlayamasa bile ne yaptığını anlayabilmesi için yazmaktır. arkasındaki matematik. İyi işlev- / değişken-isimleri ve basit bir yorum genellikle bunu yapmak için yeterlidir.
BlueRaja - Danny Pflughoeft

Yanıtlar:


32

Bu gibi durumlarda yapılacak doğru şey, algoritma, formül veya birincil gerçek dünya kaynağındaki tam olarak aynı değişken adlarına sahip olan her şeyi uygulamaktır (programlama dilinin buna izin verdiği ölçüde) ve üstünde özlü bir yorum yapmaktır. "Knuth1968] 'de anlatıldığı gibi Levenshtein mesafe hesaplaması" gibi bir ifadeyle alıntı, matematiğin kolayca erişilebilir bir tanımına bağlanır.

(Eğer yoksa sahip böyle bir başvuru, ancak matematik belki kendiniz yayınlayarak düşünmelisiniz, ses ve yararlıdır. Sadece diyor ki.)


4
@JustinC hayır Sanırım aynı değişken isimleri anlamına gelir, yani eğer değişken olarak y = m*x + cm, x ve c kullandığınızı söylerse
jk.

5
@JustinC: sadece yayındaki değişken ve sabit isimleri kullanın - genellikle n, f, q veya belki n_i gibi bir harfli isimlerdir. EulerLinearMomentumAslında o zaman daha az okunabilir OP katılıyorum m. Mesele şu ki, kaynak kodu formülleri ifade etmek için tercih edilen ortam değildir, bu nedenle, kodun program gereksinimlerini karşıladığından değil, kodun yazdırılan formülle aynı şeyi yaptığını doğrulamayı kolaylaştırmak olmalıdır.
Kilian Foth

1
Bu stratejiye katılıyorum; ancak bahsettiğimiz metin, kodun belirli bir kesinlik / ölçek ve davranış (bilinen bir ana bilgisayar veya hedef verildiğinde) dahil olmak üzere temel kısıtlamalara sahip olduğu koddur. Bir matematiksel model tasarlamıyorsunuz veya tasarlamıyorsunuz, bunu kodda uyguluyorsunuz (çoğu durumda). Kullanmadan doğru temsil edilmektedir şeyi tanımlamak isimler onun çok zor niyet doğrulamak için.
JustinC

2
+1. Kaynak yakın tarihli bir yayına yönelikse , makaleye DOI köprüsünü verin . Örnek dx.doi.org/10.1000/182 . Tam olarak DOI için tasarlandı - bir yayın için kısa, standart bir URL, asla değişmeyeceği garanti edildi.
MarkJ

2
@KeithS, her değişkenin fiziksel bir anlamı olduğu küçük bir denklem için tamamen bağlıdır, ancak uygularsanız, fiziksel anlamı olmayan birkaç kısmi sonucun olacağı bir FFT algoritması söyleyin. Çünkü bu durumda kesinlikle matematiksel literatürü eşleşen edilmelidir olan Alan dili
jk.

8

Böyle algoritmalar uygulamak zorunda kaldığımda, yaptığım birkaç şey var.

  1. Mümkün olduğunca algoritmayı kendi yöntemine veya tercihen sınıfına göre izole edin. Mevcut projem Mathkarmaşık algoritmalar eklemek için kendi eşdeğer sınıfına sahip.

  2. Algoritmanın, ortak kısaltmalar veya terime steno referansları da dahil olmak üzere, düzensiz olarak ne yapması gerektiğinin bir özetini sağlayın. Bunu yöntemin kendisinde yapıyorum, bu yüzden kodla yaşıyor.

  3. Algoritmanın teknik / matematiksel terimlerin bir özetini sağlayın ve bildiğim harici referansları ekleyin. Yine, yöntemi kendisiyle yapıyorum, böylece alakalı kalma şansı daha yüksek. Düz metin bu durumda harika değildir, bu yüzden matematiksel terimi olabildiğince iyi göstereceğim ve yanında bir parantez içinde açıklayacağım. Örneğin, x^y (x raised to the power y)

  4. Algoritmayı bileşenlere nasıl böldüğümü belgeleyin ve her değişkenin algoritmada neyi temsil ettiğini belirtin. Örneğin.t1 is time of first event

  5. Algoritmayı kodlayın ve karmaşık parçaları yorumlayın. Esasen, algoritmanın içinde açık veya anlaşılır olmayan bir adım attığım her yere yorum ekleyeceğim. Özellikle belirgin olmayan kısayolları ve uygulama içinde alabileceğim neden iyi olduklarını yorumladığımdan eminim.

  6. Algoritmanın çalışmasını doğrulayacak bazı birim testleri yazın.

Son olarak, gerçekten, gerçekten, gerçekten karmaşıksa, o zaman kendimi bu projede geçirdiğim zamanın geri kalanında bu koda sahip olduğum gerçeğine istifa ediyorum.

Başka birinin kodu anlaması için harici bir belgeye güvenmekten hoşlanmıyorum. Evet, bazen özellikle gizli ayrıntılara girerken gerekli olabilir. Ancak mümkün olduğunda, her şeyi kodun içinde tutmaya çalışıyorum, böylece güncellenmiş ve kolayca bulunma şansı var. Bu durumda, belgelerin anlamlılığı konusunda bilgiye erişilebilirliğe değer veriyorum.


6

Kantitatif finansal ekonomi araştırmaları etrafında dönen projelerimizde, bir sürü matematik kullanıyoruz ve zaten yayınlanmış olanların bir kombinasyonunu takip ediyoruz:

  1. Kullandığınız ana kaynağa bir bağlantı sağlayın. Bizim için bunu yapmanın en kolay yolu, temelde ilgili herkesin arayabileceği bir makalenin kimliği olan BibTex sapını kullanmaktır. Spesifik kaynağa bağlı olarak, denklem referansını da düzenli olarak ekliyoruz.

  2. Tüm değişkenler için açıklamalar sağlayın. Yine, orijinal kağıt Yunanca veya diğer harfleri kullanıyorsa bunun için Tex'i kullanırız. Bunun nedeni genellikle yeterli sayıda makale ve kitabın farklı gösterimler kullanmasıdır. Birinin matematik üzerinde yeniden çalışması gerekiyorsa, bu çok daha kolay hale getirir.

  3. Denklemi tek parça olarak kodlamaya çalışın. Bu şekilde tanımak çok daha kolay. Tam denklemin Tex-Code'unu koda GÖNDERMEYİN - ya denklem çok kısadır ve tex göndermek dağınık ve gereksizdir veya denklem çok büyüktür ve siz derlemediğiniz sürece tex kodu işe yaramaz. referans). Bir denklemin küçük parçalara ayrılması, neler olup bittiğini anlamayı gerçekten zorlaştırır (en azından matematikte iyiyseniz).

IMHO, en önemli farkındalık, formüllerin genellikle bağlama bağlı olduğudur. Bildiğim her matematik makalesi, modelin ortamını oluşturmak için zaman alır; Aynısını yapmalısın.


1
Bağlamı ayrıntılı olarak açıklamak, 'nasıl' gerçekten yararlı olabileceğinden önce 'neden' üzerine odaklanmak harika bir fikirdir.
jmruc

3

metin, matematiğin ifade gücüne sahip değildir

Haklısın. Zaten kodun dışında yapmanın bir yolunu aradığınızdan ve Tex, dik bir öğrenme eğrisine sahip olmanın yanı sıra aşırı bir ölüm olduğundan, tavsiyem aşağıdaki gibidir:

OpenOffice.org/LibreOffice Matematik Denklem Düzenleyicisi'ni kullanın.

Bedava. Açık.

Görsel olarak kullanabilir veya denklemleri özel bir dilde yazabilirsiniz.

Dili hemen öğrenmek zorunda değilsiniz çünkü GUI'yi kullandığınızda, görmeniz için bir panelde "kod" oluşturulur.

Üst panelde denklemleri bir palet kullanarak "çizebilirsiniz". Alt panelde eşdeğer gösterim oluşturulur. Gösterimi kavradığınızda, alt panelde notasyon yazarak ve üst panelde grafik çıktısını gördüğünüzde bunu başka şekilde yapabilirsiniz.

resim açıklamasını buraya girin


Sonra ne? Orijinal koddaki matematik gösterimi için düz metin kodunu yorum olarak ekleyin veya bir ekran görüntüsü alın ve OP'nin TeX ile yapabileceğini söylediği gibi Javadoc'u kullanın?
dodgethesteamroller

@dodgethesteamroller Evet, cevabım "Zaten kod dışında yapmanın bir yolunu aradığınızdan beri, Tex aşırıya
kaçıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.