ความเห็น 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 เป็นตัวเลือกที่น่ากลัวสำหรับวัตถุประสงค์นี้ เป็นวิธีการ verbose และทั่วไปเกินไปสำหรับการใช้งานที่มือ ลองใช้reStructuredTextและสฟิงซ์เพื่อหาภาษามาร์กอัปที่ฝังไว้ในความคิดเห็นโดยไม่ทำให้อ่านไม่ได้
Latty

2
@ Lattyware: VisualStudio รองรับสไตล์นี้ตามค่าเริ่มต้นไม่จำเป็นต้องมีปลั๊กอินหรือเครื่องมือเพิ่มเติม ความคิดเห็นที่สร้างด้วยวิธีนี้สามารถมองเห็นได้ทันทีในคำแนะนำเครื่องมือแบบป๊อปอัป
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner ฉันจะบอกว่าการรับปลั๊กอินนั้นคุ้มค่าที่จะทำให้โค้ดของคุณอ่านง่ายขึ้น การสนับสนุน reST ในตัวพร้อมกับคำแนะนำเครื่องมือเช่นนั้นอยู่ใน PyCharm ดังนั้นฉันแน่ใจว่ามีปลั๊กอินสำหรับภาษาอื่นใน 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 ที่จะเผยแพร่สู่สาธารณะ ฉันเกลียดการใช้ห้องสมุดและเห็นฟังก์ชั่นชื่อที่getAPCDGFSocket()ไม่มีคำอธิบายว่า APCDGFSocket คืออะไร (ฉันมีความสุขกับบางสิ่งที่ง่ายเหมือนThis gets the Async Process Coordinator Data Generator File Socket) ดังนั้นในกรณีนี้ฉันจะใช้เครื่องมือบางอย่างในการสร้างความคิดเห็นทั้งหมดแล้วปรับแต่งความคิดเห็นที่ต้องการด้วยตนเอง

นอกจากนี้ getters / setters ยังเป็นตัวอย่างที่ไม่ดีสำหรับ "มีความคิดเห็นหรือไม่" เพราะพวกเขามักจะค่อนข้างชัดเจนและความคิดเห็นไม่จำเป็น ความคิดเห็นมีความสำคัญมากขึ้นกับฟังก์ชั่นที่ใช้อัลกอริทึมซึ่งคำอธิบายว่าทำไมสิ่งต่าง ๆ จึงถูกทำไปในทางที่พวกเขาสามารถทำให้โค้ดเข้าใจได้ง่ายขึ้นและทำให้โปรแกรมเมอร์ในอนาคตทำงานได้ง่ายขึ้น

... และสุดท้ายฉันค่อนข้างมั่นใจว่าคำถามนี้เกี่ยวข้องกับความคิดเห็นทุกรูปแบบไม่ใช่เฉพาะคำถามที่จัดรูปแบบโดยใช้ XML (ซึ่งคุณใช้เพราะคุณทำงานในสภาพแวดล้อม. NET)


2
+1 - GhostDoc เป็นจุดเริ่มต้นสำหรับฉันที่จะเปลี่ยนเวอร์ชั่นแรกซึ่งเป็นสำเร็จรูปไปเป็นรุ่นที่สองซึ่งมีความรู้เกี่ยวกับโดเมนโดยละเอียด
Jesse C. Slicer

4
+1 สำหรับสาเหตุส่วนหนึ่ง ใช้หลักการ DRY - อย่าทำซ้ำตัวเองและถ้ารหัสทำงานได้ค่อนข้างดีในการอธิบายว่าส่วนใดความคิดเห็นของคุณควรเน้นไปที่การอธิบายอย่างอื่น (โดยทั่วไปคือสาเหตุ )
Daniel B

@DanielB หรือบางทีคุณอาจไม่ต้องการความคิดเห็นเลย) ฉันเห็นด้วยกับคำตอบนี้เป็นส่วนใหญ่ยกเว้นคำที่จำเป็นใน "ความคิดเห็นมีความจำเป็นเมื่อพวกเขาพูดบางสิ่งที่รหัสไม่ได้พูด" ฉันคิดว่าถ้ารหัสบอกว่าทุกอย่างที่ต้องการแล้วคุณไม่ต้องการข้อมูลเพิ่มเติมในความคิดเห็นแม้ว่าความคิดเห็นจะให้ข้อมูลที่ไม่ได้อยู่ในรหัส
จิมมี่ฮอฟฟา

1
@DanielB - ความคิดเห็นของ XML ใน. NET นั้นมีไว้สำหรับสถานการณ์ที่โปรแกรมเมอร์ผู้ใช้ปลายทางของไลบรารีหรือบริการไม่มีซอร์สโค้ดสำหรับพวกเขา
jfrankcarr

2
@ Lattyware - ความคิดเห็นของ XML ผสานรวมกับ Intellisense ของ Visual Studio ซึ่งเป็นการประหยัดเวลาครั้งใหญ่เมื่อเทียบกับการค้นหาสิ่งต่าง ๆ ในเอกสารแยกต่างหาก
jfrankcarr

5

ความคิดเห็นที่ดูไร้ประโยชน์ต่อผู้ใช้ที่สามารถอ่านรหัสได้จะค่อนข้างมีประโยชน์สำหรับผู้ใช้ที่ไม่สามารถเข้าถึงแหล่งข้อมูลได้ สิ่งนี้เกิดขึ้นเมื่อมีการใช้คลาสเป็น API ภายนอกโดยบุคคลภายนอกองค์กรของคุณ: HTML ที่สร้างจากเอกสาร XML ของคุณเป็นวิธีเดียวที่จะเรียนรู้เกี่ยวกับคลาสของคุณ

ที่กล่าวว่าความคิดเห็นที่ย้ำชื่อวิธีการที่มีช่องว่างเพิ่มระหว่างคำยังคงไร้ประโยชน์ หากคลาสของคุณจะถูกนำไปใช้นอกองค์กรของคุณคุณจะต้องจัดทำเอกสารเพื่อไม่ให้ช่วงที่ถูกต้องสำหรับค่าของคุณ ตัวอย่างเช่นคุณควรจะพูดว่าการตั้งค่าที่UnitOfMeasureจะnullเป็นสิ่งผิดกฎหมายว่าค่าที่จ่ายให้กับหมาไม่ต้องมีช่องว่างที่จุดเริ่มต้นหรือที่ส่วนท้ายของสตริงและอื่น ๆ คุณควรจัดทำเอกสารช่วงLabelSerialNumberถ้ามันแตกต่างจากของธรรมดาInt32: บางทีมันอาจไม่อนุญาตให้มีตัวเลขติดลบ*หรือไม่อนุญาตให้มีมากกว่าเจ็ดหลัก ผู้ใช้ภายในของคุณอาจรับอนุญาตเนื่องจากพวกเขาดูหมายเลขประจำวันและออก แต่ผู้ใช้ภายนอกอาจแปลกใจจริง ๆ ที่เห็นข้อยกเว้นจากสิ่งที่ดูเหมือนเป็นตัวตั้งผู้บริสุทธิ์


* ... ในกรณีนี้uintอาจเป็นตัวเลือกที่ดีกว่า


1
มันไม่ได้มีไว้สำหรับเมื่อคุณไม่มีแหล่งที่มา หากตัวแก้ไขของคุณสามารถแยกวิเคราะห์พวกเขา (เช่น Visual Studio ทำกับความคิดเห็น Xml) พวกเขาสามารถให้ข้อมูลเป็น mouseover / popups โดยไม่ต้องให้คุณนำทางไปยังไฟล์อื่น ตัวตรวจสอบความถูกต้องของช่วง 1 บรรทัดที่ จำกัด int ให้อยู่ในช่วงที่แคบกว่าจะเห็นได้ชัดเมื่อคุณไปที่ไฟล์ที่มีการใช้งาน setter แต่การมี "FrobableID จะต้องอยู่ระหว่าง 0 ถึง 1,000" จะปรากฏขึ้นเมื่อคุณเริ่มพิมพ์ "myFrobable.Fro ... " และการเติมข้อความอัตโนมัติจะส่งการแจ้งเตือนที่เป็นประโยชน์ให้เรา
Dan Is Fiddling โดย Firelight

1

คุณพูดถูกเกี่ยวกับการหลีกเลี่ยงความคิดเห็นที่ไร้ประโยชน์ พวกเขาทำให้การอ่านรหัสยากขึ้นแทนที่จะทำให้ง่ายขึ้นและใช้พื้นที่มากเกินไป

ในทางปฏิบัติของฉันคนที่เขียนความเห็นด้วย getters / setters มักจะละเว้นความคิดเห็นเมื่อมีความจำเป็นจริงๆ (เช่นการสร้างแบบสอบถาม SQL 20- บรรทัดสำหรับองค์ประกอบที่ไม่มีเอกสารประกอบ)

ฉันเขียนความคิดเห็นเมื่อมีวิธีแก้ปัญหาที่ชัดเจนอื่น ๆ _ ฉันระบุว่าทำไมวิธีนี้จึงถูกนำมาใช้อย่างแน่นอน หรือเมื่อมันยากที่จะเข้าใจความคิดโดยไม่ทราบรายละเอียดทั้งหมด _ ฉันจะเขียนรายละเอียดสั้น ๆ ที่จำเป็นต่อการเข้าใจรหัส

ตัวอย่างที่คุณนำมาเป็นมากกว่าการเขียนความคิดเห็นที่จะบอกว่าคนเขียนความคิดเห็นมากกว่าทำให้คนอื่น (และพวกเขา) ชีวิตง่ายขึ้น

BTW คุณสามารถปรับปรุงความสามารถในการเขียนความคิดเห็นโดยกลับไปที่รหัสเดิมของคุณและพยายามที่จะเข้าใจมัน (คุณอาจจำรหัสของตัวเองไม่ได้ใน 2-3 เดือน _ ซึ่งเหมือนกับการอ่านรหัสของคนอื่น) หากคุณทำสิ่งนี้อย่างเจ็บปวดกว่าทุกอย่างก็โอเค


ฉันไม่รู้จักใครก็ตามที่พยายามเขียนข้อคิดเห็นเกี่ยวกับตัวรับสัญญาณ / ผู้ตั้งค่าอีกต่อไป หากคุณใช้เกือบทุก IDE ที่ทันสมัย ​​(และแม้แต่ตัวแก้ไขข้อความขั้นสูงสามารถรองรับสิ่งนี้ผ่านทางปลั๊กอิน) โดยปกติแล้ว getters และ setters สามารถจัดทำเอกสารได้อย่างง่ายดายด้วยการคลิกเมาส์หรือสองครั้งหรือการกดแป้นพิมพ์ที่ถูกต้อง บางครั้งพวกเขากำลังสร้างขึ้นโดยอัตโนมัติเมื่อคุณสร้างรหัสตามสกีมาฐานข้อมูลหรือ WSDL ...
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner คนที่ฉันพูดถึงคือออกจาก บริษัท และฉันเชื่อว่าความคิดเห็นทั้งหมดที่มีต่อ getters / setters นั้นทำโดยบุคคลนั้นเพื่อแสดงให้เห็นว่าเขา / เธอพยายามออกเอกสารบางอย่าง
superM

ความคิดเห็น bogo ทั้งหมดถูกป้อนหลังจากที่บุคคลนั้นแจ้งให้ทราบหรือไม่? ฉันเคยเห็นคนสร้างความคิดเห็นที่ไร้ประโยชน์ / ไร้ประโยชน์ xml ทั่วสถานที่ซึ่งเป็นวิธีการที่ห้ามไม่ให้ VS สร้างคำเตือน "ความคิดเห็น xml ที่หายไปจาก Foo ที่ปรากฏต่อสาธารณะ"
Dan Is Fiddling โดย Firelight

@ Dan Neely ฉันเดาว่าบุคคลนั้นไม่สนใจจริง ๆ และเพิ่งเพิ่มความคิดเห็นเพื่อพูดว่ามีการเพิ่มความคิดเห็น ปกติแล้วเราจะไม่สนใจความคิดเห็นมากนัก แต่ถ้าใครบางคนกำลังจะออกไปและกำลังทำงานกับองค์ประกอบมันเป็นสิ่งที่ต้องเขียนโค้ดที่อ่านได้ชัดเจน
superM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.