Thứ tự nào để xác định getters và setters trong? [đóng cửa]


12

Có một thực tiễn tốt nhất cho thứ tự để xác định getters và setters trong? Dường như có hai thực hành:

  • cặp getter / setter
  • getters đầu tiên, sau đó setters (hoặc cách khác xung quanh)

Để làm sáng tỏ sự khác biệt ở đây là một ví dụ Java về các cặp getter / setter:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Và đây là một ví dụ Java về các getters đầu tiên, sau đó là setters:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Tôi nghĩ rằng loại thứ tự sau rõ ràng hơn cả về mã và sơ đồ lớp nhưng tôi không biết liệu điều đó có đủ để loại trừ loại đặt hàng khác hay không.

Câu trả lời:


7

Cách đầu tiên. Nếu có thể luôn luôn nhóm lại với nhau hoặc theo sát các chức năng liên quan hoạt động trên cùng các thành viên.

Nếu bạn sắp xếp mã của mình theo cách này, nó sẽ giúp tái cấu trúc rõ ràng và dễ dàng hơn, vì nếu một lớp có thể được tạo ra từ một lớp khác đang làm quá nhiều, thì phần tử có thể xoay quanh một biến thành viên cụ thể.

Nói chung, việc gỡ lỗi, hiểu và thao tác mã dễ dàng hơn khi bạn có thể thấy tất cả trên cùng một trang trong toàn bộ vòng đời của một đối tượng / biến. Tôi muốn nói rằng bố cục mã chủ yếu dựa trên bề ngoài như phạm vi và thứ tự chữ cái sẽ thực sự có nghĩa là bạn bỏ lỡ cơ hội để cấu trúc lại vì bạn không thể nhìn thấy chúng.


Bạn có muốn bao gồm bất kỳ đối số nào nữa cho lý do tại sao các chức năng hoạt động trên cùng các thành viên nên được giữ cùng nhau không?
NN

Đã thêm một số lý do.
Benedict

25

Nếu bạn ở trong một đội, hãy làm những gì họ thường làm. Nếu không, chỉ cần chọn một trong những bạn thích nhiều hơn. Trên quy mô của các lựa chọn thiết kế quan trọng, đây có lẽ là một nơi nào đó gần "tôi nên sử dụng ngón tay cái nào để nhấn vào thanh không gian?"


7
Hoan toan Đông y. Điều này xuất hiện dưới tiêu đề "đừng đổ mồ hôi cho những thứ nhỏ nhặt", đó phải là quy tắc chuẩn mã hóa của mọi người # 0 (Đó quy tắc số 0 trong "Tiêu chuẩn mã hóa C ++" của Herb Sutter và Andre Alexandrescu.)
David Hammen

Tôi chắc rằng mọi người đã tranh luận rất nhiều về việc họ nên sử dụng ngón tay cái nào để nhấn vào thanh không gian)))
superM

@Michael Tôi cũng là một tay phải. Tôi đã cố gắng sử dụng độc quyền bên trái của tôi nhưng điều đó cực kỳ khó khăn và việc đánh máy của tôi chậm lại khi bò.
axblount

@axblount Tôi thuận tay phải, nhưng luôn sử dụng ngón tay cái bên trái. Chỉ cần thử quyền của tôi và có cùng kinh nghiệm bạn mô tả. Tôi cũng gõ "y" bằng tay trái vì một số lý do.
KChaloux

6

Nó cũng có thể phụ thuộc vào ngôn ngữ. Trong Java, không có lợi thế thực sự nào cho thứ tự, nhưng trong C #, chẳng hạn, bạn có khái niệm "thuộc tính", nhóm nhóm getter và setter với nhau, do đó, nó thực thi lệnh đó. Trong một ngôn ngữ như C ++, nơi bạn có thể muốn có khả năng hiển thị khác nhau trên getters so với setters (ví dụ: setter private, getter công khai), bạn có thể làm ngược lại, vì công cụ sửa đổi mức độ hiển thị được đưa ra một lần cho nhiều phương thức, thay vì riêng lẻ cho từng phương thức .


4

Theo tôi biết, không có quy ước duy nhất. Phần Công ước mã Java của Oracle về tổ chức tệp không đề cập rõ ràng đến vị trí của getters và setters, nhưng nó có ghi:

Các phương thức này nên được nhóm theo chức năng thay vì theo phạm vi hoặc khả năng truy cập.

Điều này không cung cấp bất kỳ hướng dẫn nào - tôi có thể lập luận rằng một trong hai vị trí đáp ứng tiêu chí này.

Một cái gì đó để xem xét là các IDE hiện đại cho phép bạn có nhiều khung nhìn trừu tượng hơn về cấu trúc của các tệp của bạn hơn là thành phần mã văn bản. Điều này, cùng với các công cụ tìm kiếm mạnh mẽ, sẽ giúp bạn dễ dàng điều hướng các tệp và tìm các phương thức thích hợp trong các tệp lớn.

Ví dụ, Eclipse cung cấp một khung nhìn Outline cho phép bạn sắp xếp và lọc các phương thức và trường theo các cách khác nhau và điều hướng ngay đến vị trí của chúng trong các tệp. NetBeans có chức năng tương tự và tôi nghi ngờ rằng hầu hết các IDE khác cũng làm như vậy.

Lần duy nhất điều này có thể quan trọng là nếu bạn đang đọc mã bên ngoài IDE của mình. Một ví dụ có thể đang sử dụng một công cụ đánh giá mã bên ngoài hoặc xem deltas từ hệ thống kiểm soát phiên bản của bạn.

Giải pháp tốt nhất sẽ chỉ đơn giản là nhất quán giữa các tệp trong một dự án. Tìm một tiêu chuẩn, tài liệu nó, và dính vào nó.


1

Nhóm getter và setter cho một trường cùng nhau, theo cặp.

Việc nhóm tất cả các getters lại với nhau và tất cả các setters với nhau làm cho khó có thể biết trường nào chỉ có getters hoặc chỉ setters.

Khi tôi đang đọc mã hoặc tìm kiếm chức năng cụ thể, tôi hình dung một lớp là có các trường, với mỗi trường có một getter và setter. Nó không có ý nghĩa đối với tôi khi một lớp có một nhóm getters và một nhóm setters, mỗi nhóm có các trường.


Vì vậy, bạn lập luận rằng các getters cho một trường nên được ghép nối với các getters cho trường đó bởi vì nó giúp dễ dàng tổng quan hơn về cách các trường nhất định trong một lớp được xử lý?
NN

Điều đó, và mô hình khái niệm về một lớp là gì. Các lớp học nên được tổ chức chủ yếu theo chức năng. Khi tạo một lớp, bạn có thể quyết định rằng nó cần một trường có thể nhìn thấy công khai, có thể thay đổi. Đó là "chức năng" khái niệm, không phải là biểu thức cú pháp thông qua các phương thức getter và setter.
M. Dudley

0

Bao giờ Java IDE có thể tạo getters và setters cho bạn. Chỉ cần sử dụng chức năng đó và để lại thứ tự của các phương thức như IDE đã tạo ra nó. Đây là mã được tạo, đừng chạm vào nó một cách không cần thiết.


Tôi biết điều này. Tuy nhiên, ví dụ trong Eclipse, bạn có thể chọn giữa các thứ tự khác nhau .
NN

Đúng. Tùy chọn mặc định "Các trường trong cặp getter / setter" có vẻ hữu ích hơn, bởi vì bạn có thể thêm nhiều trường hơn và tạo thêm nhiều người truy cập sau mà không phải lo lắng phương thức nào sẽ đi đâu, chỉ cần đặt cả hai ở cuối.
user281377
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.