Başlık dosyasındaki veya kaynak dosyadaki işlevleri belgelemek daha mı iyi?


86

Bir "kaynak" ve "başlık" dosyası (özellikle C ve C ++) arasında ayrım yapan dillerde, başlık dosyasındaki işlevleri belgelemek daha iyi olur:

( CCAN'dan gelenler )

/**
 * time_now - return the current time
 *
 * Example:
 *  printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec);
 */
struct timeval time_now(void);

veya kaynak dosyada?

(PostgreSQL'den uyarlanmıştır)

/*
 * Convert a UTF-8 character to a Unicode code point.
 * This is a one-character version of pg_utf2wchar_with_len.
 *
 * No error checks here, c must point to a long-enough string.
 */
pg_wchar
utf8_to_unicode(const unsigned char *c)
{
...

Yapılar, makrolar ve static inlineişlevler gibi bazı şeylerin yalnızca başlıkta tanımlandığını unutmayın . Sadece bir başlık dosyasında bildirilen ve bir kaynak dosyada tanımlanan şeylerden bahsediyorum .

İşte aklıma gelen bazı argümanlar. Kaynak dosyada belgelemeye yaslanıyorum, bu yüzden "Pro-header" argümanlarım biraz zayıf olabilir.

Pro-başlık:

  • Kullanıcı belgeleri görmek için kaynak koduna ihtiyaç duymaz.
    • Kaynak elde etmek için uygun olmayabilir veya hatta imkansız olabilir.
    • Bu, arayüzü ve uygulamayı ayrı tutar.

Pro-source:

  • Başlığı çok daha kısaltır ve okuyucuya modülün bütününe kuş bakışı bir görünüm kazandırır.
  • Bir işlevin belgelenmesini, uygulamasıyla eşleştirir ve işlevin yaptığı şeyi yaptığını görmesini kolaylaştırır.

Cevap verirken, lütfen hangi araçların ve "modern IDE'lerin" yapabileceklerine dayanarak tartışmalara karşı dikkatli olun. Örnekler:

  • Pro-header: Kod katlama, yorumları gizleyerek yorumlanmış başlıkların daha gezinilebilir olmasına yardımcı olabilir.
  • Pro-source: cscope 'ın Find this global definitionözelliği (kaynak dosyasının götüren tanımı ise) yerine (başlık dosyası beyanı olduğunu).

Bu tür tartışmalar yapma demiyorum, ama herkesin sizin kullandığınız araçlarla olduğu kadar rahat olmadığını unutmayın.


Aynı soru, kaynak ve başlık dosyalarının olmadığı fakat arayüz ve uygulama bölümlerinin bulunduğu Pascal / Delphi için de geçerli olabilir.
Jan Doggen

Yanıtlar:


96

Benim görüşüm...

  • İşlevin üstbilgi dosyasında veya bildirime daha yakın bir şekilde nasıl kullanılacağını belgeleyin.

  • Kaynak dosyadaki işlevin (koddan belli değilse) nasıl çalıştığını veya tanımlamaya yakın bir şekilde nasıl çalıştığını belgeleyin.

Üstbilgideki kuş gözü için, mutlaka bu belgelere gerek yok - beyan gruplarını bir kerede belgeleyebilirsiniz.

Genel olarak konuşursak, arayan kişi hatalar ve istisnalar ile ilgilenmelidir (eğer öyleyse soyutlama katmanları üzerinden yayıldıkları halde tercüme edilebilirlerse), bu nedenle bunlar ilgili beyanlara yakın olarak belgelenmelidir.


13
+1 - yani başlıktaki arayüzü belgelemek. Kaynaktaki nasıl ve nedenlerin Gory detayları.
Çabuk_şimdi

2
Kaynak bulunamayan kütüphane başlıkları için, sınamaya yardımcı olması için öncesi ve sonrası koşulları, vb ... ekleyin. Artı, mantıklıysa O (n) performansını da ekleyin, böylece kütüphane kullanıcıları akıllıca seçim yapabilir.
Patrick Hughes,

Doğal olarak, bazen beyan ve tanım tek ve aynıdır.
Deduplicator

@Deduplicator - aynı kurallar, özel davada bile hala doğru olanı doğurduğunda, neden her özel durum için bu kuralları yankılıyor? Kesinlikle bir tekilleştirici bunu istememeli?
Steve314

1
@Deduplicator - Tabii ki tavsiyene uymadığın için çok fazla abartılmış bir mantık, ama ben buna bağlı kalıyorum.
Steve314

34

Eğer Doxygen gibi bir araç kullanacaksanız (ilk örnekte, aslında bir Doxygen yorumu gibi göründüğüne dikkat edin /**) o zaman gerçekten farketmez - Doxygen başlığınıza ve kaynak dosyalarınıza bakacak ve bulacaktır. Belgeleri oluşturmak için tüm yorumlar.

Bununla birlikte, dokümantasyon yorumlarını beyannamelerin bulunduğu başlıklara koymak için daha fazla eğimli olurum. Müşterileriniz, yazılımınızla arayüz oluşturmak için başlıklarla ilgilenecek, başlıklar kendi kaynak dosyalarına dahil olacakları ve API'nizin neye benzediğini görmek için ilk bakacakları yer.

Örneğin çoğu Linux kütüphanesine bakarsanız, Linux paket yönetim sisteminizde genellikle sadece kütüphanenin ikililerini içeren bir paket bulunur (kütüphaneye ihtiyacı olan programlara sahip olan "normal" kullanıcılar için) ve kütüphanenin başlıklarını içerir. Kaynak kodu normalde doğrudan bir paket içinde verilmez. API belgelendirmesini almak için bir kütüphanenin kaynak kodunu bir yerde bulmak zorunda kalırsanız çok hantal olur.


2
+1 - Şartlı olarak, Doxygen kullanıyor olsanız bile, bu asla doğrudan kaynaktan okumayacağınız anlamına gelmez. Doxygen ek açıklamaları bazen aşılması gereken standart desenler olarak bile kullanışlıdır ve bulduğunuz ek açıklamanın tanımladığı koda yakın olması durumunda kullanışlıdır.
Steve314

1
Tabii ki @ Steve314, bir kütüphanenin kaynak koduna asla bakmak istemeyeceğinizi söylemedim - ama API'nin nasıl göründüğünü ve nasıl kullanılacağını ilk aradığınız yer burası olmazdı.
Jesper

Ayrıca, API ile ilgili her şeyi başlıkta (ya da en azından başlıkta ya da kaynakta) tutmak isterim çünkü belgeleri bir yerde güncellerken olası tutarsızlığı önler, diğerinde değil.
jopasserat

12

Bu dosyayı (yaklaşık 25 yıl önce), kaynak dosyada kullanılabilecek ve bir awk betiği (dehşet) tarafından taranabilecek bir sürü # tanım (örneğin, genel, özel vb.) Yaratarak çözdük. !) .h dosyalarını otomatik olarak oluşturmak için. Bu, tüm yorumların kaynakta yaşadığı ve (. Uygun olduğunda) oluşturulan .h dosyasına kopyalandığı anlamına gelir. Oldukça Eski Okul olduğunu biliyorum, ancak bu tür satır içi belgelere büyük ölçüde basitlik kazandırdı.


1
hmm Ben bu tarz bir şey yararlı olabilir biliyorum, ama benim açımdan her zaman bu tür belgeler düpedüz sinir bozucu
buldum

1
(I did bir adam Donald Rumsfeld Paraphrase değil like,) "Sen var araçlarla programlamak, araçlarıyla size olsaydı değil." Son 40+ yıl boyunca birlikte çalıştığım her dil, en az bir büyük siğile (daha fazla değilse) sahipti. Çözümümüz a) çalıştı, b) zamanda kullanılan araçlar, c) zamanımızı kapıdan kod üreten kod almak için harcayalım.
Peter Rowell

Muhtemelen bunu tercih etmesem de, başlıklarda yorumları ele almanın ilginç bir yolu. Oluşturulan başlıklar sürüm kontrolünde olur mu? ya da bu yeniden dağıtılabilir kaynak yapmak için bazı yayın süreci mi? (ancak geliştiriciler tarafından kullanılmaz)
ideasman42

Ah, son zamanlarda aynı modeli 2000 yılında başlayan bir projede gördüm ve akıllıca icatlarından dolayı gurur
duydular

3
Bizim durumumuzda, oluşturulan dosyalardan hiçbirini sürüm kontrolü altında tutmadık, çünkü izlenen dosyalardan kolayca ve doğrudan (yeniden) elde edildiler.
Peter Rowell

9

Bunun daha büyük bir proje içindeki kod olduğu varsayılırsa (geliştiricilerin kaynak ve başlıklar arasında sıkça hareket edeceği) ve bunun , başkalarının kaynağa erişemeyebileceği bir kütüphane / orta ürün olmadığını sağlayarak , bu işleri buldum en iyi...

  • Başlıklar:
    1-2 satırı yorumlayın, yalnızca ihtiyaç duyulursa.
    Bazen ilgili işlevler grubunun üstündeki yorumlar da yardımcı olabilir.
  • Kaynak:
    Doğrudan fonksiyonun üstündeki API dokümantasyonu (eğer isterseniz düz metin veya doxygen) .
  • Yalnızca uygulama gövdesindeki kodu değiştiren bir geliştiriciyle ilgili olan uygulama ayrıntılarını saklayın.

Bunun ana nedeni, yorumları koda yakın tutmaktır. Başlıklardaki dokümanların, kod değişiklikleri ile daha sık eşzamanlı olma eğiliminde olduklarını fark ettim (elbette yapmamalılardı, ancak projemizde en az) . Ayrıca geliştiriciler, başka bir yerde üstbilgi belgeleri olsa bile, bazı değişiklikler yaptıklarında, işlevlerin en üstüne belge ekleyebilirler. Çiftleşmelere neden olmak veya faydalı bilgilerin yalnızca belge dizilerinden birinde olması.

Elbette bir kongre seçebilir ve tüm ekiplerin takip etmesini sağlayabilirsiniz, konvansiyonu en doğal olanın üstünde buldum ve bakımı en az sıkıntıya neden oldu.


Tüm Son, büyük projeler için - bir eğime gidecekseniz değil çok açıortay hataları yavaşlatan - Eğer onun diğerleri sürüm kontrolü güncellediğimde yeniden derlemek için potansiyel dosyaların 100'in veya 1000 neden olacak bildiğiniz bir başlıkta küçük düzeltmeler yapmak.


5

Benim (oldukça sınırlı ve önyargılı) görüşüme göre, ben kaynak yanlısı kod düşünme biçimiyim. C ++ 'ta bit ve parçaları yaptığım zaman, genellikle başlık dosyasını bir kere düzenlerim ve sonra gerçekten bakmak için asla geri dönmem.

Belgeleri kaynak dosyaya yerleştirdiğimde, kodları düzenlerken veya okurken her zaman görüyorum. Sanırım bu bir alışkanlık meselesi.

Ama bu sadece benim ...


1
Derlenmiş bir kütüphane ve başlık dosyası varsa, çok iyi çalışmaz. Bu durumda, başlıkta daha fazla bilgi olması iyi bir şeydir çünkü sahip olduğunuz tek arayüz dokümantasyonu.
hızla_

doxygen ile dokümantasyon hazırlayabilirsiniz - bunu .c dosyalarından da alır. Böylece derlenmiş kütüphanelerle dokümanları kolayca dağıtabilirsiniz. Ama sorun fonksiyonunu kullanırken başlık dosyalarını ayrıştırmak ve size belgeleri verebilir IDE ile olacağını ... Ama belki de ... .h içine fonksiyon Yorumlara frm .c kopyalarmış bazı dağıtma komut çözebilir
Vit Bernatik

5

Yorumlar dokümantasyon değildir. Bir fonksiyonun dokümantasyonu tipik olarak 2K metin olabilir, muhtemelen diyagramlarla birlikte - örneğin Windows SDK'daki fonksiyonlar için dokümantasyona bakınız. Doktora yorumunuz böyle bir şeye izin verse bile, yorumu içeren kodu okunamaz hale getireceksiniz. Dokümantasyon oluşturmak istiyorsanız, bir kelime işlemci kullanın.


güncelle, bu günlerde (Qt yaratıcısı gibi şeyler var) sadece doxygen (veya klon) yöntemini belgelemek için belgelemek daha kolay değil, örneğin, qtc'de / tuşuna sadece yorumdan önce yarım kez basın. iş senin için yapılır. Böyle şeyler yüzünden, insanların sadece kodlarını belgelemek için bir kelime işlemcisine atlamak isteyeceklerinden şüpheliyim. Bunu 2005 yılında geri verdiğimde yapardım, ama şimdi bunu asla yapmam. Bir html editörü kullanmak bile şimdi oldukça arkaik görünüyor.
osirisgothra

@osirisgothra Doxygen- "belgeler" yapmak kolay olabilir ve kesinlikle hızlıca yazılan LOC'leri üretir, ancak üretilen "belgelerin" değeri çoğu durumda tartışılmaz kalır. Doxygen yorumları ne iyi bir dokümantasyon değildir (hemen hemen tüm önemli detaylar genellikle eksiktir), ne de iyi yorumlar da değildir (imzadan zaten açık olanları tekrar etmeye meyillidirler). Bence nbt, gerçek dokümantasyonun en iyi şekilde kodla karıştırılmadığını söylemekte haklı. Çünkü kod okunabilirliği zararlı. Yine de senkronizasyondan kurtulacak, bunun için gümüş kurşun yok.
cmaster

4

Eğer kaynak kodunuzun paydaşları (küçük bir kütüphane) paydaşları "kullanıcılardan" (uygulamanıza dahil olmadan kütüphanenizin işlevselliğini kullanacak olan diğer geliştiriciler) ve "geliştiricilerden" (siz ve kütüphaneyi uygulayacak diğer geliştiriciler) oluşturuyorsa daha sonra başlığa "kullanıcıların bilgilerini" ve kaynaktaki "uygulama notunu" koyun.

Başlık dosyalarını kesinlikle gerekmenden daha fazla değiştirmeme arzusuyla ilgili olarak - kütüphanenizin "çılgınca bir değişiklik akışında" olmadığını, "arayüzün" ve "işlevsellik" in çok fazla değişmeyeceğini ve her ikisinin de değişmeyeceğini varsayalım. Başlık yorumları çok sık değişmeli. Öte yandan, kaynak kod açıklamalarının kaynak kod ile senkronize ("yeni") tutulması gerekecektir.


0

Doxygen kullanmanın asıl amacı, dokümantasyon oluşturup başka bir yerden erişilebilir hale getirmenizdir . Şimdi başlıklardaki tüm belgeler sadece gerekli atık bildirimi ve belki de aşırı yüklerini hızlıca tespit etmeyi zorlaştıran atıklardır. Bir liner yorumu, oraya gitmesi gereken maksimumdur, ancak bu bile kötü bir uygulamadır. Sebep kaynaktaki belgeleri değiştirirseniz, o kaynağı yeniden derler ve yeniden bağlarsınız. Ancak dokümanları başlığa koyarsanız, gerçekten en ufak bir şeyi değiştirmek istemezsiniz, çünkü projenin yeniden inşasının önemli bir bölümünü tetikleyecektir.


1
Bu, önceki 7
cevapta

1
@ 7 önceki cevaplardan sadece bir tanesi başlıklara karşı kod lehinedir. Ve bu tamamen farklı bir tartışma veriyor.
Slava
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.