Khi nào nên sử dụng def trong Groovy?


23

Tôi đã phát triển Groovy được một thời gian và tôi tự hỏi tôi có nên sử dụng đúc động thường xuyên defkhông? Một đồng nghiệp của tôi tin rằng chúng ta nên sử dụng nó luôn vì nó giúp Groovy theo một cách nào đó tôi không hiểu.

Hiện tại, khi khai báo các kiểu và đối số trả về phương thức, tôi muốn cố tình nêu rõ các đối tượng nào nên được đưa vào và nhổ ra (để dễ đọc mã và tôi đến từ nền Java có ý nghĩa với tôi):

String doSomething(String something){
    //code
}
// vs
def doSomething(def somthing){
    //code
}
// vs 
def doSomething(somthing){
    // code
}

Vì vậy, tôi đoán câu hỏi của tôi là nó chỉ là một sở thích khi sử dụng defhoặc có một lợi thế thực sự để sử dụng nó mọi lúc? (Tôi đã thêm ví dụ cuối cùng vì tôi cảm thấy nó phù hợp với câu hỏi là một lựa chọn khả thi cho Groovy)


3
Xem ở đây những gì đồng nghiệp của bạn tin vào: stackoverflow.com/questions/184002/ ,.
Remigijus Pankevičius

Tôi đã thấy câu hỏi và câu trả lời thực sự trước khi tôi quyết định đặt câu hỏi này. "Thực hành tốt trong các tập lệnh lớn hơn là luôn sử dụng từ khóa" def "để bạn không gặp phải các vấn đề phạm vi lạ hoặc can thiệp vào các biến bạn không có ý định." -Tale Naleid. Điều này nghe có vẻ tốt với tôi khi quyết định bỏ qua bất kỳ loại nào hoặc sử dụng def trong các tập lệnh, nhưng còn việc khai báo kiểu trả về phương thức và kiểu đối số thì sao? Một thực hành tốt là gì?
PJT

1
OK, tôi thấy quan điểm của bạn bây giờ. Đó là một câu hỏi về gõ mạnh so với lập trình động. Loại thảo luận tôi cố gắng tránh do các cuộc chiến
nảy

Câu trả lời:


20

Khi thực hành lập trình tốt (thậm chí cả kịch bản), luôn luôn xem xét chỉ định một loại xác định (mặc dù không nhất thiết phải cụ thể) cho một biến. defChỉ sử dụng nếu không có loại xác định áp dụng cho biến.

Vì OP biết Java, nên nó không khác gì chỉ định một loại Object(mặc dù dường như có một sự khác biệt nhỏ ). Câu trả lời cho câu hỏi này sau đó sẽ không khác với việc trả lời một câu hỏi như: "tại sao không luôn luôn sử dụng Objectloại trong Java?"

Việc xác định rõ ràng về các loại càng tốt sẽ làm giảm khả năng xảy ra lỗi và thậm chí đóng vai trò là tài liệu tự luận. Trong khi đó, nếu một người cố tình thực hiện một logic động, thì việc sử dụng defcó thể có nhiều ý nghĩa. Thực tế đó là một trong những thế mạnh lớn nhất của Groovy; chương trình có thể được gõ một cách linh hoạt hoặc tĩnh như người ta cần! Đừng để sự lười biếng là lý do để sử dụng def;-)

Ví dụ: phương thức này có ý nghĩa với kiểu đối số xác định và kiểu trả về:

// def val or Object val, opens up the possibility
// of the caller sending a non-numeric value 
Number half(Number val) {  
    val/2
}

trong khi phương thức này có ý nghĩa với kiểu def

// I'd let them pass an argument of any type; 
// type `Object` makes sense too
def getIdProperty(def val) {   
    if(val?.hasProperty('id')) {
        // I don't know the type of this returned 
        // value and I don't really need to care 
        return val.id            
    }
    else {
        throw new IllegalArgumentException("Argument doesn't have an 'id' property")
    }
}

-1

Bất cứ khi nào mã bạn viết sẽ được người khác sử dụng làm API công khai, bạn nên luôn ưu tiên sử dụng kiểu gõ mạnh, nó giúp làm cho hợp đồng mạnh hơn, tránh các lỗi loại đối số có thể xảy ra, cung cấp tài liệu tốt hơn và cũng giúp IDE hoàn thành mã. Bất cứ khi nào mã chỉ dành cho bạn sử dụng, như các phương thức riêng tư hoặc khi IDE có thể dễ dàng suy ra kiểu đó, thì bạn có thể tự do quyết định khi nào nên nhập hay không.

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.