Làm thế nào để tránh những lỗi ngôn ngữ động điển hình của người Viking


42

Gần đây tôi đã đổ một vài giờ vào JavaScript vì tôi muốn hưởng lợi từ lượng người dùng khổng lồ. Làm điều đó tôi đã nhận thấy một mô hình mà hầu hết mọi người gán cho các ngôn ngữ động. Bạn có thể làm mọi thứ hoạt động thực sự nhanh chóng, nhưng một khi mã của bạn đạt đến một kích thước nhất định, bạn sẽ lãng phí nhiều thời gian với các lỗi về chính tả, chính tả và tái cấu trúc nói chung. Lỗi một trình biên dịch thường sẽ phụ tùng tôi từ. Và không có tôi tìm lỗi trong logic khi tôi chỉ mắc lỗi đánh máy trong một mô-đun khác.

Xem xét việc sử dụng JavaScript đáng kinh ngạc và các ngôn ngữ được gõ động khác, tôi có thể tin rằng có điều gì đó không đúng với cách tiếp cận của tôi. Hay đây chỉ là cái giá bạn phải trả?

Nói một cách chính xác hơn:

  • Làm thế nào để bạn tiếp cận một dự án JavaScript (hoặc bất kỳ ngôn ngữ động nào khác cho vấn đề đó) với ~ 2000 LỘC?
  • Có công cụ nào để ngăn tôi mắc những sai lầm đó không? Tôi đã thử chuyển qua Facebook và JSHint, phần nào giúp được, nhưng không mắc lỗi chính tả.

2
Mặc dù có nhiều cách để giảm thiểu chi phí, nhưng vẫn chi phí .
dcastro

29
Tôi sẽ thử viết chương trình của bạn bằng ngôn ngữ được nhập tĩnh để biên dịch thành javascript, như Typecript, Scala.js hoặc Elm.
dcastro

6
thử nghiệm, thử nghiệm, thử nghiệm nhiều hơn, và báo cáo bảo hiểm.
njzk2

7
~ 2000 LỘC là một dự án nhỏ. Nó nên dễ dàng phù hợp với những gì một ngôn ngữ năng động làm dễ dàng và tốt. Nếu bạn đang vật lộn với loại dự án kích thước đó, bạn có vấn đề cơ bản hơn với các kỹ năng lập trình của mình hơn bất kỳ thứ gì có liên quan đến các ngôn ngữ động cụ thể.
Jack Aidley

5
@JackAidley Không đồng ý. OP được sử dụng để tập trung vào các vấn đề cấp cao và không biết liệu định danh có được viết đúng chính tả hay không. Đó là kỹ năng lập trình. Đảm bảo chính tả có thể được thực hiện bởi một học sinh lớp giữa và / hoặc hỗ trợ công cụ.
mucaho

Câu trả lời:


37

Nói riêng về JavaScript, bạn có thể sử dụng TypeScript thay thế. Nó cung cấp một số trong những điều bạn đang đề cập đến. Trích dẫn trang web:

Các loại cho phép các nhà phát triển JavaScript sử dụng các công cụ và thực tiễn phát triển năng suất cao như kiểm tra tĩnh và tái cấu trúc mã khi phát triển các ứng dụng JavaScript.

Và nó chỉ là một superset của JS, có nghĩa là một số mã hiện tại của bạn sẽ hoạt động tốt với TS:

TypeScript bắt đầu từ cùng một cú pháp và ngữ nghĩa mà hàng triệu nhà phát triển JavaScript biết đến ngày nay. Sử dụng mã JavaScript hiện có, kết hợp các thư viện JavaScript phổ biến và gọi mã TypeScript từ JavaScript.


11
... và TypeScript về cơ bản là Ecmascript 6.
Robert Harvey

11
Uh, trích dẫn đó đau. Nó chỉ cho thấy rằng Microsoft luôn là một công ty ngôn ngữ tĩnh mà đơn giản là không hiểu ngôn ngữ động. "Các loại cho phép tái cấu trúc mã"? Có thật không? Bộ phận PR của Microsoft có nhận ra rằng tái cấu trúc mã như một thông lệ đã được phát minh ra trong Smalltalk (một ngôn ngữ động) và tồn tại ngay cả trước đó trong Forth (một ngôn ngữ không chữ)? Rằng công cụ tái cấu trúc tự động đầu tiên là một phần của IDE Smalltalk, trước khi các ngôn ngữ tĩnh thậm chí IDE? Các IDE Smalltalk hiện đại đó có các công cụ tái cấu trúc ít nhất là mạnh mẽ nếu không hơn Java, C # và C ++? Thôi nào.
Jörg W Mittag

5
TypeScript là một ngôn ngữ tuyệt vời của riêng nó, tại sao bạn phải thử và đẩy nó với những điều vô nghĩa như vậy?
Jörg W Mittag

29
@ Jörg Tôi không biết đủ về Smalltalk, nhưng mỗi IDE duy nhất cho JavaScript hoặc Python Tôi đã thấy là dặm đằng sau những gì một IDE tốt cho Java hoặc C # có thể làm. Ngoài ra, có một số điều hoàn toàn không thể thực hiện được bằng ngôn ngữ động (một số phép tái cấu trúc phổ biến nhất thực sự): Giả sử bạn có chức năng công khai foo(x) { return x.bar;}hoặc bất cứ điều gì tương tự. Vì không có thông tin loại và chức năng là công khai (do đó bạn không thể biết tất cả người gọi) nên bạn không thể biết liệu thanh có nên được đổi tên thành baz hay không nếu bạn đổi tên một số lớp.
Voo

10
Câu trả lời này nói rằng giải pháp cho "lỗi ngôn ngữ động" không phải là sử dụng ngôn ngữ động.
bgusach

19

Có một số cách tiếp cận có thể giúp:

Kiểm tra đơn vị

Viết bài kiểm tra đơn vị nếu có thể. Chỉ dựa vào kiểm tra thủ công hoặc tìm lỗi trong tự nhiên là trúng và bỏ lỡ.

Sử dụng khung

Thay vì tự lăn lộn và mạo hiểm giới thiệu các lỗi, hãy sử dụng các khung đã thiết lập nếu có thể.

Thích CSS / ngôn ngữ cấp cao

Nơi bạn có thể nhường chức năng cho CSS hoặc bất kỳ ngôn ngữ cấp cao nào bạn đang viết.

Cấu trúc lại

Tái cấu trúc để giảm số lượng mã. Ít mã hơn = ít chỗ hơn cho những thứ đi sai.

Tái sử dụng

Sử dụng lại mã hiện có nơi bạn có thể. Ngay cả khi mã không phải là một kết hợp chính xác, tốt hơn là sao chép, dán và sửa đổi thay vì viết một cái gì đó một lần nữa.

IDE

Các IDE hiện đại thường có ít nhất một số hỗ trợ Javascript. Một số trình soạn thảo văn bản cũng nhận biết Javascript.


5
Mặc dù đúng, lời khuyên của bạn về cơ bản áp dụng cho mọi ngôn ngữ lập trình và chủ yếu nhằm khắc phục các lỗi logic hơn là những lỗi phát sinh từ các ngôn ngữ động.
edmz

1
"Lời khuyên của bạn về cơ bản áp dụng cho mọi ngôn ngữ lập trình" . Rất đúng - theo cách tương tự để chuyển các bánh răng từ các dự án sở thích sang các giải pháp doanh nghiệp đầy đủ chất béo, đòi hỏi số lượng hạn chế ngày càng tăng, tương tự - Javascript càng được viết, càng cần nhiều kỷ luật hơn nếu các bánh xe không hoạt động để nhanh chóng đi ra. Eric Lippert mô tả điều này rất tốt.
Robbie Dee

4
"Thích CSS / ngôn ngữ cấp cao" - Tôi thực sự không hiểu ý nghĩa của bit này liên quan đến JavaScript: bạn đang nói để chuyển các phần tử (như hoạt hình, có lẽ?) Vào các bảng định kiểu thay vì mã JS? CSS liên quan đến các ngôn ngữ cấp cao như thế nào?
một

@anotherdave Rất nhiều thứ từng là miền vững chắc của Javascript hiện có thể đạt được trong CSS3. Một số chức năng cũng có thể có thể được chuyển sang ngôn ngữ cấp cao hơn, chịu sự kiểm soát nghiêm ngặt hơn.
Robbie Dee

4
@anotherdave Phần lớn những gì mọi người cố gắng thực hiện với JavaScript là không liên quan và không phù hợp. Các thư viện cung cấp các công cụ ngôn ngữ tiêu chuẩn, các khung cung cấp các phần tử HTML tiêu chuẩn với ít hơn, mã sao chép chức năng cơ bản như neo, mô phỏng MVC, tạo kiểu, tái hiện DOM, trừu tượng hóa AJAX, hiển thị các đối tượng tầm thường (thực hiện lại SVG), các tính năng polyfilling mang lại lợi ích cho người dùng, bạn nên giảm thiểu số lượng JS mà bạn viết. Nếu bạn có thể làm điều đó mà không cần JS, hãy làm điều đó mà không cần JS.
bjb568

2

Một công cụ chưa được đề cập là tìm kiếm văn bản đơn giản, cục bộ hoặc toàn dự án .

Nghe có vẻ đơn giản, nhưng khi bạn bao gồm một số biểu thức thông thường, bạn có thể thực hiện một số bộ lọc cơ bản đến nâng cao, ví dụ: tìm kiếm các từ nằm trong tài liệu hoặc mã nguồn.

Nó đã là một công cụ hiệu quả đối với tôi (bên cạnh các máy phân tích tĩnh) và với quy mô dự án của bạn là 2k LỘC, theo ý kiến ​​của tôi, không phải là đặc biệt lớn, hy vọng sẽ làm việc kỳ diệu.


2
grepđi một chặng đường dài. Trừ khi bạn không làm những điều năng động quá kỳ lạ, nó sẽ làm điều đó. Tuy nhiên, nó cảm thấy rất thủ công nếu bạn đã quen với IDE cho các ngôn ngữ gõ tĩnh.
bgusach

1

Tôi hiện đang tái cấu trúc vài nghìn dòng mã cho một dự án AngularJS lớn. Một trong những rắc rối lớn nhất là tìm ra hợp đồng chính xác của một chức năng nhất định. Đôi khi tôi đã kết thúc việc đọc tài liệu API vì các yếu tố của phản hồi API thô được gán cho các biến đã trải qua 6 lớp mã trước khi được sửa đổi và trả lại qua 6 lớp mã nữa.

Lời khuyên đầu tiên của tôi là thiết kế theo hợp đồng . Lấy đầu vào cụ thể, tạo đầu ra cụ thể, tránh các tác dụng phụ và ghi lại những mong muốn đó bằng TypeScript hoặc ít nhất là JSDoc.

Lời khuyên thứ hai của tôi là thực hiện càng nhiều kiểm tra càng tốt. Chúng tôi tuân theo tiêu chuẩn AirBnB và sử dụng eslint trên toàn bộ cơ sở mã của chúng tôi. Cam kết móc xác minh rằng chúng tôi luôn tuân theo tiêu chuẩn. Chúng tôi tự nhiên có một bộ pin của các bài kiểm tra đơn vị và chấp nhận, và tất cả các cam kết phải được xem xét bởi một người ngang hàng.

Chuyển đổi từ trình soạn thảo văn bản (Sublime Text) sang IDE phù hợp (WebStorm) cũng giúp làm việc với mã nói chung dễ dàng hơn nhiều. WebStorm sẽ sử dụng JSDoc để đưa ra gợi ý về các loại tham số dự kiến ​​và đưa ra lỗi nếu bạn cung cấp sai loại hoặc sử dụng giá trị trả về sai cách.

Trong JavaScript, các tính năng mới như ký hiệu và getter / setters có thể giúp thực thi một mức chất lượng nhất định bằng cách thêm các xác nhận vào gán biến (ví dụ: đảm bảo số nguyên nằm trong phạm vi hoặc đối tượng dữ liệu có các thuộc tính nhất định).

Thật không may, tôi không nghĩ rằng có một giải pháp thực sự để ngăn ngừa các lỗi ngôn ngữ động, chỉ có một loạt các biện pháp có thể giúp giảm tần suất của chúng.


0

Câu trả lời của tôi cho câu hỏi Làm thế nào để bạn tiếp cận một dự án JavaScript (hoặc bất kỳ ngôn ngữ động nào khác cho vấn đề đó) với ~ 2000 LỘC?

Tôi phát triển các ứng dụng mẫu PDF. Tôi tiếp cận dự án phát triển phần mềm JavaScript của mình (bất kể kích thước mã nguồn) bằng cách sử dụng các yếu tố và chú thích ròng của Petri. Phương pháp này không gắn liền với bất kỳ công nghệ ngôn ngữ lập trình cụ thể nào. Do đó, nó có thể được sử dụng cho các ngôn ngữ lập trình khác.

Tôi tạo một sơ đồ của logic ứng dụng. Để giữ cho sơ đồ không bị lộn xộn, tôi thêm hầu hết các chú thích của mình vào một biểu mẫu mà tôi sử dụng với sơ đồ. Các mục trong biểu mẫu bao gồm các tham chiếu đến các thuộc tính hoặc hàm. Sau đó, tôi viết mã nguồn dựa trên thông tin trong sơ đồ và các mục trong mẫu. Phương pháp này có hệ thống vì mọi mã nguồn được viết được ánh xạ trực tiếp từ sơ đồ và các mục trong biểu mẫu. Mã nguồn có thể dễ dàng kiểm tra vì tôi cũng tuân theo các quy ước đặt tên và mã hóa khi tôi viết mã.

Ví dụ, tôi đã chọn một quy ước rằng tất cả các chức năng là nguyên mẫu. Nếu hiệu suất trở thành một vấn đề thì nó có thể được cải thiện bằng cách khai báo các hàm trong hàm tạo. Đối với một số thuộc tính tôi sử dụng mảng. Một lần nữa nếu hiệu suất trở thành một vấn đề thì nó có thể được cải thiện bằng cách sử dụng các tham chiếu trực tiếp.

Tôi cũng sử dụng eval. Điều này có thể làm giảm đáng kể kích thước của mã nguồn. Do vấn đề về hiệu năng, tôi sử dụng eval ở phần đầu hoặc phần khởi tạo của ứng dụng; Tôi không bao giờ sử dụng nó trong logic thời gian chạy của người dùng - Đây là một quy ước mã hóa khác mà tôi tuân theo.

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.