2009-10-08 29 views
7

Tôi biết rằng trong Java, thực tế phổ biến là sử dụng "get" làm tiền tố cho phương thức truy cập. Tôi đã tự hỏi lý do là gì cho việc này. Có hoàn toàn là để có thể dự đoán những gì nó đang quay trở lại?Giá trị/lý do để sử dụng "lấy" làm tiền tố trong tên của phương thức truy cập

Để làm rõ: Trong một số lớp học java (ví dụ: String), có thể truy cập một biến như độ dài bằng cách gọi "length()" thay vì "size()". Tại sao những phương pháp này được viết như thế này, nhưng những phương pháp khác như "getSomeVariable()"?

Cảm ơn bạn đã dành thời gian.

Chỉnh sửa: Rất vui được gặp tôi không đơn độc về sự nhầm lẫn & ví dụ về các biến kích thước và chiều dài

Trả lời

8

'get' tiền tố (hoặc 'là' cho các phương pháp boolean trở về) là một phần của JavaBean đặc điểm kỹ thuật mà được sử dụng trong suốt java nhưng chủ yếu là trong các giao diện trong giao diện người dùng web.

độ dài() và kích thước() là các đồ tạo tác lịch sử từ thời tiền javabean; nhiều nhà phát triển giao diện người dùng đã than phiền rằng Bộ sưu tập có phương thức size() thay vì getSize()

+0

Vì vậy, bạn nên luôn sử dụng get làm tiền tố _unless_ bằng cách sử dụng biến số như vậy()? Nhưng tại sao? – bgw

+0

Không, bạn nên sử dụng tiền tố 'get' hoặc (tùy chọn)' tiền tố 'cho booleans NẾU bạn muốn lớp của bạn tuân theo đặc tả JavaBean. 'Collection.size()' tồn tại trước khi khái niệm JavaBean được giới thiệu và nó vẫn tồn tại vì các lý do tương thích ngược - đó không phải là ví dụ để làm theo. – ChssPly76

+0

Vì vậy, bạn không nên sử dụng accessor? – bgw

7

Vì thuộc tính là danh từ và phương pháp là động từ. Nó là một phần của mô hình đậu được thiết lập tốt và do đó được mong đợi bởi bất kỳ ai sử dụng lớp học của bạn.

Nó có thể làm cho tinh thần để nói:

String txt="I have " + car.GetFuelLevel() + " liters of petrol."; 

hoặc ...

String txt="I have " + car.FuelLevel + " liters of petrol."; 

nhưng không ...

String txt="I have " + car.FuelLevel() + " liters of petrol."; 

Ý tôi là, nó không có ý nghĩa để nói "Này, xe. Đi FuelLevel cho tôi." Nhưng để nói "Này, xe. Đi GetFuelLevel cho tôi." Điều đó tự nhiên hơn.

Bây giờ, tại sao họ chia thứ hạng với String.length() và những thứ khác? Điều đó luôn làm tôi bận tâm.

+0

vỏ trong ví dụ của bạn có thể sử dụng một lần. – akf

+1

Có lẽ anh ấy đã lập trình C# gần đây ... – Nate

4

Quy ước get/set xuất phát từ java Bean specification. Vì vậy, mọi người mạnh mẽ có xu hướng sử dụng điều đó.

Và thuộc tính .size(), .length() và thậm chí .length của các mảng là tất cả các ví dụ về lỗi Java để tuân theo các quy ước của riêng nó. Còn rất nhiều điều nữa, thật là vui khi khám phá chúng!

2

Chúng có thể bị lỗi đối với đặc điểm kỹ thuật, tuy nhiên chúng cải thiện khả năng đọc. kích thước và thời gian cho phép bạn đọc các dòng mã sau đây:

for (int i=0; i<thing.size(); ++i){ 

As ...

Trong khi i nhỏ hơn kích thước của điều ...

Không có thực quy ước đằng sau điều này, nhưng nó làm cho nó dễ dàng hơn để dịch thành một câu trực tiếp.

4

Các get tiền tố đặc biệt hữu ích nếu bạn cũng có set, add, remove vv, phương pháp này. Tất nhiên, tốt hơn hết là nên có giao diện đầy đủ của get s hoặc đầy đủ của set s. Nếu hầu như mọi phương thức đều có get thì nó sẽ trở thành tiếng ồn. Vì vậy, tôi sẽ bỏ các get cho bất biến và set cho các nhà xây dựng. Đối với các loại "cơ bản", chẳng hạn như các bộ sưu tập và chuỗi, những từ này cũng rất ồn ào, IMO.

1

Lý do lịch sử là đặc tả JavaBean cho biết rằng các trình truy cập vào các thuộc tính lớp nên được thực hiện với getPropertyName/setPropertyName. Lợi ích là sau đó bạn có thể sử dụng API Introspection để tự động liệt kê các thuộc tính của một đối tượng, ngay cả một trong những mà trước đó bạn chưa được biên dịch vào chương trình của bạn. Một ví dụ về nơi điều này sẽ hữu ích là xây dựng kiến ​​trúc trình cắm thêm cần phải tải các đối tượng và cung cấp cho người dùng quyền truy cập vào các thuộc tính của đối tượng.

Bạn có các tên khác nhau để lấy kích thước trong các lớp khác nhau đơn giản chỉ vì chúng được viết bởi những người khác nhau và có lẽ không phải lúc đó một hướng dẫn thiết kế để đặt tên cho các phương thức lớp một cách nhất quán. Một khi hàng triệu dòng mã đã được viết bằng cách sử dụng những cái tên không phù hợp này, thì đã quá muộn để thay đổi.

Các vấn đề liên quan