Tôi đã đọc về cách thức lập trình không thành công nhanh trong các ngôn ngữ như Erlang kết thúc với các chương trình ngắn hơn nhiều so với phong cách phòng thủ được tìm thấy trong hầu hết các ngôn ngữ khác. Điều này có đúng cho tất cả các loại chương trình và lý do cho điều này không?Tại sao các chương trình kiểu nhanh thất bại ngắn hơn các chương trình kiểu phòng thủ?
Trả lời
Chương trình không nhanh không nhất thiết phải ngắn hơn các chương trình kiểu phòng thủ: nó phụ thuộc vào việc triển khai và các biện pháp cần thiết để bảo vệ mã phòng thủ của bạn.
Trong trường hợp Erlang, các chương trình không nhanh thường ngắn hơn do kiểu khai báo và cách VM đảm bảo tạo ra các trường hợp lỗi cho bạn. Như một ví dụ, trong hàm:
day(1) -> sunday;
day(2) -> monday;
day(3) -> tuesday;
day(4) -> wednesday;
day(5) -> thursday;
day(6) -> friday;
day(7) -> saturday;
Bất kỳ giá trị bất ngờ thông qua chức năng sẽ dẫn đến một lỗi có thể bị bắt và xử lý bởi một tiến trình khác (ví dụ .: Phải có người giám sát). Các lỗi như vậy cũng sẽ không bao giờ gây nguy hiểm cho toàn bộ hệ thống và không yêu cầu mã được thêm vào chính hàm đó - tất cả được thực hiện bên ngoài đường dẫn thực hiện thông thường bởi các hành vi được xác định trước.
Trong ngôn ngữ động mà không nhanh không phải là tiêu chuẩn, bạn sẽ phải tự kiểm tra các ranh giới và tự ném một ngoại lệ. Sau đó, bạn phải nắm bắt các ngoại lệ tại địa phương (cấp cao thử ... bắt bao gồm) nếu bạn không muốn toàn bộ hệ thống đi xuống. Mã xử lý lỗi thường phải được chèn vào trong suốt đường dẫn thực thi thông thường.
Trong ngôn ngữ tĩnh có tốc độ không nhanh không phải là tiêu chuẩn, thì mã của bạn sẽ phụ thuộc bao lâu tùy thuộc vào loại hệ thống bạn có. Nếu ngôn ngữ cho phép xác định các loại trong đó các trường hợp cạnh được kiểm tra bởi trình biên dịch, thì bạn thường không phải xử lý mã bên trong, bên ngoài các sự kiện không xác định (tệp không hoạt động, đầu vào người dùng không mong muốn, v.v.) ngôn ngữ với các hệ thống kiểu như vậy, nhiều lỗi sẽ bị bắt trước khi chạy và vì vậy bạn sẽ không có nhiều trường hợp phòng thủ.
Khi không thể xử lý lỗi, các ngôn ngữ hỗ trợ thành ngữ không nhanh (như Erlang) sẽ cho phép mã rõ ràng hơn các ngôn ngữ không (tĩnh hay không), chủ yếu là vì mã cho các trường hợp đặc biệt không phải là ' t trộn lẫn với mã cho đường dẫn thực hiện lý tưởng.
Kiểu lập trình không nhanh chóng tập trung vào khả năng đọc và gỡ lỗi mã tốt hơn. Trải nghiệm người dùng là mục tiêu phụ: người dùng có thể gặp phải các thông báo lỗi hoặc lỗi chương trình lạ, nhưng chất lượng mã lớn hơn cho phép người lập trình dễ dàng tìm thấy lỗi và khắc phục sự cố.
Lập trình kiểu phòng thủ, thay vào đó, tập trung vào đầu vào xác thực từ người dùng và từ các phần mã khác. Mã này có nhiều chi tiết hơn, bởi vì lập trình viên phải cẩn thận xác minh đầu vào và thất bại một cách duyên dáng trong trường hợp lỗi. Điều này dẫn đến nhiều mã hơn (từ quan điểm của lập trình viên) và một ứng dụng mạnh mẽ hơn (từ quan điểm của người dùng).
Không chính xác. Bạn đang bối rối không phong cách nhanh chóng với phong cách xử lý không có lỗi.Phong cách không nhanh vẫn cho phép chương trình của bạn bắt lỗi và khôi phục từ chúng mà không làm phiền người dùng. – Deestan
Rõ ràng, người dùng cũng gặt hái những lợi ích của phần mềm ít lỗi hơn với phong cách thất bại. Tôi thà nói thất bại là về sự rõ ràng trong đầu vào chính xác là gì và đầu vào không chính xác, và thực sự thực thi điều này. Rõ ràng luôn mang lại một chương trình tốt hơn. Lỗi trong đầu vào phải được gắn cờ như vậy (thay vì ứng dụng bị khập khiễng vào vùng đất không xác định), nhưng điều đó không ngăn ứng dụng xử lý lỗi này một cách trang nhã và trực quan. Tôi nghĩ rằng bạn đang thiết lập một sự phân đôi giả. – harms
Câu trả lời sai. Trong bối cảnh của Erlang, mà câu hỏi đã được hỏi, cách tiếp cận mạnh mẽ hơn là tránh lập trình phòng thủ và chỉ để cho quá trình vi phạm "sụp đổ". Một quá trình khác sẽ thực hiện các hành động thích hợp để phục hồi. Trong Java, mà bạn dường như có kinh nghiệm, bạn không có lựa chọn nào khác ngoài việc phòng thủ vì nó là một ngôn ngữ bắt buộc với mô hình đồng thời được chia sẻ trạng thái. Vì Erlang là một ngôn ngữ chức năng với tính năng đồng thời truyền thông điệp, và bởi vì có những cơ chế để giao tiếp các lỗi giữa các tiến trình, nó hoàn toàn tốt và thích hợp hơn để thất bại nhanh. – dsmith
Xem phần 4.3 và 4.4 trong số thesis của Joe Armstrong.
Liên kết bị hỏng, nhưng đây là một liên kết hoạt động: http://erlang.org/download/armstrong_thesis_2003.pdf –
Phần 4.5 cũng có liên quan, theo ý kiến của tôi. –
Tôi sẽ phá vỡ truyền thống và hỏi tại sao điều này lại được tạo thành wiki cộng đồng. :) –
Tôi có nên thay đổi nó thành một wiki cộng đồng không? Tôi không bao giờ chắc chắn đó là một wiki cộng đồng và đó không phải là. – Zubair
Điều quan trọng về cộng đồng wiki là mọi người có thể chỉnh sửa bất kỳ câu trả lời nào để sửa lỗi và không có điểm tối đa cho người dùng đã gửi trả lời, trong khi chế độ bình thường cung cấp điểm và chỉ người dùng có số điểm tối thiểu mới có thể chỉnh sửa trả lời. –