วิธีการเขียนคุณสมบัติ Javadoc


93

ฉันมักจะพบว่าตัวเองกลืนไม่เข้าคายไม่ออกเมื่อเขียน javadoc สำหรับคุณสมบัติ / สมาชิกของคลาส POJO แบบ "ธรรมดา" ที่มี แต่คุณสมบัติและตัวรับและตัวตั้งค่า (แบบ DTO) ....

1) เขียน javadoc สำหรับคุณสมบัติ
หรือ ...
2) เขียน javadoc สำหรับ getter

ถ้าฉันเขียน javadoc สำหรับคุณสมบัติ IDE (Eclipse) ของฉันจะ (ตามธรรมชาติ) ไม่สามารถแสดงสิ่งนี้ได้เมื่อฉันเข้าถึง POJO ในภายหลังผ่านการเติมโค้ด และไม่มีแท็ก javadoc มาตรฐานที่ให้ฉันเชื่อมโยง getter-javadoc กับคุณสมบัติที่แท้จริงของ javadoc

ตัวอย่าง:

public class SomeDomainClass {

  /**
   * The name of bla bla bla
   */
  private String name;

  /**
   * @return INSERT SOME SMART JAVADOC TAG LINKING TO name's javadoc
   */
  public String getName() {  
    return name;  
  }  

ดังนั้นโดยพื้นฐานแล้วมันเป็นเรื่องที่น่าสนใจที่จะได้ยินว่าคนอื่นคิดอย่างไรกับการมี Eclipse IDE ของคุณแสดงคำอธิบายคุณสมบัติ javadoc สำหรับ getters ของคุณโดยไม่ต้องทำซ้ำความคิดเห็น javadoc

ณ ตอนนี้ฉันกำลังพิจารณาทำการฝึกฝนเพื่อจัดทำเอกสารเฉพาะผู้รับไม่ใช่คุณสมบัติ แต่ดูเหมือนไม่ใช่ทางออกที่ดีที่สุด ...


1
การอภิปรายที่น่าสนใจที่นี่: stackoverflow.com/questions/1028967/… . คำตอบที่ยอมรับจะกล่าวถึงสิ่งที่คุณถามเกี่ยวกับ Eclipse / javadoc

ดูเหมือนว่าพวกเขาสรุปกับสิ่งที่ฉันกำลังพิจารณา ... เขียนคุณสมบัติ javadoc เฉพาะใน getters

ฉันพบวิธีในการทำเช่นนี้กับคำอธิบายประกอบที่ทำงานใน eclipse และสามารถรวบรวมได้ที่รันไทม์นั่นจะเป็นตัวเลือกหรือไม่?
Aquarius Power

สมาชิกส่วนตัวต้องการ javadoc?
teon

ชื่อของ bla bla bla: ตัวอย่างที่ดีที่สุด
Rodrigo Espinoza

คำตอบ:


76

คุณสามารถรวมสมาชิกส่วนตัวขณะสร้าง Javadocs (โดยใช้ -private) จากนั้นใช้ @link เพื่อลิงก์ไปยังคุณสมบัติของฟิลด์นั้น

public class SomeDomainClass {
    /**
     * The name of bla bla bla
     */
    private String name;

    /**
     * {@link SomeDomainClass#name}
     */
    public String getName() {
        return name;
    }
}

หรืออีกวิธีหนึ่งหากคุณไม่ต้องการสร้าง Javadoc สำหรับสมาชิกส่วนตัวทั้งหมดคุณสามารถมีแบบแผนในการจัดทำเอกสาร getters ทั้งหมดและใช้ @link บน setters

public class SomeDomainClass {
    private String name;

    /**
     * The name of bla bla bla
     */
    public String getName() {
        return name;
    }

    /**
     * {@link SomeDomainClass#getName}
     */
    public void setName(String name) {
        this.name = name;
    }
}

2
ฉันได้ทดลองใช้ทั้งแท็ก @link และ @see .. แต่ ... อย่างน้อย Eclipse ก็แสดงสิ่งนี้ไม่ถูกต้อง Eclipse แสดงลิงค์เป็น ... (ดรัมโรล) .... ลิงค์ .. ที่จะต้องคลิกเพื่อดูเนื้อหา ฉันต้องการเปิดใช้งานการเติมรหัส (หรือโดยการวางเมาส์เหนือ) รับ javadoc สำหรับคุณสมบัติเมื่อฉันกำลังเรียกดู getter ...

13
@Kenny - อย่าสร้างแบบจำลองการปฏิบัติ JavaDoc ของคุณจากการใช้งาน POV ของ Eclipse ทำจาก POV เพื่อรับเอาต์พุต JavaDoc ที่ถูกต้อง (หรือดีเพียงพอ) IDE มีการเปลี่ยนแปลงและสิ่งที่อาจบกพร่องในวันนี้อาจได้รับการแก้ไขในวันพรุ่งนี้ (หรือคุณอาจเปลี่ยน IDE ทั้งหมดก็ได้)
luis.espinal

1
@luis @linkหมายถึงลิงค์ที่ต้องคลิกเพื่อดู javadoc จริง ไม่ใช่ปัญหาการใช้งาน Eclipse แต่เป็นวิธีแก้ปัญหาที่ไม่ถูกต้องสำหรับการจัดหา Javadocs ที่ใช้งานง่าย
NateS

4

ลอมบอกเป็นห้องสมุดที่สะดวกมากสำหรับงานดังกล่าว

@Getter
@Setter
public class Example {
    /**
     * The account identifier (i.e. phone number, user name or email) to be identified for the account you're
     * requesting the name for
     */
    private String name;
}

นั่นคือทั้งหมดที่คุณต้องการ! @Getterคำอธิบายประกอบสร้างวิธีทะเยอทะยานสำหรับเขตข้อมูลส่วนตัวแต่ละคนและแนบ Javadoc เพื่อมัน

PS : ห้องสมุดมีคุณสมบัติเจ๋ง ๆ มากมายที่คุณอาจต้องการชำระเงิน


3

ฉันทำทั้งสองอย่างโดยได้รับความช่วยเหลือจากการเติมข้อความอัตโนมัติของ Eclipse

ก่อนอื่นฉันบันทึกทรัพย์สิน:

/**
 * The {@link String} instance representing something.
 */
private String someString;

จากนั้นฉันคัดลอกและวางสิ่งนี้ลงใน getter:

/**
 * The {@link String} instance representing something.
 */
public String getSomeString() {
    return someString;
}

ด้วย eclipse คำสั่ง @return จะมีการเติมข้อความอัตโนมัติดังนั้นฉันจึงเพิ่มคำว่า Gets ตัวพิมพ์เล็ก "t" และคัดลอกประโยคด้วยตัวพิมพ์เล็ก "t" จากนั้นฉันใช้ @return (พร้อมการเติมข้อความอัตโนมัติ Eclipse) วางประโยคแล้วพิมพ์ตัวพิมพ์ใหญ่ T ในการส่งคืน จากนั้นจะมีลักษณะดังนี้:

/**
 * Gets the {@link String} instance representing something.
 * @return The {@link String} instance representing something.
 */
public String getSomeString() {
    return someString;
}

สุดท้ายฉันคัดลอกเอกสารนั้นไปยัง setter:

/**
 * Gets the {@link String} instance representing something.
 * @return The {@link String} instance representing something.
 */
public void setSomeString(String someString) {
    this.someString = someString;
}

จากนั้นฉันแก้ไขและด้วยการเติมข้อความอัตโนมัติ Eclipse คุณจะได้รับไม่เพียง แต่แท็ก @param เท่านั้น แต่ยังรวมถึงชื่อของพารามิเตอร์ด้วย:

/**
 * Sets the {@link String} instance representing something.
 * @param someString The {@link String} instance representing something.
 */
public void setSomeString(String someString) {
    this.someString = someString;
}

เสร็จแล้ว ในความคิดของฉันแม่แบบนี้ทำให้ง่ายขึ้นมากในระยะยาวไม่เพียง แต่เตือนตัวเองว่าทรัพย์สินมีความหมายอย่างไรผ่านการทำซ้ำ แต่ยังช่วยให้เพิ่มความคิดเห็นเพิ่มเติมให้กับ getter และ setter ได้ง่ายขึ้นหากคุณต้องการเพิ่มด้านข้าง เอฟเฟกต์ (เช่นไม่อนุญาตให้ใช้คุณสมบัติ null เปลี่ยนสตริงเป็นตัวพิมพ์ใหญ่ ฯลฯ ) ฉันตรวจสอบการสร้างปลั๊กอิน Eclipse เพื่อจุดประสงค์นี้ แต่ฉันไม่พบจุดขยายที่เหมาะสมสำหรับ JDT ดังนั้นฉันจึงยอมแพ้

โปรดทราบว่าประโยคอาจไม่ได้ขึ้นต้นด้วย T เสมอไปมันเป็นเพียงตัวอักษรตัวแรกเท่านั้นที่จะต้องไม่มีทุน / เพิ่มทุนในการวาง


24
การคัดลอก / วางเป็นสิ่งชั่วร้าย ... และใช้เวลานาน ขั้นตอนเหล่านี้ดูเหมือนจะใช้งานได้มากและหาก javadoc เปลี่ยนแปลงคุณจะมีสถานที่ 3 แห่งให้อัปเดต ฉันไม่คิดว่าปลั๊กอินจะปรับสิ่งนี้ได้เช่นกัน ... อย่างน้อยที่สุดปลั๊กอินก็จะต้องพิจารณาคุณสมบัติ javadoc เป็นหลักแล้วเขียนทับ getters (และ setters) สิ่งที่ฉันต้องการทำให้สำเร็จคือการเขียน javadoc ในที่เดียวจากนั้นมีทั้ง getters และ property javadocs ถือว่าคำอธิบายเดียวกัน ...

โดยทั่วไปคุณสมบัติจะไม่เปลี่ยนแปลงบ่อยนัก และการดำเนินการคัดลอกและวางด้วยการเติมข้อความอัตโนมัติของ Eclipse จะใช้เวลาน้อยกว่า 30 วินาทีเมื่อสร้างคุณสมบัติ Javadoc
MetroidFan2002

4
ฉันไม่มั่นใจ ... การแนะนำรูปแบบการคัดลอก / วางประเภทนี้ IMHO ผูกพันที่จะนำไปสู่ความไม่สอดคล้องกัน ฉันมีความเชื่อในพ่อครัวคนอื่น (หรือตัวเอง) น้อยเกินไปที่จะแก้ไขโค้ดในภายหลัง นอกจากนี้อย่างน้อยถ้าคุณไม่มีการออกแบบด้านหน้าที่สมบูรณ์คุณสมบัติของ javadoc มักจะมีการเปลี่ยนแปลงอย่างน้อยในช่วงทดลอง / ออกแบบ และ javadoc จะมีคุณภาพที่ดีขึ้นหากเขียนเมื่อโค้ดใหม่อยู่ในใจ ... ขออภัยหากฉันดูเหมือนคน

1
ขออภัย แต่การแก้ไขคุณสมบัติจะทำให้เกิดความไม่สอดคล้องกัน - ไม่ว่าคุณจะเล่นด้วยวิธีใด Javadoc มีแนวโน้มที่จะล้มลงข้างทางเว้นแต่จะได้รับการดูแลอย่างดีในบางรูปแบบ แม้ว่าจะมีวิธีง่ายๆในการเปิดเผยคุณสมบัติของ javadoc แต่ก็มีโอกาสที่ javadoc คุณสมบัตินั้นจะไม่ได้รับการอัปเดต มันเป็นเรื่องของหลักการเขียนโค้ดของทีม ฯลฯ และการตรวจสอบโค้ดสิ่งต่างๆเช่นนั้น - ขอให้โชคดีนี่เป็นเพียงวิธีที่ฉันทำดังนั้นฉันจะไม่ลืม
MetroidFan2002

@Metroid - เว้นแต่จะได้รับการบำรุงรักษาอย่างจริงจังในบางรูปแบบ - ก็ควรได้รับการดูแลอย่างจริงจังหากถือว่าเป็นส่วนหนึ่งของซอร์สโค้ดเอง และไม่ปฏิบัติต่อความคิดเห็น Javadoc (และเทียบเท่าในภาษาอื่น ๆ ) เป็นส่วนที่แท้จริงของโค้ดแม้ว่าจะเป็นการปฏิบัติตามมาตรฐานอย่างน่าเศร้า แต่ก็เป็นรากเหง้าของความชั่วร้ายมากมาย ความคิดเห็นที่แย่ที่สุดคือความคิดเห็นที่ล้าสมัย อย่างดีที่สุดพวกเขาชะลอโปรแกรมเมอร์ไม่ให้จับโค้ดได้ (เนื่องจากต้องตรวจสอบความถูกต้องและยอมรับ / ปฏิเสธความคิดเห็นที่ล้าสมัยอยู่ตลอดเวลา) ที่แย่กว่านั้นคือให้ข้อมูลแนะนำข้อผิดพลาดที่มีแนวโน้มที่จะเกิดข้อผิดพลาด
luis.espinal

0

ฉันคิดว่ามันเป็นปัญหาจริงๆและคู่มือ Javadocอย่างเป็นทางการไม่ได้บอกอะไรเกี่ยวกับเรื่องนี้ C # สามารถแก้ปัญหานี้ได้อย่างสวยงามด้วยการใช้ Properties (ฉันไม่ได้เขียนโค้ดใน C # แต่ฉันคิดว่ามันเป็นคุณสมบัติที่ดีจริงๆ)

แต่ฉันเดาได้: ถ้าคุณต้องการอธิบายว่า someString คืออะไรบางทีมันอาจจะเป็น `` ขนาดเล็กที่ไม่ดี '' เกี่ยวกับรหัสของคุณ อาจหมายความว่าคุณควรเขียน SomeClass เพื่อพิมพ์ someString ดังนั้นคุณจะอธิบายได้ว่า someString คืออะไรในเอกสาร SomeClass และไม่จำเป็นต้องใช้ javadocs ใน getter / setter


1
เกี่ยวกับการไม่ใช้สตริงในโค้ดอย่างถูกต้องให้เลือก `` หลีกเลี่ยงสตริงที่ประเภทอื่นเหมาะสมกว่า '' ในหนังสือ Effective Java
Leonardo Leite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.