Những ưu và nhược điểm của Coffeescript là gì? [đóng cửa]


48

Tất nhiên một pro lớn là lượng đường cú pháp dẫn đến mã ngắn hơn trong rất nhiều trường hợp. Trên http://jashkenas.github.com/coffee-script/ có những ví dụ ấn tượng. Mặt khác, tôi nghi ngờ rằng những ví dụ này đại diện cho mã của các ứng dụng trong thế giới thực phức tạp. Trong mã của tôi chẳng hạn, tôi không bao giờ thêm các hàm cho các đối tượng trần mà thay vào đó là các nguyên mẫu của chúng. Ngoài ra, tính năng nguyên mẫu bị ẩn khỏi người dùng, gợi ý OOP cổ điển thay vì Javascript thành ngữ.

Ví dụ hiểu mảng sẽ nhìn vào mã của tôi có thể như thế này:

cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...

7
Đó không phải là sự hiểu biết mảng. Đó là JQuery.map ().
Rein Henrichs

1
Chắc chắn, do đó tôi không đề cập đến "bản thân mảng" mà là "ví dụ hiểu mảng [trên trang web]".
Philip

Đủ công bằng. Quan điểm của tôi là jut rằng Foldl (bản đồ) trong một số trường hợp là một trường hợp suy thoái về khả năng hiểu danh sách (thường mạnh hơn).
Rein Henrichs

Về cơ bản, tôi đang hỏi câu hỏi này bởi vì tôi tự hỏi liệu đó có phải là một quyết định ngu ngốc khi sử dụng Javascript hơn là Coffeescript hay không. Tôi đồng ý, mặt khác, khả năng hiểu mảng mạnh hơn rất nhiều, không ai có thể tranh luận rằng Python mạnh hơn Ruby vì khả năng hiểu mảng và đánh dấu các khối bằng cách thụt lề thay vì bắt đầu / kết thúc.
Philip

Rails làm cho kịch bản cà phê một đá quý mặc định. Nó đã kích động "thảo luận" github.com/rails/rails/commit/ từ
generalhenry

Câu trả lời:


53

Tôi là tác giả của một cuốn sách sắp xuất bản về CoffeeScript:
http://pragprog.com/title/tbcoffee/coffeescript

Tôi đã bị thuyết phục rằng CoffeeScript đáng để sử dụng sau khoảng một tuần chơi với nó, mặc dù ngôn ngữ chỉ mới vài tháng tuổi và có nhiều cạnh thô hơn so với bây giờ. Trang web chính thức thực hiện rất tốt việc liệt kê (hầu hết) các tính năng của ngôn ngữ, vì vậy tôi sẽ không lặp lại những tính năng này ở đây. Thay vào đó, tôi sẽ chỉ nói rằng ưu điểm của ngôn ngữ là:

  1. Khuyến khích sử dụng các mẫu JavaScript tốt
  2. Không khuyến khích các mẫu chống JavaScript
  3. Làm cho mã JavaScript tốt thậm chí ngắn hơn và dễ đọc hơn

Số 3 nhận được nhiều sự chú ý hơn hai phần đầu (ngay cả trong cuốn sách của tôi), nhưng càng nghĩ về nó, tôi càng nhận ra rằng tôi đã không thực hiện cú nhảy chỉ vì cú pháp đẹp; Tôi đã thực hiện bước nhảy vì ngôn ngữ thúc đẩy tôi hướng tới JavaScript tốt hơn, ít lỗi hơn. Để đưa ra một vài ví dụ nhanh:

  • Vì các biến được tự động phạm vi, bạn không thể vô tình ghi đè lên toàn cầu bằng cách bỏ qua var, bỏ qua một biến có cùng tên (ngoại trừ các đối số được đặt tên) hoặc có các biến trong các tệp khác nhau tương tác (xem https://stackoverflow.com/questions / 5211638 / mẫu-cho-coffeescript-mô-đun / 5212449 ).
  • Bởi vì ->rất dễ viết hơn nhiều function(){}, nên sử dụng các cuộc gọi lại dễ dàng hơn. Sự thụt lề ngữ nghĩa làm cho nó rõ ràng khi gọi lại được lồng nhau. Và =>làm cho nó dễ dàng hơn để bảo quản thiskhi thích hợp.
  • Bởi vì unless xngười nói tiếng Anh dễ phân tích cú pháp hơn if (!x)if x?dễ dàng hơn if (x != null), chỉ đưa ra hai ví dụ, bạn có thể dành ít chu kỳ não hơn cho cú pháp logic và nhiều hơn cho chính logic.

Một thư viện tuyệt vời như Underscore.js có thể giải quyết một số vấn đề này, nhưng không phải tất cả.

Bây giờ cho các khuyết điểm:

  1. Biên soạn có thể là một nỗi đau. Các lỗi cú pháp mà trình biên dịch CoffeeScript ném thường rất mơ hồ. Tôi hy vọng tiến bộ sẽ được thực hiện trên đường đua đó trong tương lai. .
  2. Liên quan, gỡ lỗi có thể là một nỗi đau. Vẫn chưa có cách nào khớp các dòng JS đã biên dịch với CoffeeScript gốc (mặc dù mọi người Firefox đã hứa rằng điều này sẽ đến).
  3. Nó dễ bị thay đổi. Mã của bạn có thể chạy khác nhau hoặc hoàn toàn không chạy, theo phiên bản tương lai của CoffeeScript. Tất nhiên, đây là trường hợp với hầu hết các ngôn ngữ, việc chuyển sang phiên bản mới của Ruby hoặc Python cũng tương tự, nhưng đó không phải là trường hợp của JavaScript, nơi bạn có thể mong đợi một cách hợp lý rằng mã chạy tốt trên các trình duyệt chính ngày nay sẽ chạy tốt trên chính trình duyệt miễn là web như chúng ta biết nó tồn tại.
  4. Nó không phải là nổi tiếng. JavaScript là một ngôn ngữ chung . CoffeeScript đã trở nên rất phổ biến trong một khoảng thời gian ngắn, nhưng không chắc là nó sẽ được hưởng một cộng đồng rộng lớn như JavaScript.

Rõ ràng tôi nghĩ rằng những ưu điểm vượt trội hơn những nhược điểm đối với cá nhân tôi, nhưng đó sẽ không phải là trường hợp của mỗi người, nhóm hoặc dự án. (Ngay cả Jeremy Ashkenas cũng viết rất nhiều JavaScript.) CoffeeScript được xem tốt nhất dưới dạng bổ sung tốt cho JavaScript, chứ không phải thay thế.


2
Whoa whoa whoa, làm thế nào trên thế giới tôi đã bỏ lỡ =>trong tài liệu? Thật tuyệt vời . (Những điểm khác cũng tốt - câu trả lời không thiên vị rất tốt với một danh sách trung thực về khuyết điểm. :)
Michelle Tilley

Cảm ơn bạn đã trả lời của bạn. Mặc dù tôi sẽ đợi một chút để chấp nhận nó, nhưng sẽ rất thú vị khi có những ưu / nhược điểm khi xem xét các phương pháp OOP khác nhau.
Philip

2
Tôi muốn nói rằng mô hình lớp của CoffeeScript dễ tiếp cận hơn với người mới so với mô hình nguyên mẫu của JavaScript và hỗ trợ các thực tiễn tốt (đặc biệt là xác định các nguyên mẫu của bạn ở một nơi thay vì phân tán Foo.prototype.bar = ...khắp các dòng, đó là sự điên rồ!). Đó là một cách tuyệt vời để tổ chức sạch mã. Mặt khác, nó có thể khiến mọi người sử dụng OOP ngay cả khi cách tiếp cận chức năng thanh lịch hơn nhiều.
Trevor Burnham

Một số logic thụt lề không hoạt động như mong đợi, bạn phải nhìn vào JS bên dưới để thấy rằng nó đã làm điều gì đó hoàn toàn kỳ lạ .. Nó có thể là một phần của quy tắc tbh, nhưng nó không phải lúc nào cũng rõ ràng so với các ngôn ngữ khác Py, và tôi đã tìm thấy điều này có thể tạo ra nhiều lỗi tinh vi hơn những lỗi mà nó có nghĩa là để ngăn chặn. Tôi vẫn sử dụng CoffeeScript mặc dù
sa93

1
Điểm 1 và 2 cần chi tiết. Tôi nghĩ câu trả lời của Andrew cung cấp một ví dụ điển hình về số 3 là một túi hỗn hợp. Tôi không đồng ý với các viên đạn: quên var là ngớ ngẩn và bạn không nên có nhiều vars toàn cầu để va chạm ở vị trí đầu tiên, 'hàm' không khó - các phương thức được đặt tên trước thậm chí còn ít hơn, 'if (! X ) 'ngắn gọn và ngọt ngào và' trừ khi 'làm cho nó dài dòng hơn (xem viên đạn trước đó của bạn và điểm số 3) và sự tương đồng về ngôn ngữ của con người thực sự không phải là một mục tiêu thiết kế đã đạt được rất nhiều thành công trong ngôn ngữ lập trình. Chúng ta cần liên lạc với con người và máy móc.
Erik Reppen

30

Chúng tôi có một cơ sở mã JavaScript khá lớn và khoảng một tháng trước, chúng tôi đã muốn dùng thử CoffeeScript. Một trong những nhà phát triển của chúng tôi đã bắt đầu với việc di chuyển một trong các mô-đun của chúng tôi từ JS sang CS bằng cách sử dụng http://js2coffee.org/ . Công cụ này khá tiện dụng và mất khoảng hai hoặc ba giờ để chuyển một dòng JavaScript 1000 thứ. Một số quan sát chúng tôi nhận thấy ở điểm đó:

  1. Mã CoffeeScript kết quả là khá dễ đọc.

  2. Chúng tôi đã biên dịch nó trở lại JavaScript và khá dễ dàng để điều hướng và gỡ lỗi. Trong khi chúng tôi chuyển mô-đun đó, một nhà phát triển khác trong nhóm của chúng tôi đã tìm thấy một lỗi trong đó. Hai nhà phát triển đã sửa lỗi đó trong mã JavaScript cũ của chúng tôi và mã JavaScript mới xuất phát từ trình biên dịch CS. Họ làm việc độc lập và họ mất khoảng thời gian như nhau (15-20 phút).

  3. Do thực tế đó là một cổng, mã kết quả không sử dụng các tính năng dành riêng cho Cà phê phù hợp hoặc mong muốn. Nếu chúng ta viết bằng CoffeeScript từ đầu thì mã sẽ thành ngữ hơn. Vì điều đó sau đó chúng tôi đã quyết định rằng chúng tôi sẽ không chuyển mã hiện có.

  4. Nói chung khả năng đọc của hàm ngắn hơn và đối tượng nhỏ hơn tăng lên một số mở rộng. Tuy nhiên, đối với các phương pháp dài hơn đó không phải là trường hợp. Khoản tiết kiệm lớn nhất đến từ ->và rõ ràng return, nhưng khác với mã của chúng tôi đã rút ngắn hơn hoặc đơn giản hơn đáng kể. Một số phần cú pháp có vẻ khá khó hiểu, đặc biệt là các đối tượng bằng chữ. CS bỏ qua các dấu ngoặc nhọn xung quanh các định nghĩa thành viên và kết hợp với "mọi thứ là một biểu thức" và ẩn returnkhiến cho một số đoạn mã khá khó đọc.

    Đây là JavaScript:

    var rabbitGenerator = {
        makeRabbit: function(rabbitName, growCarrots) {
            if (growCarrots) {
                carrots.growMore(10);
            } else {
                carrots.ensureSupply();
            }
            return {
                name: rabbitName, 
                height: 0,
                actions: {
                    jump: function (height) {
                        this.height += height;
                    },
                    eatCarrot: function () {
                        // etc
                    }
                }
            };
        },
        // more members
    }
    

    Và đây là mã CoffeeScript tương ứng trông như thế nào:

    rabbitGenerator = 
      makeRabbit: (rabbitName, growCarrots) ->
        if growCarrots
          carrots.growMore 10
        else
          carrots.ensureSupply()
        name: rabbitName // (*)
        height: 0
        actions: 
          jump: (height) ->
            @height += height
    
          eatCarrot: ->
    

    Vì hiện tại khá khó để nhận ra rằng câu lệnh return bắt đầu tại (*)dòng. Trong dự án của chúng tôi, chúng tôi chủ yếu dựa vào nghĩa đen của đối tượng: chúng tôi chuyển chúng dưới dạng tham số hàm và trả về chúng từ các hàm khác. Trong nhiều trường hợp, các đối tượng này có xu hướng khá phức tạp: với các thành viên thuộc các loại khác nhau và một số cấp độ lồng nhau. Trong trường hợp của chúng tôi, cảm giác chung là mã CoffeeScript thực sự khó đọc hơn mã JavaScript đơn giản.

  5. Mặc dù việc gỡ lỗi CoffeeScript hóa ra dễ dàng hơn chúng tôi dự kiến, trải nghiệm chỉnh sửa đã xuống cấp khá nhiều. Chúng tôi không thể tìm thấy một trình soạn thảo / IDE tốt cho ngôn ngữ này. Chúng tôi chưa chuẩn hóa trình soạn thảo / IDE cho mã phía máy khách cho dự án của chúng tôi và trên thực tế tất cả chúng tôi đều sử dụng các công cụ khác nhau. Trên thực tế, mọi người trong một nhóm đều đồng ý rằng khi họ chuyển sang CoffeeScript, họ nhận được sự hỗ trợ khá kém từ công cụ của họ. Các plugin IDE và trình soạn thảo có hình dạng rất sớm và trong một số trường hợp, chúng thậm chí không thể cung cấp cho chúng tôi một cú pháp tô sáng hoặc hỗ trợ thụt lề thích hợp. Không nói về đoạn mã hoặc tái cấu trúc. Chúng tôi sử dụng WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ và SublimeText2.

  6. Nói về các công cụ tôi nên đề cập rằng chính trình biên dịch CoffeScript đi kèm như một gói Node JS. Chúng tôi là một cửa hàng Java / .NET chính vì vậy mọi người đang phát triển trên các hộp Windows. Cho đến gần đây, hỗ trợ Windows gần như không tồn tại trong Node. Chúng tôi không thể làm cho trình biên dịch CoffeeScript chạy trên Windows vì vậy trong thời gian này, chúng tôi đã quyết định gắn bó với <script type="text/coffeescript">các thẻ và trình biên dịch dựa trên trình duyệt.

    Trình biên dịch khá nhanh và không làm tăng thời gian khởi động nhiều. Nhược điểm là JavaScript kết quả bị lỗi evalvà hơi khó để đặt các điểm dừng trong nó trong các công cụ dành cho nhà phát triển của trình duyệt (đặc biệt là trong IE8). Nếu chúng tôi gặp khó khăn với việc gỡ lỗi, chúng tôi sẽ biên dịch trước mã CoffeeScript bằng cùng một công cụ di chuyển mà tôi đã liệt kê ở trên nhưng điều đó vẫn không thuận tiện lắm.

  7. Những lời hứa khác của CoffeeScript như varchèn tự động hoặc quản lý bán trong suốt thisvới toán tử mũi tên béo ( =>) hóa ra không mang lại nhiều lợi ích như chúng tôi mong muốn. Chúng tôi đã sử dụng JSLint như một phần của quy trình xây dựng của mình và chúng tôi viết mã trong ES3 x ES5-Stricttập hợp con của ngôn ngữ. Dù sao, việc Cà phê sản xuất cùng loại mã "sạch" là một điều tốt . Tôi cũng mong muốn mọi khung công tác phía máy chủ cũng tạo ra đánh dấu HTML5 và CSS3 hợp lệ!

    Điều đó nói rằng tôi sẽ không nói rằng CoffeeScript tiết kiệm rất nhiều thời gian bằng cách đặt vartừ khóa cho tôi. Các lỗi bị mất vardễ dàng bị bắt bởi JSLint và có thể dễ dàng sửa chữa. Hơn nữa, một khi bạn đã sửa nó một thời gian, bạn sẽ bắt đầu viết JavaScript tốt tự động. Vì vậy, tôi sẽ không nói Cà phê thực sự là ích trong vấn đề này.

Chúng tôi đã đánh giá CoffeeScript trong khoảng một tuần. Tất cả các thành viên trong nhóm đã viết mã trong đó và chúng tôi chia sẻ kinh nghiệm của chúng tôi với nhau. Chúng tôi đã viết một số mã mới với nó và chuyển một số mã hiện có khi chúng tôi thấy phù hợp. Cảm xúc của chúng tôi về ngôn ngữ đã được trộn lẫn.

Nói chung tôi sẽ nói rằng nó không thúc đẩy sự phát triển của chúng tôi nhưng nó cũng không làm chúng tôi chậm lại. Một số mức tăng tốc độ do gõ ít hơn và bề mặt lỗi ít hơn đã được bù đắp bằng sự chậm lại ở các khu vực khác, chủ yếu là hỗ trợ công cụ. Sau một tuần, chúng tôi đã quyết định rằng chúng tôi sẽ không bắt buộc sử dụng CoffeeScript nhưng chúng tôi cũng sẽ không cấm . Đưa ra một sự lựa chọn miễn phí, trong thực tế không ai sử dụng nó, ít nhất là cho đến bây giờ. Thỉnh thoảng tôi nghĩ đến việc tạo mẫu một số tính năng mới trong đó và sau đó chuyển đổi mã thành JavaScript trước khi tích hợp với phần còn lại của dự án để bắt đầu nhanh hơn nhưng tôi chưa thử cách tiếp cận đó.


10

Ưu

xem câu trả lời của Trevor Burnham .

Thêm vào đó, bạn có thể nghĩ về bản thân mình như một anh chàng hông, người đang làm những thứ hợp thời trang, thay vì làm rối tung sự bẩn thỉu của javascript.

Nhược điểm

CoffeeScript không gì khác hơn là cú pháp đường và ly hồng.

Đối với những thứ dễ dàng - CoffeeScript là không cần thiết, bởi vì làm những thứ dễ dàng là dễ dàng trong bất kỳ ngôn ngữ nào. Và jQuery có lẽ còn đơn giản hơn cả CoffeeScript.

Đối với những thứ cứng - bạn phải hiểu phương tiện của bạn. Và phương tiện của bạn là HTML, DOM và CSS, Javascript chỉ là một công cụ để kết nối chúng, tuy nhiên - tất cả các API được viết riêng cho Javascript. Sử dụng ngôn ngữ khác, sau đó sẽ được biên dịch thành ngôn ngữ "thực" - khá rủi ro, có thể là Java (GWT), Dart hoặc CoffeeScript.

Chống mô hình hoặc sự thờ ơ của các quy tắc ngôn ngữ, có thể được khắc phục bằng cách đọc một trong hai cuốn sách hay. Và tôi khá chắc chắn Coffeescript có các mẫu chống riêng.

Hỗ trợ IDE cho Coffeescript thậm chí còn tồi tệ hơn so với JS.



JavaScript không chỉ là một "công cụ để kết nối chúng" trong các ứng dụng web quy mô lớn, rất năng động. Số lượng JS trong các thư viện như React hoặc Angular, thậm chí jQuery, là một trường hợp điển hình.
Andy

6

Chuyên gia lớn nhất, trong tâm trí của tôi là:

Coffescript đơn giản biên dịch thành javascript mà bạn nên viết, nhưng không, vì nó không đơn giản.

Có một số góc khó chịu của javascript chỉ tránh được với sự cảnh giác - ví dụ ngoài đầu tôi:

  • thiết lập nguyên mẫu chính xác
  • sử dụng === thay vì ==
  • kiểm tra null
  • khai báo tất cả các biến với var
  • gói tất cả mọi thứ trong một chức năng ẩn danh tự thực hiện.

Nếu bạn viết coffeescript, tất cả những thứ đó sẽ được xử lý tự động cho bạn .

Nhược điểm là, IMO, chủ yếu là nhỏ:

  • Gỡ lỗi là một nỗi đau
  • Có ít lập trình viên coffeescript
  • Bạn phải dịch tài liệu từ javascript sang coffeescript.

3

ưu

  1. CoffeeScript đã giúp tôi tìm hiểu thêm về JavaScript
  2. là khá dễ đọc, ngay cả đối với các cuộc gọi lại lồng nhau phức tạp
  3. cung cấp sự an toàn xung quanh một số javascript khó theo dõi các vấn đề ngôn ngữ

Ví dụ làm việc ở trên của Andrew tôi thấy là đã giác ngộ. Tôi tin rằng khả năng đọc lợi nhuận theo nghĩa đen của đối tượng hiện tại của họ sẽ được tăng cường bằng cách đơn giản xác định thủ công trả về

trở về

// đối tượng bằng chữ ở đây

Các công cụ IDE đã được cải tiến, TextMate và Cloud9 hỗ trợ CoffeeScript. Phải thừa nhận rằng sự hỗ trợ của windows đã bị chậm trễ (điều đó không đúng với sự phát triển web nói chung chứ?)

khuyết điểm

Trình duyệt diễn giải CoffeeScript có thể là thách thức để gỡ lỗi.

Đây là một lớp bổ sung trên JavaScript yêu cầu một số hiểu biết và xem xét từ các nhà phát triển.


0

ưu

  1. trên thực tế, họ đã tối ưu hóa các trường hợp phổ biến về mặt cú pháp, trên thực tế, CoffeeScript là một trong những ngôn ngữ ngắn gọn nhất "thường được sử dụng" http://redmonk.com/dberkholz/2013/03/25/programming-lacular-roped- biểu cảm /
  2. ẩn các phần xấu của JavaScript (tự động ép buộc ==, ẩn toàn cầu, hệ thống lớp truyền thống hơn làm cho những điều phổ biến trở nên dễ dàng hơn)
  3. cực kỳ dễ học đối với các lập trình viên Python / Ruby
  4. Hàm ẩn danh nhiều dòng + cú pháp khoảng trắng

khuyết điểm

  1. loại bỏ var có nghĩa là bạn không thể thay đổi biến phạm vi bên ngoài trong phạm vi bên trong mà không sử dụng một đối tượng hoặc `var fall_back_to_js;` hack [tại sao không phải là một câu lệnh gán khác ': =' chỉ gán lại một giá trị nên obj.naem: = 5 lỗi chính tả để gỡ lỗi]
  2. bạn phải cho mọi công cụ biết về nó, trừ khi bạn muốn gỡ lỗi JavaScript :(; btw: bạn có thể gỡ lỗi CoffeeScript từ Chrome bằng cách thêm hỗ trợ cho bản đồ nguồn; yeoman (npm install yeoman) có thể giúp bạn viết tệp cấu hình gulp hoặc grunt cho Cà phê
  3. không có kiểu gõ tĩnh tùy chọn (phải chờ tiêu chuẩn EcmaScript tiếp theo)
  4. vẫn cần thư viện của bên thứ ba cho một hệ thống mô-đun
  5. bẫy cú pháp phải cẩn thận: trả về ngầm định, abgo có nghĩa là a (b (g (o))) , fp, b: 2, c: 8 có nghĩa là f (p, {b: 2, c: 8}) chứ không phải f (p, {b: 2}, {c: 8})
  6. không thay đổi hệ thống số / loại JavaScript bị hỏ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.