Làm thế nào để viết Javadoc của thuộc tính?


93

Tôi thường thấy mình gặp tình huống khó xử khi viết javadoc cho các thuộc tính / thành viên của một lớp POJO "đơn giản" chỉ chứa các thuộc tính và getters và setters (kiểu DTO) ....

1) Viết javadoc cho thuộc tính
hoặc ...
2) Viết javadoc cho getter

Nếu tôi viết javadoc cho thuộc tính, IDE (Eclipse) của tôi (đương nhiên) sẽ không thể hiển thị điều này khi tôi truy cập POJO sau đó thông qua hoàn thành mã. Và không có thẻ javadoc chuẩn nào cho phép tôi liên kết getter-javadoc với thuộc tính thực tế javadoc.

Một ví dụ:

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;  
  }  

Vì vậy, về cơ bản sẽ rất thú vị khi nghe những người khác làm thế nào để IDE Eclipse của bạn hiển thị mô tả thuộc tính javadoc cho getters của bạn - mà không cần phải sao chép nhận xét javadoc.

Hiện tại, tôi đang xem xét việc thực hành của mình để chỉ ghi lại các getters chứ không phải các thuộc tính. Nhưng nó có vẻ không phải là giải pháp tốt nhất ...


1
Thảo luận thú vị về điều này tại đây: stackoverflow.com/questions/1028967/… . Câu trả lời được chấp nhận giải quyết những gì bạn đã hỏi về Eclipse / javadoc.
b.roth

Có vẻ như họ đã kết luận với những gì tôi đang xem xét ... chỉ viết javadoc thuộc tính trong getters.

Tôi đã tìm ra cách để thực hiện việc này với các chú thích hoạt động trong nhật thực và thậm chí có thể được thu thập trong thời gian chạy, đó có phải là một lựa chọn không?
Aquarius Power

thành viên tư nhân cần javadoc?
cherit

Tên của bla bla bla: ví dụ điển hình
Rodrigo Espinoza.

Câu trả lời:


75

Bạn có thể bao gồm các thành viên riêng tư trong khi tạo Javadocs (sử dụng -private) và sau đó sử dụng @link để liên kết đến thuộc tính trường đó.

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

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

Ngoài ra, nếu bạn không muốn tạo Javadoc cho tất cả các thành viên riêng tư, bạn có thể có một quy ước để ghi lại tất cả các getters và sử dụng @link trên các 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
Tôi đã thử nghiệm với cả thẻ @link và @see .. Nhưng ... ít nhất thì Eclipse không hiển thị điều này đúng. Eclipse hiển thị liên kết dưới dạng ... (trống cuộn) .... liên kết .. mà người ta sẽ phải nhấp vào để xem nội dung. Tôi muốn để có thể kích hoạt hoàn thành mã (hoặc bằng cách rê chuột qua) nhận được javadoc cho một tài sản khi tôi thực sự đang duyệt một getter ...

13
@Kenny - không mô hình hóa các thực hành JavaDoc của bạn từ khả năng sử dụng POV của Eclipse. Làm điều đó từ POV để nhận được đầu ra JavaDoc chính xác (hoặc đủ tốt). IDE thay đổi, và những gì có thể thiếu hiện nay có thể được giải quyết vào ngày mai (hoặc bạn thực sự có thể thay đổi IDE hoàn toàn.)
luis.espinal

1
@luis @linkcó nghĩa là một liên kết phải được nhấp vào để xem javadoc thực tế. Đó không phải là vấn đề về khả năng sử dụng của Eclipse, đó là giải pháp sai khi cung cấp javadocs dễ sử dụng.
NateS

4

Lombok là một thư viện rất thuận tiện cho những công việc như vậy.

@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;
}

Đó là tất cả những gì cậu cần! Các@Getter chú thích tạo ra một phương thức getter cho mỗi lĩnh vực tư nhân và đính kèm các javadoc với nó.

Tái bút : Thư viện có nhiều tính năng thú vị mà bạn có thể muốn kiểm tra


3

Tôi làm cả hai, được hỗ trợ bởi tính năng tự động hoàn thành của Eclipse.

Đầu tiên, tôi ghi lại tài sản:

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

Sau đó, tôi sao chép và dán nó vào getter:

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

Với eclipse, các câu lệnh @return có tính năng tự động hoàn thành - vì vậy, tôi thêm từ Gets, viết thường chữ "t" và sao chép câu với chữ "t" viết thường. Sau đó, tôi sử dụng @return (với tính năng tự động hoàn thành của Eclipse), dán câu và sau đó viết hoa chữ T trong câu trả lời. Sau đó nó trông như thế này:

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

Cuối cùng, tôi sao chép tài liệu đó sang người thiết lập:

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

Sau đó, tôi sửa đổi nó và với tính năng tự động hoàn thành Eclipse, bạn không chỉ có thể nhận được thẻ @param mà còn có tên của tham số:

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

Sau đó, tôi đã hoàn thành. Theo ý kiến ​​của tôi, việc tạo khuôn mẫu này giúp bạn dễ dàng hơn rất nhiều, về lâu dài, không chỉ nhắc nhở bản thân về ý nghĩa của thuộc tính thông qua việc lặp lại mà còn giúp bạn dễ dàng thêm các nhận xét bổ sung vào getter và setter nếu bạn muốn thêm bên. hiệu ứng (chẳng hạn như không cho phép thuộc tính null, chuyển chuỗi thành chữ hoa, v.v.). Tôi đã điều tra tạo một plugin Eclipse cho mục đích này nhưng tôi không thể tìm thấy điểm mở rộng thích hợp cho JDT, vì vậy tôi đã từ bỏ.

Lưu ý rằng câu có thể không phải lúc nào cũng bắt đầu bằng chữ T - nó chỉ là chữ cái đầu tiên phải được viết hoa / viết hoa lại khi dán.


23
Sao chép / dán là xấu ... và tốn thời gian. Các bước này trông có vẻ rất nhiều công việc và nếu javadoc thay đổi, bạn sẽ có 3 nơi khác nhau để cập nhật. Tôi không nghĩ rằng một plugin sẽ biện minh cho điều này ... ít nhất, sau đó plugin sẽ phải coi thuộc tính javadoc là master và sau đó ghi đè getters (và setters). Những gì tôi muốn đạt được là viết javadoc trong 1 nơi duy nhất, và sau đó có cả getter và javadocs tài sản giả mô tả tương tự ...

Thông thường, các thuộc tính không thường xuyên thay đổi. Và các hoạt động sao chép và dán, với tính năng tự động hoàn thành của Eclipse, chỉ mất chưa đầy 30 giây sau khi thuộc tính Javadoc được xây dựng.
MetroidFan2002

4
Tôi không bị thuyết phục ... Việc giới thiệu loại lược đồ sao chép / dán này là IMHO có thể dẫn đến sự mâu thuẫn. Tôi có quá ít niềm tin vào việc các đầu bếp khác (hoặc chính tôi) chỉnh sửa mã sau này. Ngoài ra, ít nhất nếu bạn không có một thiết kế hoàn chỉnh, các thuộc tính javadoc thường có thể thay đổi, ít nhất là trong giai đoạn thử nghiệm / thiết kế. Và javadoc sẽ có chất lượng tốt hơn nếu được viết khi đang tươi trong tâm trí ... Xin lỗi nếu tôi có vẻ giống như một whiner ;-)

1
Xin lỗi, nhưng việc chỉnh sửa các thuộc tính nhất định sẽ dẫn đến sự mâu thuẫn - dù bạn chơi theo cách nào thì Javadoc cũng có xu hướng giảm trừ khi nó được duy trì mạnh mẽ theo một số cách. Ngay cả khi có một cách dễ dàng để hiển thị thuộc tính javadoc, thì cũng có khả năng là bản thân thuộc tính javadoc sẽ không được cập nhật. Đó thực sự là vấn đề của các quy ước mã hóa của nhóm, v.v. và đánh giá mã, những thứ như vậy - chúc bạn may mắn, đây chỉ là cách tôi làm nên tôi không quên.
MetroidFan2002

@Metroid - trừ khi nó được duy trì mạnh mẽ theo một số cách - tốt, nó phải được duy trì mạnh mẽ nếu nó được coi là một phần của chính mã nguồn. Và việc không coi các bình luận Javadoc (và các bình luận tương đương ở các ngôn ngữ khác) như một phần nội tại của mã, mặc dù đáng buồn là thông lệ tiêu chuẩn, nó là gốc rễ của nhiều tệ nạn. Bình luận tồi tệ nhất là bình luận đã trở nên lỗi thời. Tốt nhất, chúng làm chậm các lập trình viên nắm bắt mã (vì họ phải liên tục xác thực lại và chấp nhận / từ chối bình luận lỗi thời.) Tệ hơn, chúng đưa ra thông tin giới thiệu lỗi, dễ xảy ra lỗi.
luis.espinal

0

Tôi thực sự nghĩ rằng đó là một vấn đề và hướng dẫn Javadoc chính thức không cho biết bất cứ điều gì về nó. C # có thể giải quyết điều này một cách thanh lịch với cách sử dụng Thuộc tính (Tôi không viết mã bằng C #, nhưng tôi thực sự nghĩ rằng đó là một tính năng hay).

Nhưng tôi có một phỏng đoán: nếu bạn cần giải thích someString là gì, có thể đó là một `` điều tồi tệ '' về mã của bạn. Nó có thể có nghĩa là bạn nên viết SomeClass để nhập someString, vì vậy bạn sẽ giải thích someString là gì trong tài liệu SomeClass và chỉ vì vậy javadocs trong getter / setter sẽ không cần thiết.


1
Về việc không sử dụng thích hợp các chuỗi trong mã, hãy kiểm tra `` Tránh các chuỗi khi các loại khác thích hợp hơn '' trong sách Java Hiệu quả.
Leonardo Leite
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.