2014-08-28 20 views
5

Một số cách phổ biến để đặt tên biến loại tùy chọn và phương thức trả về loại tùy chọn để phân biệt chúng với đối tác không tùy chọn của chúng là gì?Quy ước đặt tên chung cho biến loại tùy chọn và phương thức trả về

Giả sử DAO hiện có phương thức findById trả về phiên bản của thực thể hoặc giá trị rỗng, nếu chúng tôi không dùng phương thức đó và thêm phương thức trả về loại tùy chọn, chúng tôi nên đặt tên như thế nào?

Giả sử chúng ta đang tái cấu trúc mã để sử dụng phương pháp mới này, chúng tôi không muốn thay thế tất cả các tham chiếu đến biến thực thể bằng loại tùy chọn, chúng ta nên đặt tên biến loại tùy chọn như thế nào?

interface Dao<ENTITY ,ID> { 
    @Deprecated 
    ENTITY findById(ID id); 

    //What naming convention should we use? 
    Optional<ENTITY> maybeFindById(ID id); 
} 

public class MyService { 
    PersonDao personDao; 

    public void changeAge(final Long id,final int age) { 

    //final Person person = personDao.findById(id); 
    //if(person !=null) 

    //What naming convention should we use? 
    final Optional<Person> maybePerson = personDao.maybeFindById(id); 

    if (maybePerson.isPresent()){ 
     final Person person = maybePerson.get(); 
     person.setAge(age); 
    } 
} 

Trả lời

1

Tôi nghĩ đây thực sự là một câu hỏi dựa trên ý kiến, trong đó thực sự không thể có bất kỳ câu trả lời có thẩm quyền hoặc chính xác nào.

Điều đó nói rằng, sở thích của tôi chỉ là đặt tên cho các phương thức trả lại Optional bình thường, ví dụ: Optional<Foo> findById(Id id). Phương thức này thực sự không khác với phương thức có thể trả về null để có nghĩa là "không có kết quả" ngoại trừ kiểu trả về làm cho nó rõ ràng hơn nhiều.

Đối với biến số Optional, tôi có xu hướng chỉ đặt tên cho chúng là optionalFoo ... nhưng nói chung tôi nghĩ cách bạn đặt tên biến địa phương (hoặc trường thậm chí) quan trọng hơn rất nhiều so với cách bạn đặt tên phương thức.

6

Nếu không nghĩ rằng bạn nên có hai phương pháp khác nhau ở đây. Nếu nghi ngờ về việc di chuyển, hãy giữ nguyên cũ.

Nhưng có một cách để cấu trúc lại toàn bộ mã theo hai bước:

Thứ nhất, thay đổi giao diện từ

interface Dao<ENTITY ,ID> { 
    ENTITY findById(ID id); 
} 

để

interface Dao<ENTITY ,ID> { 
    default ENTITY findById(ID id) { return newFindById(id).orElse(null); } 
    Optional<ENTITY> newFindById(ID id); 
} 

Tôi giả sử từ câu hỏi của bạn mà thích ứng việc triển khai giao diện không phải là vấn đề. Bây giờ, hãy cho công cụ tái cấu trúc của bạn để nội tuyến phương thức cũ, bây giờ là default, findById.

Thứ hai, đổi tên phương thức newFindById thành findById.

Bằng cách này bạn đã di cư các interface để

interface Dao<ENTITY ,ID> { 
    Optional<ENTITY> findById(ID id); 
} 

trong khi tất cả các trang web gọi đã được thay đổi từ:

Person maybePerson = personDao.findById(id); // may be null 

để

Person maybePerson = personDao.findById(id).orElse(null); 

Bằng cách này bạn có sạch interface ở vị trí đầu tiên trong khi mã khác được điều chỉnh để hoạt động như trước. Sau đó, bạn có thể đi qua các trang web cuộc gọi từng người một và quyết định xem họ có nên thay đổi hay không. Quá trình này có thể mất chút thời gian nhưng vì interface đã được làm sạch và giải quyết vấn đề đặt tên được giải quyết, không cần phải vội vàng.

Lưu ý rằng phương pháp dụ của bạn nên sau đó thay vì trông giống như:

public void changeAge(final Long id,final int age) { 
    personDao.findById(id).ifPresent(person -> person.setAge(age)); 
} 

Lưu ý rằng trong cả hai hình thức, các mã cũ refactored và mã mới, không cần đến tên một biến kiểu Optional vì vậy không cần quy ước đặt tên.

Việc tái cấu trúc yêu cầu công cụ có khả năng Java 8, tất nhiên.

+0

"cho công cụ tái cấu trúc của bạn nội tuyến phương thức cũ, bây giờ mặc định, findById" không phải bạn thường theo các cách khác? "Đặt cơ thể của phương thức vào cơ thể người gọi của nó và loại bỏ phương pháp." –

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