C #에 대한 주석 상속 (실제로 모든 언어)


93

이 인터페이스가 있다고 가정합니다.

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

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

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

그리고이 수업

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

방법이 있습니까, 아니면 기본 클래스 또는 인터페이스에서 각 멤버의 주석을 자동으로 입력 할 수있는 도구가 있습니까?

파생 된 각 하위 클래스에 대해 동일한 주석을 다시 작성하는 것을 싫어하기 때문입니다!


14
나는 그것을 싫어할뿐만 아니라 동기화를 유지하는 것도 어렵다.
Olivier Jacot-Descombes

답변:


17

GhostDoc 은 정확히 그렇게합니다. 상속되지 않는 메서드의 경우 이름에서 설명을 만들려고합니다.

FlingThing() 된다 "Flings the Thing"


2
GhostDoc은 굉장합니다. 내가 필요하다는 것을 알지 못했지만 지금 없이는 할 수없는 것 중 하나입니다. : o)
NikolaiDante 2008-12-05

180
자동으로 생성 된 문서는 나에게 매우 나쁜 생각처럼 보입니다. 유용한 정보를 추가하지 않고 불필요하게 코드를 날려 버립니다. 도구가 이름에서 메서드가하는 일을 이해할 수 있다면 사람도 이해할 수 있고 문서가 필요하지 않습니다.
Lensflare

8
@Lensflare 이것은 사실입니다. 나는 한때 메소드 / 클래스에 정보를 추가하지 않는 생성 된 주석 만있는 프레임 워크를 사용해야했습니다. "This method does this and that"대신 "This is method XY of class Z"와 같은 주석이 있습니다. xD 또한 코드를 찾아 볼 수 없어 시행 착오로 내려갔습니다. 다시는! :-)
itmuckel jul.

15
나는 100 %까지 AGDs에 의존하는만큼 당신과 동의하지만 @Lensflare은 그대로 , 내가 AGDs가 사용되기 위하여 의미되지 않는다는 지적해야 같은 마법의 버튼 "모든 것을 할". 대신 템플릿 생성기로 사용되어 사용자가 직접 작성해야하는 반복적 인 문서 인 상용구의 양을 줄여 중요한 내용에 집중할 수 있습니다. --- 예를 들어, 그것은 생성 할 수 있습니다 <summary>, <param>, <returns>, <throws>, etc...당신을위한 섹션을. 충분히 좋은 결과를 여러 번; 다른 경우에는 수정이나 확장이 필요하지만 전체적인 노력은 여전히 ​​줄어 듭니다.
XenoRo

5
사람들은 문서가 개발자를위한 것이 아니라 아키텍트를위한 것이기 때문에 그들의 엉덩이는 모두 다루어집니다.
Trident D' Gao

151

언제든지 <inheritdoc />태그를 사용할 수 있습니다 .

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

7
<inheritdoc /> 존재조차 몰랐습니다 ...하지만 제가 볼 수있는 한이 방법에 대한 설명은 intellisense로 표시되지 않습니다.
gerleim

12
@gerleim 1 년 전 Jeff Heaton의 답변과 그 아래의 의견을 살펴보십시오. Sandcastle에는 C #이 아닌 <inheritdoc />이 있습니다.
rbwhitaker

4
intellisense의 인터페이스에서 inheritdoc을 사용하여 주석을 봅니다. 또한 파생 클래스에 코드 문서가 전혀없는 경우도 있습니다. 그러나 그것은 내가 다시 날카롭게했기 때문일 수 있습니다.
Tim Abell

9
2017.2 ReSharper에서이 inheritdoc에 대한 향상된 지원이 jetbrains.com/resharper/whatsnew을
DAV 에반스에게

3
Visual Studio Enterprise 2017 (버전 15.9.3)은 상속 된 주석을 표시하지 않습니다.
herzbube dec

26

/// <inheritdoc/>상속을 원하는 경우 사용하십시오 . GhostDoc 또는 이와 유사한 것을 피하십시오.

댓글이 상속되지 않는다는 것이 귀찮다는 데 동의합니다. 누군가가 시간을 가졌다면 만드는 것은 상당히 간단한 추가 기능 일 것입니다.

즉, 코드베이스에서 인터페이스에만 XML 주석을 넣고 클래스에 추가 구현 주석을 추가합니다. 이것은 우리의 클래스가 비공개 / 내부이고 인터페이스 만 공개되기 때문에 우리에게 효과적입니다. 인터페이스를 통해 객체를 사용할 때마다 전체 주석이 지능적으로 표시됩니다.

GhostDoc은 좋은 시작이며 프로세스를 주석 작성하기 쉽게 만들었습니다. 매개 변수를 추가 / 제거하고 GhostDoc을 다시 실행할 때 주석을 최신 상태로 유지하는 것이 특히 유용하며 설명을 업데이트합니다.


혼란 스럽습니다. GhostDoc을 피하라고 하셨지만, 결국에는 작업을 더 쉽게하도록 GhostDoc을 승인 한 것 같습니다. 무슨 뜻인지 명확히 할 수 있습니까?
Mike Marynowski

감사합니다 @MikeMarynowski. 이것은 오래된 조언입니다. 나는 다른 생성기와 마찬가지로 GhostDoc이 주석을 추가하지만 거의 쓸모없는 세부 사항을 추가 할 것이라고 말하고 싶었습니다 <param name="origin">The origin.</param>. 더 많은 예를 보려면 ghostdoc이 가장 나쁜 것을 말합니다 . 이제 Visual Studio에는 매개 변수와 문서가 정렬되지 않아 GhostDoc (또는 기타 도구)이 더 이상 필요하지 않은 경우이를 알려주는 xmldocs 용 훨씬 더 나은 linting 및 생성기가 있습니다.
Dennis

15

Java에는이 기능이 있으며 항상 사용합니다. 그냥 해:

/**
 * {@inheritDoc}
 */

그리고 Javadoc 도구가이를 파악합니다.

C #에는 비슷한 마커가 있습니다.

<inheritDoc/>

여기에서 자세한 내용을 읽을 수 있습니다.

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


37
C #에는 <inheritdoc/>마커 가 없습니다 . Sandcastle 에는 마커 가 있습니다. shfb.codeplex.com
Eric Dand

8
C #에 <inheritdoc />을 추가하라는 사용자 음성 기능 요청이 있습니다. visualstudio.uservoice.com/forums/121579-visual-studio/
deadlydog

1
C #이나 Java (또는 다른 프로그래밍 언어)에는 "XML doc"요소가 없습니다. 이것은 코멘트 입니다. 컴파일러는 그들에 대해 알지 못합니다. javadoc이든 sandcastle이든 상관없이 타사 문서 생성기에서 모두 엄격하게 사용됩니다.
James Curran

4
Java 또는 C #은 일반적으로 관련 도구의 커뮤니티를 의미합니다. 자바도 C #도 문자 그대로의 능력이별로 없습니다. 런타임 라이브러리가이를 수행하기 때문에 Java 또는 C #이 데이터베이스에 연결하는 기능이 없다고 말하는 것은 학술적인 주장입니다.
JeffHeaton

2
Visual Studio 버전 16.4.0 이상은 <inheritDoc />에 대한 인텔리전스를 제공합니다! docs.microsoft.com/en-us/visualstudio/releases/2019/…
ashbygeek

10

나는 직접 사용한다고 말할 것입니다

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

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

이 주석은 클래스 / 메소드의 이전 줄에만 넣어야합니다.

예를 들어 다음과 같이 문서화 한 인터페이스에서 댓글 정보를 가져옵니다.

    /// <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);

충고에 감사하다! 이 접근 방식은보다 명시 적이며 객체 클래스에서 상속 클래스 설명 문제를 해결합니다 (인터페이스 구현시에도).
Denis Babarykin

8

Resharper에는 기본 클래스 또는 인터페이스에서 주석을 복사하는 옵션이 있습니다.


1
오? 어떻게? 저는 ReSharper를 사용하는데 인터페이스를 구현하거나 상속 할 때이 옵션을 본 적이 없습니다. 어디에 있으며이 옵션을 어떻게 사용합니까?
Jazimov

2
@Jazimov 재정의 방법을 Alt + Enter하면 "기본에서 문서 복사"옵션이 있습니다.
svick

8

또 다른 방법은 <see />XML 문서 태그 를 사용하는 것 입니다. 이것은 약간의 추가 노력이지만 기본적으로 작동합니다 ...

여기 몇 가지 예가 있어요.

/// <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() { ... }
}

최신 정보:

이제 /// <inheritdoc/>ReSharper에서 지원하는 것을 선호합니다 .


1

결국 <inheritdoc/>XML 문서 파일 자체 의 태그 교체 지원을 추가하기 위해 XML 문서 파일을 사후 처리하는 도구를 만들었습니다 . www.inheritdoc.io 에서 사용 가능 (무료 버전 사용 가능).


0

글쎄, .NET Core 2.2에 대한 일종의 기본 솔루션이 있습니다.

아이디어는 <include> 태그 .

당신은 <GenerateDocumentationFile>true</GenerateDocumentationFile>당신의.csproj파일을 .

인터페이스가있을 수 있습니다.

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

그리고 그것으로부터 물려받은 것 :

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.");
    }
}

좋아, 약간 무섭지 만 예상되는 요소를 YourNamespace.xml.

당신이 구축되면 Debug구성을, 당신은 교환 할 수 있습니다 Release에 대한 Debug에서 file의 속성 include태그입니다.

참조 할 올바른 member의 를 찾으 name려면 생성 된 Documentation.xml파일을여십시오.

또한이 접근 방식을 사용하려면 프로젝트 또는 솔루션을 최소한 두 번 빌드해야한다고 가정합니다 (처음에는 초기 XML 파일을 만들고 두 번째는 요소를 자체로 복사).

좋은 점은 Visual Studio가 복사 된 요소의 유효성을 검사하므로 인터페이스 / 기본 클래스 등 (예 : 인수 이름, 형식 매개 변수 이름 등)과 동기화 된 문서 및 코드를 유지하는 것이 훨씬 쉽다는 것입니다.

내 프로젝트에서 <inheritdoc/>(DocFX 용) 및 <include/>(NuGet 패키지 게시 및 Visual Studio에서 유효성 검사 용 ) 모두로 끝났습니다 .

        /// <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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.