XML 주석이 필요한 문서입니까?


10

나는 문서에 XML 주석을 요구하는 팬이었습니다. 그 이후로 두 가지 주요 이유로 마음이 바뀌 었습니다.

  1. 좋은 코드와 마찬가지로 메서드는 설명이 필요합니다.
  2. 실제로, 대부분의 XML 주석은 추가 가치를 제공하지 않는 쓸모없는 잡음입니다.

여러 번 우리는 단순히 GhostDoc을 사용하여 일반적인 주석을 생성합니다. 이것이 쓸모없는 소음이라는 의미입니다.

    /// <summary>
    /// Gets or sets the unit of measure.
    /// </summary>
    /// <value>
    /// The unit of measure.
    /// </value>
    public string UnitOfMeasure { get; set; }

나에게 그것은 분명하다. 그러나 포함해야 할 특별한 지침이 있다면 절대 XML 주석을 사용해야합니다.

나는이 기사 에서 발췌 한 것을 좋아한다 .

때로는 의견을 작성해야합니다. 그러나 규칙이 아닌 예외가되어야합니다. 주석은 코드로 표현할 수없는 것을 표현할 때만 사용해야합니다. 우아한 코드를 작성하려면 주석을 제거하고 자체 문서화 코드를 작성하십시오.

코드 자체로는 스스로 설명하기에 충분하지 않을 때 XML 주석 만 사용해야한다고 생각하는 것이 잘못입니까?

XML 주석으로 인해 코드가보기 흉하게 보일 수있는 좋은 예라고 생각합니다. 이런 수업이 필요합니다 ...

public class RawMaterialLabel : EntityBase
{
    public long     Id                      { get; set; }
    public string   ManufacturerId          { get; set; }
    public string   PartNumber              { get; set; }
    public string   Quantity                { get; set; }
    public string   UnitOfMeasure           { get; set; }
    public string   LotNumber               { get; set; }
    public string   SublotNumber            { get; set; }
    public int      LabelSerialNumber       { get; set; }
    public string   PurchaseOrderNumber     { get; set; }
    public string   PurchaseOrderLineNumber { get; set; }
    public DateTime ManufacturingDate       { get; set; }
    public string   LastModifiedUser        { get; set; }
    public DateTime LastModifiedTime        { get; set; }
    public Binary   VersionNumber           { get; set; }

    public ICollection<LotEquipmentScan> LotEquipmentScans { get; private set; }
}

... 그리고 이것으로 바뀝니다.

/// <summary>
/// Container for properties of a raw material label
/// </summary>
public class RawMaterialLabel : EntityBase
{
    /// <summary>
    /// Gets or sets the id.
    /// </summary>
    /// <value>
    /// The id.
    /// </value>
    public long Id { get; set; }

    /// <summary>
    /// Gets or sets the manufacturer id.
    /// </summary>
    /// <value>
    /// The manufacturer id.
    /// </value>
    public string ManufacturerId { get; set; }

    /// <summary>
    /// Gets or sets the part number.
    /// </summary>
    /// <value>
    /// The part number.
    /// </value>
    public string PartNumber { get; set; }

    /// <summary>
    /// Gets or sets the quantity.
    /// </summary>
    /// <value>
    /// The quantity.
    /// </value>
    public string Quantity { get; set; }

    /// <summary>
    /// Gets or sets the unit of measure.
    /// </summary>
    /// <value>
    /// The unit of measure.
    /// </value>
    public string UnitOfMeasure { get; set; }

    /// <summary>
    /// Gets or sets the lot number.
    /// </summary>
    /// <value>
    /// The lot number.
    /// </value>
    public string LotNumber { get; set; }

    /// <summary>
    /// Gets or sets the sublot number.
    /// </summary>
    /// <value>
    /// The sublot number.
    /// </value>
    public string SublotNumber { get; set; }

    /// <summary>
    /// Gets or sets the label serial number.
    /// </summary>
    /// <value>
    /// The label serial number.
    /// </value>
    public int LabelSerialNumber { get; set; }

    /// <summary>
    /// Gets or sets the purchase order number.
    /// </summary>
    /// <value>
    /// The purchase order number.
    /// </value>
    public string PurchaseOrderNumber { get; set; }

    /// <summary>
    /// Gets or sets the purchase order line number.
    /// </summary>
    /// <value>
    /// The purchase order line number.
    /// </value>
    public string PurchaseOrderLineNumber { get; set; }

    /// <summary>
    /// Gets or sets the manufacturing date.
    /// </summary>
    /// <value>
    /// The manufacturing date.
    /// </value>
    public DateTime ManufacturingDate { get; set; }

    /// <summary>
    /// Gets or sets the last modified user.
    /// </summary>
    /// <value>
    /// The last modified user.
    /// </value>
    public string LastModifiedUser { get; set; }

    /// <summary>
    /// Gets or sets the last modified time.
    /// </summary>
    /// <value>
    /// The last modified time.
    /// </value>
    public DateTime LastModifiedTime { get; set; }

    /// <summary>
    /// Gets or sets the version number.
    /// </summary>
    /// <value>
    /// The version number.
    /// </value>
    public Binary VersionNumber { get; set; }

    /// <summary>
    /// Gets the lot equipment scans.
    /// </summary>
    /// <value>
    /// The lot equipment scans.
    /// </value>
    public ICollection<LotEquipmentScan> LotEquipmentScans { get; private set; }
}

2
나는 XML이이 목적을위한 끔찍한 선택이라고 주장 할 것이다. 현재 사용하기에는 너무 장황하고 일반적입니다. 주석을 읽을 수 없게하지 않고 주석에 포함 된 마크 업 언어에 대해서는 reStructuredText스핑크스 를 확인하십시오 .
Latty

2
@Lattyware : VisualStudio는 기본적으로이 스타일을 지원하므로 추가 플러그인이나 도구가 필요하지 않습니다. 이 방법으로 생성 된 주석은 팝업 툴팁에 즉시 표시됩니다.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner 플러그인을 얻는 것이 코드를 훨씬 더 읽기 쉽게 만들 가치가 있다고 말할 것입니다. PyCharm과 같은 툴팁으로 reST를 기본적으로 지원하므로 다른 IDE의 다른 언어에 대한 플러그인이 있다고 확신합니다. 모든 것이 이런 식으로 문서화되어있는 프로젝트가 있다면 분명히 그 방법을 나누기 시작하는 것이 아니라 새 프로젝트의 경우에는 읽고 유지하는 것이 끔찍하다고 생각합니다.
Latty

답변:


21

귀하의 의견이 다음과 같은 경우에만 :

/// <summary>
/// Gets or sets the sublot number.
/// </summary>
/// <value>
/// The sublot number.
/// </value>

그렇다면 모두 유용하지는 않습니다. 그들이 이런 것을 읽는다면 :

/// <summary>
/// Gets or sets the sublot number.
/// Note that the sublot number is only used by the legacy inventory system.
/// Latest version of the online inventory system does not use this, so you can leave it null. 
/// Some vendors require it but if you don't set it they'll send a request for it specifically.
/// </summary>
/// <value>
/// The sublot number.
/// </value>

그런 다음 그들이 가치가 있다고 말하고 싶습니다. 따라서 귀하의 질문에 대답하십시오 : 주석은 코드가 말하지 않은 것을 말할 때 필요합니다.

예외 : 일반인이 이용할 수있는 라이브러리 / API를 작성하는 경우 공개적으로 액세스 할 수있는 모든 것에 대한 의견을 갖는 것이 좋습니다 . 나는 라이브러리를 사용하고 APCDGFSocket이 무엇인지에 대한 설명없이 이름이 지정된 함수를 보는 것이 싫어 . 따라서이 경우 도구를 사용하여 모든 주석을 생성 한 다음 필요한 주석을 수동으로 조정하십시오 (암호 약어가 설명되어 있는지 확인하십시오).getAPCDGFSocket()This gets the Async Process Coordinator Data Generator File Socket

또한 getter / setter는 일반적으로 "주석이 필요한가?"에 대한 나쁜 예입니다. 그것들은 보통 명백하고 의견이 필요하지 않기 때문입니다. 어떤 알고리즘을 수행하는 기능에 대해서는 주석이 더 중요합니다. 여기서 일이 수행되고 있는지에 대한 설명은 코드를 훨씬 더 이해하기 쉽게 해줄뿐만 아니라 미래의 프로그래머가보다 쉽게 ​​작업 할 수있게합니다.

... 그리고 마지막으로,이 질문은 XML을 사용하여 형식이 지정된 주석뿐만 아니라 모든 스타일의 주석과 관련이 있다고 확신합니다 (.NET 환경에서 작업하기 때문에 사용 중임).


2
+1-GhostDoc은 보일러 플레이트 인 첫 번째 버전을 자세한 도메인 지식이 포함 된 두 번째 버전으로 바꾸는 출발점입니다.
Jesse C. Slicer

4
이유 부분 은 +1입니다 . DRY 원칙이 적용됩니다-반복하지 마십시오. 코드가 이미 어떤 부분 을 설명하는 데 아주 능숙하다면 의견은 다른 것을 설명하는 데 집중해야합니다 (일반적으로 이유 ).
Daniel B

@DanielB 또는 어쩌면 당신은 전혀 주석이 필요하지 않습니다;) 나는 "코멘트가 말하지 않은 것을 말할 때 주석이 필요합니다."에서 필요한 단어를 제외 하고는이 답변에 대부분 동의합니다. 코드가 필요한 모든 것을 말하면 주석이 코드가 아닌 정보를 제공하더라도 주석에 더 많은 정보가 필요하지 않다고 생각합니다.
Jimmy Hoffa

1
@DanielB-.NET의 XML 주석은 주로 라이브러리 또는 서비스의 최종 사용자 프로그래머가 소스 코드를 사용할 수없는 상황을위한 것입니다.
jfrankcarr

2
@Lattyware-XML 주석은 Visual Studio의 Intellisense와 완벽하게 통합되어 별도의 문서에서 물건을 찾는 것보다 시간을 크게 절약합니다.
jfrankcarr

5

코드를 읽을 수있는 사용자에게 쓸모가없는 주석은 소스에 액세스 할 수없는 사용자에게 유용합니다. 이것은 조직 외부의 사람들이 클래스를 외부 API로 사용하는 경우에 발생합니다. XML 문서에서 생성 된 HTML이 클래스에 대해 배울 수있는 유일한 방법입니다.

즉, 단어 사이에 공백이 추가 된 메소드 이름을 반복하는 주석은 쓸모가 없습니다. 수업을 조직 외부에서 사용하려는 경우 유효한 값의 범위를 최소한으로 문서화해야합니다. 예를 들어, 해당 설정 말을해야 UnitOfMeasurenull불법 세터에 공급되는 값이 시작 또는 문자열의 끝 부분에 공백이 포함 된 등 안된다는 것을. LabelSerialNumber평범한 것과 다른 경우 의 범위를 문서화해야합니다 Int32. 아마도 음수를 허용하지 않습니다 *또는 7 자리를 초과하지 않아야합니다. 내부 사용자는 매일 일련 번호를 확인하기 때문에 당연한 것으로 생각할 수 있지만 외부 사용자는 무고한 세터처럼 보이는 예외를보고 놀랄 수 있습니다.


* ...이 경우 uint더 나은 선택 일 수 있습니다


1
소스가 없을 때만 사용할 수 있습니다. 편집기에서 Visual Studio가 Xml 주석을 사용하는 것처럼 구문 분석 할 수 있으면 다른 파일을 탐색하지 않고도 마우스 오버 / 팝업으로 정보를 제공 할 수 있습니다. setter가 구현 된 파일로 이동하면 int를 더 좁은 범위로 제한하는 1 행 범위 유효성 검증 기가 분명합니다. "myFrobable.Fro ..."입력을 시작하면 "FrobableID는 0에서 1000 사이 여야합니다"라는 메시지가 나타나고 자동 완성 기능이 도움이됩니다.
Dan은 불을 피우고있다

1

당신은 그런 쓸모없는 말을 피하는 것에 대해 절대적으로 옳습니다. 그것들은 코드를 더 쉽게 만드는 대신 코드를 읽기 어렵게 만들고 너무 많은 공간을 차지합니다.

내 연습에서 getter / setter로 주석을 작성하는 사람들은 실제로 필요한 경우 주석을 생략하는 경향이 있습니다 (문서가없는 구성 요소에 대한 20 줄 sql-query 작성).

나는 다른 명백한 해결책이있을 때 의견을 씁니다. _ 왜이 접근법이 정확하게 사용되었는지를 나타냅니다. 또는 모든 세부 사항을 모른 채 아이디어를 얻는 것이 어려운 경우 _ 코드를 이해하는 데 필요한 세부 사항을 간단히 나열합니다.

당신이 가져 오는 예는 다른 사람들의 삶을 더 편하게 만드는 것이 아니라 의견을 쓰는 것이라고 말하는 의견을 더 많이 쓰는 것입니다.

BTW 당신은 ​​당신의 오래된 코드로 돌아가서 이해하려고 노력함으로써 주석을 작성하는 능력을 향상시킬 수 있습니다 (2-3 개월 안에 자신의 코드를 인식하지 못할 수도 있습니다-다른 사람의 코드를 읽는 것과 절대적으로 같지 않습니다). 당신이 고통없이 이것을한다면, 모든 것이 잘됩니다.


나는 더 이상 게터 / 세터에 대한 의견을 쓰려고 노력하는 사람을 모른다. 거의 모든 최신 IDE를 사용하는 경우 (및 고급 텍스트 편집기에서도 플러그인을 통해이를 지원할 수 있음) 일반적으로 마우스 클릭 또는 두 번 또는 올바른 키 입력 (구성된 경우)을 사용하여 게터 및 세터를 매우 쉽게 문서화 할 수 있습니다. 때로는 데이터베이스 스키마 또는 WSDL을 기반으로 코드를 생성 할 때 자동으로 생성됩니다.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner, 내가 얘기 한 사람이 회사를 떠나 있었고, 나는 게터 / 세터에 대한 모든 의견은 그 / 그녀가 어떤 문서를 떠나 어떤 노력했던 것을 보여주기 위해 그 사람에 의해 수행되었다 생각
가게되는

사람이 통지 한 후 모든보고 주석이 입력 되었습니까? 사람들이 VS가 "공개적으로 보이는 Foo에 누락 된 XML 주석"경고를 생성하는 것을 막기위한 방법으로 빈 곳에서 쓸모없는 XML 주석을 작성하는 것을 보았습니다.
Dan은 불을 피우고있다

@ Dan Neely, 나는 사람이 실제로 신경 쓰지 않았고 의견이 추가되었다고 말하는 의견을 추가했다고 생각합니다. 우리는 일반적으로 주석에 많은 관심을 기울이지 않지만 누군가가 떠나서 구성 요소를 작업하는 경우 명확하고 읽기 쉬운 코드를 작성해야합니다.
superM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.