C # için Yorum Devralma (aslında herhangi bir dil)


96

Bu arayüze sahip olduğumu varsayalım

public interface IFoo
{
    ///<summary>
    /// Foo method
    ///</summary>
    void Foo();

    ///<summary>
    /// Bar method
    ///</summary>
    void Bar();

    ///<summary>
    /// Situation normal
    ///</summary>
    void Snafu();
}

Ve bu sınıf

public class Foo : IFoo
{
    public void Foo() { ... }
    public void Bar() { ... }
    public void Snafu() { ... }
}

Bir temel sınıf veya arayüzdeki her üyenin yorumlarını otomatik olarak eklememe izin veren bir yol var mı veya bir araç var mı?

Çünkü türetilmiş her alt sınıf için aynı yorumları yeniden yazmaktan nefret ediyorum!


14
Bundan sadece nefret etmiyorum, aynı zamanda onları uyumlu tutmak da zor.
Olivier Jacot-Descombes

Yanıtlar:


17

GhostDoc tam olarak bunu yapar. Miras alınmayan yöntemler için isimden bir açıklama oluşturmaya çalışır.

FlingThing() olur "Flings the Thing"


2
GhostDoc harika, ihtiyacım olduğunu bilmediğim ama şimdi onsuz yapamadığım şeylerden biri: o)
NikolaiDante

185
Otomatik olarak oluşturulan dokümanlar bana çok kötü bir fikir gibi görünüyor. Herhangi bir yararlı bilgi eklemezler, ancak yalnızca gereksiz yere kodu patlatırlar. Bir araç, bir yöntemin adından ne yaptığını anlayabiliyorsa, bir kişinin de anlayabileceğinden daha iyidir ve herhangi bir belgeye gerek yoktur.
Lensflare

8
@Lensflare Bu çok doğru. Bir keresinde, yalnızca bu tür oluşturulmuş yorumlara sahip, yönteme / sınıfa HİÇBİR bilgi ekleyen bir çerçeve kullanmak zorunda kaldım. "Bu yöntem bunu yapar" yerine "Bu, Z sınıfının XY yöntemidir" gibi yorumlar. xD Ayrıca koda göz atamazsınız, bu yüzden deneme yanılma moduna geçti. Bir daha asla! :-)
itmuckel

15
@Lensflare AGD'lere olduğu kadar güvenmek konusunda size% 100 katılıyorum, ancak AGD'lerin bunun gibi "hepsini yap" sihirli düğmeler olarak kullanılmasının amaçlanmadığını belirtmeliyim. Bunun yerine, kendinize yazmanız gereken standart, tekrarlayan dokümantasyon miktarını azaltmak için şablon oluşturucular olarak kullanılmaları amaçlanmıştır, böylece önemli şeylere odaklanabilirsiniz. --- Örneğin, üretebilir <summary>, <param>, <returns>, <throws>, etc...sizin için bölümler. Çoğu zaman yeterince iyi sonuçlarla; diğer zamanlarda düzeltmeye veya genişletmeye ihtiyaç duyuyor, ancak yine de genel çabayı azaltıyor.
XenoRo

5
insanlar dokümantasyon geliştiriciler için değil, mimarlar içindir, bu yüzden onların izleri kapsanır: "Hey, projenizin kod dokümantasyonunu okuyabilir miyiz? Elbette, işte burada."
Trident D'Gao

157

<inheritdoc />Etiketi her zaman kullanabilirsiniz :

public class Foo : IFoo
{
    /// <inheritdoc />
    public void Foo() { ... }
    /// <inheritdoc />
    public void Bar() { ... }
    /// <inheritdoc />
    public void Snafu() { ... }
}

crefÖzniteliği kullanarak, tamamen farklı bir sınıf veya ad alanındaki tamamen farklı bir üyeye bile başvurabilirsiniz!

public class Foo
{
    /// <inheritdoc cref="System.String.IndexOf" />
    public void Bar() { ... } // this method will now have the documentation of System.String.IndexOf
}

8
<İnheritdoc /> 'un var olduğunu bile bilmiyordum ... Ama görebildiğim kadarıyla, bu yöntemin yorumu intellisense ile ortaya çıkmıyor.
gerleim

12
@gerleim Jeff Heaton'ın bir yıl önceki cevabına ve altındaki yoruma bakın. Sandcastle'da C # değil, <inheritdoc /> var.
rbwhitaker

4
İntellisense arayüzünden, mirasdoc ile ve ayrıca türetilmiş sınıfta hiç kod-dokümanı yoksa yorumları görüyorum. Ancak bu, yeniden paylaşımım olduğu için olabilir.
Tim Abell

9
Resharper 2017.2, inheritdoc jetbrains.com/resharper/whatsnew
Dav Evans

4
Visual Studio Enterprise 2017 (sürüm 15.9.3) benim için devralınan yorumları göstermiyor.
herzbube

26

/// <inheritdoc/>Miras istiyorsanız kullanın . GhostDoc veya benzeri şeylerden kaçının.

Yorumların miras alınmamasının can sıkıcı olduğuna katılıyorum. Birinin vakti olsaydı oluşturmak oldukça basit bir eklenti olurdu (keşke yapsaydım).

Bununla birlikte, kod tabanımızda sadece arayüzlere XML yorumları koyarız ve sınıfa ekstra uygulama yorumları ekleriz. Sınıflarımız özel / dahili olduğundan ve yalnızca arayüz herkese açık olduğundan, bu bizim için işe yarar. Nesneleri arayüzler aracılığıyla her kullandığımızda, tam yorumlara sahip oluruz.

GhostDoc iyi bir başlangıçtır ve süreci yorum yazmayı kolaylaştırmıştır. Parametreleri eklediğinizde / kaldırdığınızda, GhostDoc'u yeniden çalıştırdığınızda açıklamaları güncel tutmak özellikle yararlıdır ve açıklamayı güncelleyecektir.


Kafam karıştı - GhostDoc'tan kaçın dedin, ama sonunda GhostDoc'u işlerin daha kolay hale getirilmesine yardımcı olduğunu kabul ettin. Ne demek istediğini açıklayabilir misin?
Mike Marynowski

Teşekkürler @MikeMarynowski. Bu eski bir tavsiye. Sanırım o zamanlar GhostDoc'un, diğer herhangi bir jeneratör gibi, yorumlar ekleyeceğini, ancak neredeyse gereksiz ayrıntılarla, örneğin <param name="origin">The origin.</param>. Daha fazla örnek için ghostdoc'a bakın . Visual Studio, artık parametreler ve belgeler hizalanmadığında GhostDoc (veya diğer araçlar) artık gerekli olmadığında size bilgi vermek için xmldocs için çok daha iyi linting ve oluşturuculara sahiptir.
Dennis

15

Java'da bu var ve her zaman kullanıyorum. Sadece yap:

/**
 * {@inheritDoc}
 */

Ve Javadoc aracı bunu çözüyor.

C # benzer bir işaretleyiciye sahiptir:

<inheritDoc/>

Daha fazlasını buradan okuyabilirsiniz:

http://www.ewoodruff.us/shfbdocs/html/79897974-ffc9-4b84-91a5-e50c66a0221d.htm


37
C # <inheritdoc/>işaretine sahip değil : Sandcastle'da var. shfb.codeplex.com
Eric

8
C # 'a <inheritdoc /> eklemek için bir kullanıcı ses özelliği isteği var. Go at yukarı-oy it visualstudio.uservoice.com/forums/121579-visual-studio/...
deadlydog

1
Ne C # ne de Java (veya başka bir programlama dili) "XML doc" öğelerinin hiçbirine sahip değildir. Bunlar yorumlardır . Derleyiciler onlar hakkında hiçbir şey bilmiyor. Hepsi, javadoc veya sandcastle veya her neyse, üçüncü taraf dokümantasyon oluşturucuları tarafından katı bir şekilde kullanılır.
James Curran

4
Java veya C # belirtildiğinde, GENEL OLARAK ilişkili araçlar topluluğu anlamına gelir. Ne Java ne de C #, kelimenin tam anlamıyla fazla bir yeteneğe sahip değildir. Java veya C # 'nin bir veritabanına bağlanma yeteneğinden yoksun olduğunu belirtmek akademik bir argüman olur, çünkü çalışma zamanı kitaplığı bunu yapar.
JeffHeaton

2
Visual Studio sürüm 16.4.0 ve daha yenisi, <inheritDoc /> için intellisense sağlar! docs.microsoft.com/en-us/visualstudio/releases/2019/…
ashbygeek

11

Doğrudan kullanmayı söyleyebilirim

/// <inheritdoc cref="YourClass.YourMethod"/>  --> For methods inheritance

Ve

/// <inheritdoc cref="YourClass"/>  --> For directly class inheritance

Bu yorumları sınıfınızın / yönteminizin önceki satırına koymalısınız.

Bu, örneğin aşağıdaki gibi belgelediğiniz bir arayüzden yorumlarınızın bilgilerini alacaktır:

    /// <summary>
    /// This method is awesome!
    /// </summary>
    /// <param name="awesomeParam">The awesome parameter of the month!.</param>
    /// <returns>A <see cref="AwesomeObject"/> that is also awesome...</returns>
    AwesomeObject CreateAwesome(WhateverObject awesomeParam);

Tavsiyen için teşekkürler! Bu yaklaşım daha belirgindir ve nesne sınıfından miras sınıf açıklaması sorununu çözer (arabirimi uygularken bile).
Denis Babarykin

8

Resharper, yorumları temel sınıftan veya arayüzden kopyalama seçeneğine sahiptir.


1
Oh? Nasıl? ReSharper kullanıyorum ve bir arabirimi uygularken veya devralırken bu seçeneği hiç görmedim ... Nerede ve bu seçeneği nasıl kullanıyorsunuz?
Jazimov

2
@Jazimov Geçersiz kılma yöntemini Alt + Girdiğinizde, "Tabandan dokümantasyonu kopyala" seçeneği vardır.
svick

8

Başka bir yol da <see />XML dokümantasyon etiketini kullanmaktır . Bu biraz fazladan çaba ama kutunun dışında çalışıyor ...

İşte bazı örnekler:

/// <summary>
/// Implementation of <see cref="IFoo"/>.
/// </summary>
public class Foo : IFoo
{
    /// <summary>
    /// See <see cref="IFoo"/>.
    /// </summary>
    public void Foo() { ... }

    /// <summary>
    /// See <see cref="IFoo.Bar"/>
    /// </summary>
    public void Bar() { ... }

    /// <summary>
    /// This implementation of <see cref="IFoo.Snafu"/> uses the a caching algorithm for performance optimization.
    /// </summary>
    public void Snafu() { ... }
}

Güncelleme:

Şimdi /// <inheritdoc/>ReSharper tarafından desteklenen kullanmayı tercih ediyorum .


1

<inheritdoc/>XML dokümantasyon dosyalarının kendisinde etiketi değiştirmek için destek eklemek üzere XML dokümantasyon dosyalarını sonradan işlemek için bir araç oluşturdum . Www.inheritdoc.io adresinde mevcuttur (ücretsiz sürümü mevcuttur).


0

Bir tür yerel çözüm var, .NET Core 2.2 için buldum

Fikir <include>etiketi kullanmaktır .

Ekleyebilir <GenerateDocumentationFile>true</GenerateDocumentationFile>senin .csprojbir dosya.

Bir arayüzünüz olabilir:

namespace YourNamespace
{
    /// <summary>
    /// Represents interface for a type.
    /// </summary>
    public interface IType
    {
        /// <summary>
        /// Executes an action in read access mode.
        /// </summary>
        void ExecuteAction();
    }
}

Ve ondan miras kalan bir şey:

using System;

namespace YourNamespace
{
    /// <summary>
    /// A type inherited from <see cref="IType"/> interface.
    /// </summary>
    public class InheritedType : IType
    {
        /// <include file='bin\Release\netstandard2.0\YourNamespace.xml' path='doc/members/member[@name="M:YourNamespace.IType.ExecuteAction()"]/*'/>
        public void ExecuteAction() => Console.WriteLine("Action is executed.");
    }
}

Tamam, biraz korkutucu, ancak beklenen öğeleri YourNamespace.xml.

Eğer inşa edersen Debug yapılandırmayı, sen takas olabilir Releaseiçin Debugde fileoznıtelığıinclude etiketi.

Doğru bulmak için membernameReferans verecek 'ları sadece oluşturulan Documentation.xmldosyayı açın .

Ayrıca, bu yaklaşımın bir proje veya çözümün en az iki kez oluşturulmasını gerektirdiğini varsayıyorum (ilk kez bir ilk XML dosyası oluşturmak ve ikinci kez öğeleri ondan kendisine kopyalamak için).

İşin iyi tarafı, Visual Studio'nun kopyalanan öğeleri doğrulamasıdır, bu nedenle belgeleri ve kodu arabirim / temel sınıf vb. (Örneğin bağımsız değişkenlerin adları, tür parametrelerinin adları, vb.) İle senkronize tutmak çok daha kolaydır.

<inheritdoc/>Projemde , hem (DocFX için) hem de (NuGet <include/>paketlerini yayınlamak ve Visual Studio'da doğrulama için):

        /// <inheritdoc />
        /// <include file='bin\Release\netstandard2.0\Platform.Threading.xml' path='doc/members/member[@name="M:Platform.Threading.Synchronization.ISynchronization.ExecuteReadOperation(System.Action)"]/*'/>
        public void ExecuteReadOperation(Action action) => action();
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.