İşlevsel dillerde farklı yorum yapılmalı mı? [kapalı]


25

Fonksiyonel programlamaya yeni başlıyorum ve kodumu yorumlamanın doğru yolunu merak ediyorum.

Kısa bir fonksiyonu yorumlamak biraz gereksiz görünüyor çünkü adlar ve imza zaten bilmeniz gereken her şeyi size söylemeli. Daha büyük fonksiyonların yorumlanması, genellikle daha küçük kendi kendini tanımlayan fonksiyonlardan oluştuğundan, biraz gereksiz görünmektedir.

İşlevsel bir programı yorumlamanın doğru yolu nedir? Yinelemeli programlamadakiyle aynı yaklaşımı kullanmalı mıyım?


7
"çünkü bunlar genellikle daha küçük kendi kendini tanımlayıcı işlevlerden oluşuyor." - bu, ilke olarak, zorunlu dillerde farklı değildir. Yine de büyük fonksiyonun sonunda ne yapacağı hemen belli değil: bir kişi onu her zaman kodun kendisinden çıkarabilir, ancak bu bir yorumu okumaktan çok daha fazla zaman alırsa bir tane vermelisiniz.
leftaroundabout

2
Katılmıyorum. İşlevsel dillerin sonunda ne yapacağını tam olarak bildiğiniz yan etkileri olmadığından, verilen imzayla bir değer
döndürün

8
tüm fonksiyonel diller saf değildir, bazılarının yan etkileri vardır
Thanos Papathanasiou

1
Ama yorum yapmak için ne hissedersiniz yorum ... Bu overthink
gd1

1
Projeniz, işlevsel dilleri bilmeyen başka üyelere sahip olma riski taşıyor mu? Ekstra yardıma ihtiyaçları olabilir.
JeffO

Yanıtlar:


84

İşlev adı ne yaptığınızı söylemelidir .

Uygulama size nasıl yaptığınızı söyleyecektir .

Bunu neden yaptığınızı açıklamak için yorumları kullanın .


1
Büyük cevap, kodun neyin nasıl olduğunu açıklayan (kodun kendisinde belirgin olan) açıklayan ama nedenini tahmin etmeme izin vermeyen açıklamaları görmek beni öldürüyor.
Eric Wilson

32
ve bu paradigmadan bağımsız olarak geçerlidir
jk.

2
Bu muhtemelen söylemeye gerek yok, ancak kodun ne kadar karmaşık ve karmaşık olduğu ve nasıl bir açıklama gerektirdiği konusunda ne ve nasıl bir yorum da eklemelisiniz. Tabii ki, böyle bir kod da yine de kaçınılmalıdır, ancak bu her zaman mümkün değildir.
user606723

3
Bu cevap çok basit ve basitliğin çok fazla değeri olsa da, tamamen doğru değil. Bir işlev adı genellikle "neyi" yeterince ayrıntılı olarak tanımlamaz ve tanımlayamaz, bu nedenle dokümantasyon genellikle gereklidir (örneğin, en son durumları tanımlamak için). Belgeler sık ​​sık yorumlara eklenir.
luiscubal

2
Tartışılabilir olarak, işlev adı da neden yaptığını açıklamalı - mümkün olduğunda.
Yam Marcovic

14

Orada kesinlikle bir fonksiyonel programlar genellikle zorunlu olanlardan daha farklı bir soyutlama düzeyinde olduğu gibi bu soruya bir nokta.

Bu nedenle, başka bir dokümantasyon tarzı gerekmektedir. Yinelemeli programlarda, bir yorum aşağıdaki koddaki gibi yardımcı olabilir, çünkü kodun özü kazan plakasının arkasına gizlenmiştir:

// map 'toUpperCase' over 'container' yielding 'result'
Container result = new Container();
for (int i=0; i < container.size(); i++) { 
             result.addToTail(container.atElement(i).toUpperCase());
}

Ancak bu, işlevsel bir dilde açıkça saçmalıktır:

-- map 'toUpperCase' over 'list'
let result = map toUpperCase list

Daha iyi:

-- we need the FooBars in all uppercase for the Frobnitz-Interface
let result = map toUpperCase list

8
Büyükbaba her zaman bana neyin yerine nedenini belgelememi söyler. Bu yüzden zorunlu kodu için son sürümü kullanırdım.
Simon Bergot

3
Büyükbaban haklı. Sadece zorunluluk aleminde yine de mantıklı olan bazı yorumların funtional'da kesinlikle işe yaramaz olduğunu göstermek istedim.
Ingo

11

Bir işlevi belgelememizin nedeni, okuyucuların işlevin gövdesini istememesi veya okumamasıdır. Bu sebeple, büyük fonksiyonlar, işlevsel dillerde bile belgelenmelidir. Uygulamanın ne olduğuna bakarak fonksiyonun ne yaptığını anlamak kolay değil.


İyi bir nokta. Özellikle okuyucu derlenmiş bir kitaplık kullanıyorsa ve sadece açık işlev imzalarını ve yorumlarını görebilir. Kodunuzun öz tanımlayıcı cesaretini asla görmezler.
SinirliFormsDesigner ile

3

Fonksiyon adı ve parametre adları tek başına sözleşmeyi belirtmek için yeterli değilse, işlevler yorumlanmalıdır .

// returns a list of Employees    <-- not necessary
def GetEmployeeList: ...

// returns a list of Employees sorted by last name    <-- necessary
def GetEmployeeList: ...

Kısaca, sözleşme, fonksiyonun neyi beklediğini ve neyi garanti ettiğini tanımlar. Kesin konuşursak, GetEmployeeListsıralı bir liste döndürür , ancak işlev adı veya yorumda böyle bir şey söylemezse, bu işlevin bir tüketicisi bu davranışa güvenmemelidir. Belgelenmemiş bir uygulama detayı ve yazarı GetEmployeeListbu davranışı istediği zaman değiştirme özgürlüğüne sahip.


2

Yorum kendisi içermemelidir alternatif açıklamanın ziyade bir açıklamasını yapınız (aslında kodunun kendisi salgılanması gibi) kodu ne, ama nedenlerden kodu bu haliyle yazılır neden.

Ben bir yorum için bir neden görmüyorum, dedi kendi başına işlevsel bir dilde farklı olabilir.


1

Tüm kodumu belgelemek için aynı yaklaşımı kullanıyorum:

  • Açıklayıcı isimler kullanın,
  • Karmaşık bir mantıktan kaçınılması mümkün değilse, makul bir karmaşık mantığa önce yorumlar ekleyin,
  • Tüm sisteme genel bir bakış yazın,

Ad ve tür imzası, işlevin tam olarak ne yaptığını size söylemezse, genellikle yanlış yaparsınız.


0

25 yaşındayken olayları daha iyi hatırlama eğilimindesiniz. Yaşlandıkça ve eski kodlu birden fazla sistemle uğraşırsanız (evet, bugün yazdığınız kod 10-15 yıl içerisinde eski kod olacaktır), yorum varsa çok yararlı olabilir.

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.