Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DRY XML comments

When providing multiple overloads of the same method, I often have to repeat the description of the method, which violates DRY and increases maintenance cost:

/// <summary>
/// Frobnicates all foos read from the given reader. Frobnication is a
/// process where ...[lots of text]...
/// </summary>
/// <param name="hasBar">[Description of hasBar]</param>
void FrobnicateFoo(TextReader reader, bool hasBar)
{
    ...
}

/// <summary>
/// Frobnicates all foos read from the given file. Frobnication is a
/// process where ...[same lots of text]...
/// </summary>
/// <param name="hasBar">[Same description of hasBar]</param>
void FrobnicateFoo(String path, bool hasBar)
{
    ...
}

This problem gets worse if multiple parameters with the same purpose are repeated ("hasBar" is given as an example).

One "workaround" I found is to "reference" the other documentation:

/// <summary>
/// Frobnicates all foos read from the given reader. Frobnication is a
/// process where ...[lots of text]...
/// </summary>
/// <param name="hasBar">[Description of hasBar]</param>
void FrobnicateFoo(TextReader reader, bool hasBar)
{
    ...
}

/// <summary>
/// Convenience method which opens the file with a UTF-8 encoding and then
/// frobnicates all foos, see FrobnicateFoo(TextReader).
/// </summary>
void FrobnicateFoo(String path, bool hasBar)
{
    ...
}

Obviously, that's less convenient for the user of the library.

Is there some built-in mechanism (or smart strategy) that I can use to avoid duplication and make life easy for the users of my methods? I am mainly concerned about IntelliSense, not generated HTML documentation.

like image 210
Heinzi Avatar asked Jan 18 '17 09:01

Heinzi


People also ask

Can you comment in XML?

An XML comment encountered outside the document type declaration is represented by the Comment value syntax element. It contains the comment text from the XML message. If the value of the element contains the character sequence --> , the sequence is replaced with the text --&gt; .

How do you comment out multiple lines in XML?

Select the entire block of xml and hit CTRL+/ to comment the entire block. The comment that was present previously now shows up as part of the file and not as a comment anymore.

What is XML comments in C#?

C# documentation comments use XML elements to define the structure of the output documentation. One consequence of this feature is that you can add any valid XML in your documentation comments. The C# compiler copies these elements into the output XML file.

Does XML allow commenting elements?

Allows notes and other human readable comments to be included within an XML file. XML Parsers should ignore XML comments. Some constrains govern where comments may be placed with an XML file.


1 Answers

There is actually a solution using XML tag. You actually build your documentation in a XML file and then link your method to this XML file. Here is a small example I made up.

Solution here is in VB.NET, but I guess it won't be really difficult to convert it to C#...

First, you need a standard library definition:

''' <summary>
''' This is my First class
''' </summary>
''' <remarks></remarks>
Public Class FirstClass
    ''' <summary>
    ''' This is my first method
    ''' </summary>
    ''' <param name="A">A</param>
    ''' <returns>True</returns>
    ''' <remarks></remarks>
    Public Function FirstMethod(A As Integer) As Boolean
        Return True
    End Function

    ''' <include file="DocFile.xml" path="Doc/member[@name='SecondMethod']/*" />
    Public Function SecondMethod(A As Integer) As String
        Return "Hello"
    End Function

    ''' <include file="DocFile.xml" path="Doc/member[@name='SecondMethod']/*" />
    Public Function SecondMethod(A As Integer, B As String) As String
        Return "Hello"
    End Function

    ''' <include file="DocFile.xml" path="Doc/member[@name='SecondMethod']/*" />
    Public Function SecondMethod(A As Integer, B As String, C As Boolean) As String
        Return "Hello"
    End Function

End Class

So the doc for the class and the first method are "standard". For the SecondMethod, I provide a XML link.

So next you need to create a XML file, here called DocFile.XML where you will put the documentation for your methods:

<Doc>
  <member name="SecondMethod">
    <summary>
      This is my second method
    </summary>
    <param name="A">a</param>
    <param name="B">b</param>
    <param name="C">c</param>
    <returns>A string containing "Hello"</returns>
    <remarks></remarks>
  </member>
</Doc>

And when you compile it together and create the documentation (here I used SandCastle), it produces the following:

enter image description here

And for each method:

enter image description here

and

enter image description here

TLDR

  • It is possible to create the documentation once in a XML file and link the methods to this documentation.
  • You can link many methods to one definition
  • Case is sensitive
  • Visual Studio (here I used VS 2010 Express) is not really helpfull on this one, it has no idea of what you're doing. When you compile, you will not be able to see it in the intellisense of your project. If you create another solution and reference your library then you will see it.
like image 70
Martin Verjans Avatar answered Oct 19 '22 10:10

Martin Verjans