2009-02-18 28 views
11

Đối với các dự án của bạn, bạn có trải nghiệm thuận lợi với Groovy không? Dự án lớn đến mức nào? Có vấn đề với ngôn ngữ? Bạn đã xem xét Jython, JRuby hay Clojure?Ý kiến ​​của bạn về Groovy là gì?

+0

Hãy sẵn sàng cho cuộc chiến tranh lửa! – BobbyShaftoe

+0

đây là stackoverflow, mọi thứ có một chút khác biệt. –

+0

Câu hỏi thú vị ..stackoverflow sẽ có stackoverflow. – yogsma

Trả lời

7

Nhóm của tôi gần đây đã triển khai một dịch vụ AtomPub nhỏ sử dụng Grails (và bằng hàm ý, Groovy). Nhìn chung, đó là một trải nghiệm tuyệt vời. Chúng tôi một thời gian ngắn coi Java thuần túy và JRuby là lựa chọn thay thế, nhưng không phải là Jython hoặc Clojure. Nhóm nghiên cứu đã đi với Groovy vì nó có vẻ quen thuộc hơn JRuby, nhưng cung cấp sự linh hoạt hơn Java.

Dưới đây là một số vấn đề chúng ta gặp phải:

  • Ít công cụ hỗ trợ hơn hầu hết chúng ta được sử dụng để (lớn như thế nào một thỏa thuận này là phụ thuộc vào các nhà phát triển cá nhân bạn đang yêu cầu)
  • khủng khiếp ngăn xếp dấu vết (điều này có thể có nhiều lỗi của Grails hơn Groovy)
  • Với toàn bộ nhóm học ngôn ngữ khi di chuyển, rất khó để có được một phong cách phù hợp, được yêu thích
  • Tài liệu ít hơn lý tưởng cho Grails (một lần nữa, không phải lỗi của Groovy); tài liệu đang thay đổi nhanh chóng, do đó, tình hình có thể đã được cải thiện ngay bây giờ
5

Tôi hiện đang làm việc trên một dự án thăm dò nhỏ sử dụng Grails. Tôi không có kinh nghiệm trước đây khi sử dụng Groovy, chỉ có Java.

Cho đến nay, tôi khá ấn tượng một cách nhanh chóng như thế nào tôi có thể hack lên một cái gì đó có thể sử dụng, và các tính năng Groovy, đặc biệt là biểu Gpath, đóng một vai trò lớn trong đó. Tôi đã gặp một vài lỗi trong Grails, nhưng không có vấn đề cơ bản nào ở phía Groovy.

Điều bất lợi chính của Groovy là (đối với tôi) rằng nó ít thuận tiện hơn để gỡ rối hơn là dấu vết phản xạ xảy ra bên dưới mũ trùm của Groovy, và thông báo lỗi có thể khó hiểu - nhưng có thể lớn một phần là do tôi thiếu kinh nghiệm.

2

tôi đã thực hiện một dự án quy mô nhỏ/trung bình trong Grails (và dĩ nhiên là Groovy) và rất thích nó. Có những trở ngại nhất định trên đường đi. Họ bao gồm:

  • Thiếu công cụ gỡ lỗi tốt (Tôi định cư về việc sử dụng Netbeans vì hỗ trợ chủ yếu có nguồn gốc của nó cho Grails, nhưng nó thiếu một trình gỡ lỗi ... ugh)
  • Bugs trong các tính năng web-dòng chảy. Grails 1.1 có một phiên bản mới hơn của luồng web của Spring, giải quyết rất nhiều vấn đề này.
  • Hỗ trợ plugin jquery yếu. Tôi yêu jQuery, nhưng nó không được hỗ trợ khá tốt như nguyên mẫu (và bất kỳ thư viện javascript nào khác được hỗ trợ ra khỏi hộp). Tuy nhiên, công cụ AJAXy là một niềm vui để viết bằng cách sử dụng mẫu.
    • khó đối phó với sự đếm và nhiều-nhiều mối quan hệ trong GORM. Grails 1.1 sẽ đi một chặng đường dài để giải quyết những vấn đề này.

Nhìn chung, tôi thực sự rất thích kinh nghiệm và học được rất nhiều trong một khoảng thời gian ngắn. Grails 1.1 là một nâng cấp lớn sẽ làm cho doanh nghiệp khung này sẵn sàng. Tôi thực sự đang chờ các công cụ gỡ lỗi tốt. Tôi đoán tôi có thể ngừng được giá rẻ như vậy và chỉ cần mua IntelliJ. Tôi nghe nó là tốt nhất cho Grails.

Đến từ nền Java, con đường dẫn đến Grails có vẻ dễ quản lý hơn là bắt đầu với một ngôn ngữ hoàn toàn mới và bộ công cụ cho Rails.

Andrew

2

Chúng tôi vừa mới thực hiện một dự án quy mô vừa với Groovy/Grails, Groovy đã được lựa chọn bởi phần còn lại của đội Java-phụ thuộc. Như trường hợp phổ biến với Java, mọi thứ mất nhiều thời gian hơn nó có thể có. Mặc dù Groovy cung cấp một sự cứu trợ rất cần thiết từ phong cách tiết tú của Java, nhưng nó vẫn tương tự đủ để người ta liên tục tình cờ gặp cú pháp phản trực giác. Ý tưởng đằng sau HLLs là cung cấp các công cụ lập trình giúp tạo điều kiện cho suy nghĩ của con người, không yêu cầu con người suy nghĩ chính xác như máy tính. Đến từ một nền hơi khác, mặc dù khá quen thuộc với Java, IMHO một lựa chọn ngôn ngữ khác như Ruby, Python hoặc Clojure sẽ cung cấp một cơ sở tốt hơn, nhanh hơn cho dự án. Tôi với Thoreau, trong đề nghị "Đơn giản hóa, đơn giản hóa, đơn giản hóa", thay vì câu thần chú Java mệt mỏi, "khuếch đại, khuếch đại khuếch đại." Hy vọng Java tinh khiết, không phải là JVM, sẽ tham gia vào đống bụi lập trình cùng với COBOL.

10

Tôi thích

  1. đóng cửa
  2. Các slurpers
  3. đó không có nhu cầu việc kê khai thường dư thừa MyType x = new MyType(), có thể được giảm xuống còn chỉ đơn giản def x = MyType(). Tuy nhiên, việc gõ là moot trong Groovy (và tôi không thích điều đó).
  4. Bạn có thể kiểm tra nhanh chóng và dễ dàng với bảng điều khiển (mặc dù, để công bằng, bạn có thể làm điều gì đó tương tự với một lớp Java bằng cách sử dụng phương thức (...) chính).

tôi không thích

  1. Đó là đánh máy yếu. Điều đó ảnh hưởng đến hiệu suất và dẫn đến lỗi. Không có gì ngăn bạn, thậm chí cũng không cảnh báo bạn, trong cách làm như sau:

    def x = new MyComplexClass() 
    
    // oops! accidentally made x equal to 1, that is, an integer 
    x = 1 
    
    // Many lines later ... 
    
    // big fat error. Now x is an Integer, so it doesn't know handle myComplexOperation 
    println "The result is ${x.myComplexOperation(a,b,c)}" 
    

Nó sẽ thất bại tại thời gian chạy.

  1. Thật khó để duy trì mã của người khác. Xem xét rằng bạn có thể tiêm các thuộc tính cho các đối tượng, bạn đột nhiên thấy mình với các biến mà bạn không có đầu mối nơi chúng đến từ, hoặc loại chúng là gì.

  2. Vấn đề loại có thể được "giảm bớt" với đơn vị xét nghiệm hơn, nhưng sau đó, thời gian giúp bạn tiết kiệm bằng cách viết các phương pháp sau đây:

    def add(a, b) { a + b} 
    

    có thể bị mất bằng cách xem xét khác:

    • Bạn cần phải quyết định nếu nó sẽ được chấp nhận rằng 'a' và 'b' là một String, một số nguyên, hoặc một lớp ma trận mà bạn tạo ra, hoặc cái gì khác.
    • Nếu bạn cố gắng

    def thêm (int a, int b) {a + b}

Groovy sẽ chỉ cần bỏ qua các loại của các thông số. Vì vậy, bất cứ ai vẫn có thể vượt qua Strings hoặc bất cứ điều gì để phương pháp "thêm". Trình biên dịch sẽ không phàn nàn.

Vì vậy, bây giờ bạn phải thêm một số loại xác nhận nếu bạn muốn đảm bảo rằng các thông số là các số nguyên:

def (Integer a, Integer b) { 
    assert a instanceof Integer 
    assert b instanceof Integer 
    a + b 
} 

Theo như tôi có thể nói, mục đích của các trình biên dịch ngôn ngữ tĩnh là để tránh các lỗi tại thời gian biên dịch, không phải lúc chạy.

  1. Nếu cuộc gọi phương thức có thể "ném" lỗi, trình biên dịch không cảnh báo bạn rằng bạn phải đặt thử hoặc thêm "ném" vào phương pháp chính của bạn. Nếu bạn không biết rằng một phương thức có thể ném một ngoại lệ, bạn có thể vô tình biên dịch một chương trình Groovy mà không có lỗi biên dịch, cho đến khi nó bùng nổ vào thời gian chạy!

  2. Bàn điều khiển không tuyệt vời, vì nó không cung cấp các đề xuất như IDE như Eclipse. Vì vậy, bạn cần phải mở trình duyệt hoặc mở sách để xem các phương pháp có sẵn cho một lớp học. Ngoài ra còn có một cái bẫy nhỏ: bạn không cần phải sử dụng 'def' để xác định một biến trong giao diện điều khiển, nhưng bạn cần chúng trong một chương trình. Vì vậy, nếu sao chép và dán vào IDE của bạn từ giao diện điều khiển, nhưng don quên def's.

  3. Trong nhận thức của tôi Groovy là tuyệt vời với số lượng giới hạn, nhưng không phải cho các dự án lớn. Điều này là do nhiều lỗi có thể được phát hiện chỉ trong thời gian chạy, do đó cần có nhiều kiểm thử đơn vị và xác nhận hơn, điều này sẽ đánh bại một phần tốc độ bạn có thể viết các chương trình Groovy.

  4. Theo mặc định, các thuộc tính trong Groovy là công khai và các tập hợp được tạo tự động. Bạn có thể ghi đè lên hành vi mặc định, nhưng nó chỉ là một thứ khác mà bạn có thể quên, và cản trở việc đóng gói các lớp của bạn. Ví dụ:

    ​class Test { String a, b } 
    
    class Test2 { 
        def t = new Test() 
        Test2 (String s) { t.a = s } 
        ​}​​​​​​​ 
    } 
    
    def t2=new Test2("I am public") 
    println t2.t.a 
    
+0

Các trường (hoặc khi bạn gọi chúng là "thuộc tính") không được công khai trong Groovy. Chúng được đóng gói hoàn toàn "thuộc tính" theo mặc định. – btiernay

+0

@btiernay - Tôi đã sửa chữa ... đến một điểm. Như bạn có thể thấy trong http://groovy.codehaus.org/Groovy+style+and+language+feature+guidelines+for+Java+developers, tại "Công khai theo mặc định", các lớp và phương thức được công khai theo mặc định. Vì getters và setters là các phương thức được tạo tự động theo mặc định, các thuộc tính được công khai theo mặc định. – luiscolorado

+0

@btiernay - Về thuật ngữ 'thuộc tính', tôi không sử dụng nó đúng cách, vì thuật ngữ này thực sự được sử dụng cho các biến tập lệnh Groovy (http://tinyurl.com/6lo7bk7), không phải các lớp. – luiscolorado

3

Một ngôn ngữ thực sự năng động với một cú pháp đơn giản và thoải mái, đường cong học tập phẳng cho các đội hiện Java, tích hợp Java unparalled và tăng JDK hiện với nhiều phương pháp tuyệt vời, mang lại năng suất rất lớn. Nó có thể dễ dàng được gọi là Java/JDK 2,0

Neal Ford đã làm một so sánh tuyệt vời giữa Groovy và JRuby http://nealford.com/downloads/conferences/Comparing_Groovy_and_JRuby(Neal_Ford).pdf

Về hiệu suất, nó là tuyệt vời cho một ngôn ngữ năng động và Groovy hỗ trợ 2,0 biên soạn tĩnh làm cho nó thực sự bay .

"Với @CompileStatic, hiệu suất của Groovy chậm hơn khoảng 1-2 lần so với Java và không có Groovy, nó chậm hơn khoảng 3-5 lần. (...) Điều này có nghĩa là Groovy đã sẵn sàng cho các ứng dụng có hiệu suất tương đương với Java. "

Kiểm tra hiệu suất: Groovy 2.0 so vớiJava http://java.dzone.com/articles/groovy-20-performance-compared

Nếu bạn không bao giờ nhìn thấy số hiệu suất các ngôn ngữ động, trước khi bạn nhận stucked, vui lòng xem tiêu chuẩn với các ngôn ngữ động khác và các khuôn khổ web trong một trường hợp sử dụng thực tế (Groovy 1.8 - Grails 1.3.7): http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/

Hiệu suất là bao giờ liên quan đến những gì bạn muốn làm. Tôi đã sử dụng Groovy từ năm 2008 với thành công lớn trong các dự án lớn. Nó chỉ làm cho công việc được thực hiện trong thời gian kinh doanh cần.

Hy vọng điều đó sẽ hữu ích!

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