Làm cách nào để đánh dấu các đoạn mã hợp lý trong các bình luận Java?


92

Các lớp Java thường được chia thành các "khối" logic. Có một quy ước để đánh dấu các phần này? Lý tưởng nhất là nó sẽ được hỗ trợ bởi các IDE chính.

Cá nhân tôi sử dụng phương pháp này:

//// Section name here ////

Tuy nhiên, một số biên tập viên dường như gặp vấn đề với điều này.

Ví dụ, trong mã Objective-C, bạn có thể sử dụng phương pháp này:

#pragma mark -
#pragma mark Section name here

Điều này sẽ dẫn đến một menu trong XCode trông giống như sau:

văn bản thay thế


4
là nhà phát triển iOS, đây là điều tôi nhớ nhất khi bắt đầu với Android Studio
Chris Chen

1
phản đối: Với các IDE và ngôn ngữ hiện đại, đó là một thực tiễn kém. Nếu bạn phải phân loại mã của mình, có thể bạn đã vi phạm Nguyên tắc trách nhiệm duy nhất và tốt hơn là nên chia thành các lớp / tệp khác nhau. Nếu có nhiều trình chỉnh sửa, nó có thể sẽ không đồng bộ sau một thời gian, vì một số sẽ làm theo điều này, một số sẽ cấu trúc lại và tổ chức lại mã hoặc các hành động lưu và định dạng tự động sẽ phá vỡ mã.
f.carlsen

không tán thành: Tôi đồng ý với @ f.carlsen. Nếu bạn cấu trúc lớp học của mình bằng các nhận xét, bạn rất có thể phá vỡ Nguyên tắc Trách nhiệm Đơn lẻ .
schrieveslaach

Đối với những người ghét: hãy gọi cho tôi khi Java hỗ trợ tiện ích mở rộng lớp kiểu Swift, nơi bạn có thể tách các triển khai giao diện của mình thành các phần khác nhau một cách hợp lý. Và vâng, một lớp có thể thực hiện tốt nhiều giao diện cùng một lúc.
William Entriken

Câu trả lời:


66

Cá nhân tôi sử dụng dấu phân cách dòng 80 ký tự, như sau:

public class Client {

    //================================================================================
    // Properties
    //================================================================================

    private String name;
    private boolean checked;

    //================================================================================
    // Constructors
    //================================================================================

    public Client() {
    }

    public Client(String name, boolean checked) {
        this.name = name;
        this.checked = checked;
    }

    //================================================================================
    // Accessors
    //================================================================================

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

}

Tất nhiên, điều này có vẻ hơi quá mức cần thiết đối với một POJO nhỏ như vậy, nhưng tin tôi đi, nó tỏ ra rất hữu ích trong một số dự án lớn nơi tôi phải duyệt qua các tệp nguồn lớn và nhanh chóng tìm thấy các phương pháp tôi quan tâm. Nó cũng giúp hiểu cấu trúc mã nguồn.

Trong Eclipse, tôi đã tạo một tập hợp các mẫu tùy chỉnh (Java -> Trình chỉnh sửa -> Mẫu trong hộp thoại Tùy chọn của Eclipse) để tạo các thanh đó, ví dụ: - sepa (SEParator cho Accessors) - sepp (SEParator cho Properties) - sepc (SEParator cho Constructors) - v.v.

Tôi cũng đã sửa đổi mẫu "lớp mới" tiêu chuẩn (Java -> Kiểu mã -> Mẫu mã trong màn hình Tùy chọn Eclipse)

Ngoài ra, có một plugin Eclipse cũ được gọi là Coffee-bytes , giúp nâng cao cách Eclipse gấp các phần mã. Tôi không biết liệu nó có còn hoạt động hay không, nhưng tôi nhớ rằng người ta có thể xác định các vùng có thể gập lại tùy ý bằng cách thêm các nhận xét đặc biệt, như // [SECTION] hoặc một cái gì đó. Nó có thể vẫn hoạt động trong các bản sửa đổi Eclipse gần đây, vì vậy hãy xem.


144

Đối với studio intellij / android có một giải pháp tuyệt vời.
Bắt đầu bằng:
//region Description
và kết thúc bằng:
//endregion

Phím tắt cho điều đó nằm trong menu bạn có thể mở bằng Command+ Alt+ T(Mac) hoặc Ctrl+ Alt+ T(Windows)

Bạn cũng có thể thêm dòng của riêng mình để phân tách trực quan bổ sung nếu bạn cần. Vùng có thể được thu nhỏ và mở rộng theo ý muốn bằng các nút +/- giống như bất kỳ chức năng nào. Bạn cũng có thể điều hướng giữa các vùng bằng Command+ Alt+ Period( Ctrl+ Alt+ Period)

Nguồn .

Thí dụ:

//region Parceler Implementation
//---------------------------------------------------------------------------------------
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(this.die, 0);
    dest.writeParcelable(this.dieSprite, 0);
}

private DieVm(Parcel in) {
    this.die = in.readParcelable(Die.class.getClassLoader());
    this.dieSprite = in.readParcelable(Sprite.class.getClassLoader());
}

public static final Parcelable.Creator<DieVm> CREATOR = new Parcelable.Creator<DieVm>() {
    public DieVm createFromParcel(Parcel source) {
        return new DieVm(source);
    }

    public DieVm[] newArray(int size) {
        return new DieVm[size];
    }
};
//---------------------------------------------------------------------------------------
//endregion

Điều này vô cùng hữu ích. Cảm ơn Andrey. BTW Tôi đang sử dụng bố cục phím tắt của nhật thực và tôi không nghĩ rằng các phím tắt này phù hợp với tôi nhưng '// region' hoạt động tốt
ThinkBonobo

2
Tôi không thấy bất kỳ cách nào để điều này hiển thị trong chế độ xem cấu trúc, vì vậy tôi vẫn đang sử dụng các thành viên trống giả (cùng với việc ngăn chặn cảnh báo không sử dụng).
Tom

1
có cách nào để hiển thị các khu vực đó trong Android Studio (Chế độ xem cấu trúc) không?
MiguelHincapieC

Liên kết đã chết; này IntelliJ IDEA viết blog có thể là một tài liệu tham khảo hữu ích. Nó cũng đề cập đến các vật phẩm gấp kiểu NetBeans <editor-fold ...> .
Franklin Yu

câu trả lời hay nhất
Michał Ziobro

14

Eclipse xác định chú thích @category javadoc (cuộn đến phần được đánh dấu "Hỗ trợ danh mục") cho phép lọc theo danh mục trong dạng xem phác thảo. Không chính xác như những gì bạn muốn sao. Tôi ngạc nhiên là không ai viết plugin Eclipse cung cấp chế độ xem như ảnh chụp màn hình của bạn.


Tuy nhiên, trong hầu hết các dạng xem java, có thể lọc các thành viên lớp theo danh mục của chúng, để ẩn dưới dạng getters và setters mặc định, làm ví dụ.
Riduidel

không biết tại sao tôi không thể sử dụng @category trong Android Studio, bạn có biết tôi có thể làm gì để đạt được hành vi tương tự trên đó không?
MiguelHincapieC

6

Tôi cũng thích điều đó khi tôi đang sử dụng xcode. Đối với nhật thực, tôi sử dụng ctrl + o (phác thảo nhanh) để điều hướng qua một lớp Java.


6

Sử dụng các nhận xét / điểm đánh dấu không cần thiết trong mã để giúp hoạt động có thể không phải là một thực tiễn tốt. Tôi có chút ý tưởng về việc phát triển xcode và java nhưng tất cả sự hỗ trợ của IDE chính trong việc tìm kiếm các thành viên không có bất kỳ điểm đánh dấu đặc biệt nào như eclipse cho thấy các phương pháp và thành viên sử dụng chế độ xem phác thảo có thể được kích hoạt bằng ctrl+OIntellij (mà tôi thích sử dụng hơn trên mac và có phiên bản cộng đồng cũng vậy) có cùng khái niệm phác thảo và có thể nhanh chóng truy cập bằng cách sử dụng (ctrl + f12). Vì vậy, quan điểm của tôi ở đây là không sử dụng bất kỳ đánh dấu không cần thiết nào trong mã vì tất cả (hoặc ít nhất là tốt / lành mạnh) IDE có thể tự động làm điều đó.


2
Đồng ý, các điểm đánh dấu phần chỉ thêm vào sự lộn xộn trực quan. Lớp học của bạn phải được tập trung chặt chẽ để làm cho những điều này không thể giải quyết được.
Paul McKenzie

15
Chắc chắn, nhưng có các phương pháp được nhóm thành các phần hợp lý và được đánh dấu có thể giúp áp đặt thứ tự trực quan cho những gì nếu không sẽ là một danh sách phẳng các phương pháp. Đôi khi bạn không biết chính xác phương pháp nào mình muốn, và thật tuyệt khi sử dụng tất cả các phương pháp liên quan cùng một lúc, và có một số ý tưởng rằng bạn đang thấy toàn bộ mã liên quan.
Brian Rak

4

Theo như tôi biết thì không có cái gọi là đặc điểm kỹ thuật được hỗ trợ để nhóm các thành viên trong lớp lại với nhau. Bạn có thể sử dụng quy ước bình luận từng có mà bạn thích, nhưng rất có thể nó sẽ không được bất kỳ công cụ nào hỗ trợ.

Tốt hơn là nhóm các thành viên có liên quan thành lớp riêng biệt thông qua kế thừa hoặc tổng hợp. Đây được coi là một phong cách OOP tốt


5
Việc chia nhỏ các phần mã dường như chỉ có thể thực hiện được trên lý thuyết. Ví dụ: lấy một Khách hàng lớp với các thuộc tính như tên và tập hợp "hóa đơn". Tôi rất muốn có thể chia phần này thành phần "tên" có chứa getters / setters cho tên và phần "hóa đơn" chứa các phương thức thêm / xóa cho hóa đơn. Có vẻ không thực tế khi chia chúng thành một hệ thống phân cấp lớp chỉ có thể thêm một thuộc tính cho mỗi lớp, tức là "NamedEntity", "NameAndAddressEntity", "Invoicable", ...
Frederik

3

Ngoài câu trả lời của Andrey đã cung cấp, để sử dụng // khu vực // endregion, chúng tôi chèn [các chữ cái BigAscii] [1] vào các phần mã chính. Khi cuộn nhanh, nó thực sự nổi bật. Một nhược điểm của phương pháp này là tôi không thể tìm kiếm nó, vì vậy bạn cần thêm một cụm từ tìm kiếm ngay bên dưới "biểu ngữ" như tôi làm dưới đây.

Blockquote

//    _      _____          _____                  _   _
//   | |    |  __ \   /\   |  __ \      /\        | | | |
//   | |    | |  | | /  \  | |__) |    /  \  _   _| |_| |__
//   | |    | |  | |/ /\ \ |  ___/    / /\ \| | | | __| '_ \
//   | |____| |__| / ____ \| |       / ____ \ |_| | |_| | | |
//   |______|_____/_/    \_\_|      /_/    \_\__,_|\__|_| |_|
//
//   Search here with: LDAP Auth

[1]: http://patorjk.com/software/taag/#p=display&c=c%2B%2B&f=Big&t=LDAP Auth


3

Tôi sẽ sử dụng javadoc ; hoặc sử dụng phần sau làm "dấu phân cách" đơn giản (một hoặc 3 dòng):

/** RecyclerOnItemClickListener */

/** 
 * RecyclerOnItemClickListener
 */

Vì vậy, trong IDE, nó xuất hiện với một màu khác với màu xám được nhận xét không phô trương.


2

Một IDE hiện đại cho phép bạn xem mã của mình theo nhiều cách khác nhau và thậm chí tổ chức lại nó. Eclipse thậm chí còn cho phép bạn xem định nghĩa của mã mà bạn có con trỏ trên bảng điều khiển khác.

Bất kỳ sự sắp xếp lại mã tự động nào của bạn, sẽ khiến đánh dấu đó bị phá vỡ.

Nếu bạn muốn nhóm lại thì hãy cân nhắc đặt những thứ thuộc cùng một lớp và những thứ không thuộc cùng nhau vào các lớp khác nhau.


0

Nếu bạn có thể phân cụm các phương thức của mình, hãy tạo một lớp khác cụ thể cho khái niệm mà bạn muốn nắm bắt trong một phần. Hãy tiếp tục, tạo tệp là miễn phí.


-19

Đối với IntelliJ, tôi thích:

        public void ________________INIT__________________() {};

trông khá đẹp trong cấu trúc tệp!


3
Đây có vẻ như là một giải pháp rất tệ. Tại sao phải khai báo các phương pháp bổ sung khi mục tiêu của bạn là tổ chức mã?
nsg

1
Đó là làm cho toàn bộ tệp được phân đoạn trong dạng xem Cấu trúc.
Tycho Pandelaar

1
đây chỉ là một trong đó tìm kiếm thực sự trong studio android, đề nghị u sở hữu là câu trả lời và tôi sẽ sử dụng
user170317

13
Điều tồi tệ nhất tôi từng thấy !! và nó CÔNG KHAI! o_O
Cocorico

3
Đây là câu trả lời duy nhất hiển thị trong dạng xem cấu trúc và hoạt động trên các IDE khác nhau. Đặt nó ở chế độ riêng tư và cười toe toét và chịu đựng nó, hoặc không sử dụng nó nếu bạn không thích nó, nhưng đừng giấu câu trả lời này với những người đọc khác bằng cách bỏ phiếu cho nó vào quên lãng.
Tom
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.