EAFP Python

Trong bài viết này, chúng ta sẽ xem xét hai phong cách viết mã phổ biến mà các lập trình viên sử dụng để xử lý các tình huống trong đó một đoạn mã có thể bị lỗi. “Hãy Nhìn Trước Khi Bạn Nhảy” (LBYL) và “Xin Tha Thứ Dễ Hơn Xin Phép” (EAFP)

Nếu bạn không quen thuộc với LBYL so với. Cuộc tranh luận về EAFP, điều đó tốt thôi. Chúng tôi sẽ bao gồm cả hai trong thời gian ngắn

Hiểu các sắc thái của các mô hình này sẽ giúp bạn viết mã sạch hơn và hiệu quả hơn. Chúng ta sẽ xem xét chủ đề này từ góc độ Python, nhưng một số khái niệm cũng áp dụng cho các ngôn ngữ khác

Bắt đầu nào

Xem xét trước khi bạn bước nhảy vọt

LBYL là phong cách lập trình truyền thống trong đó chúng tôi kiểm tra xem một đoạn mã có hoạt động hay không trước khi thực sự chạy nó

Nói cách khác, nếu một đoạn mã cần một số điều kiện tiên quyết, chúng tôi đặt các câu lệnh có điều kiện sao cho mã chỉ chạy nếu tất cả các điều kiện tiên quyết được đáp ứng

Trong ví dụ dưới đây, chúng tôi kiểm tra xem các khóa (_______0, agegender) có tồn tại hay không và sau đó in chúng

Xin tha thứ dễ hơn xin phép

Thuật ngữ EAFP được đặt ra bởi Chuẩn đô đốc Grace Murray Hopper, người phát minh ra COBOL. Theo cách tiếp cận này, chúng tôi chỉ cần chạy mã của mình, hy vọng điều tốt nhất trong khi sẵn sàng xử lý bất kỳ lỗi nào nếu mã bị lỗi

Thông thường, điều này có nghĩa là đặt mã của chúng tôi trong các khối try-except và xử lý mọi trường hợp ngoại lệ có thể xảy ra

Trong ví dụ dưới đây, chúng tôi chỉ cần in nội dung của từ điển mà không cần kiểm tra. Nếu thiếu khóa, khối except sẽ xử lý khóa đó. Lưu ý cách này khác với cách tiếp cận LBYL trong ví dụ trên

Vì vậy, cái nào tốt hơn?

Theo nguyên tắc thông thường, EAFP được coi là Pythonic hơn và nên được ưu tiên trong hầu hết các tình huống. Dưới đây là một số lý do tại sao EAFP được ưa thích hơn LBYL

Rõ ràng và dễ đọc hơn

EAFP làm cho “con đường hạnh phúc” trở nên rõ ràng và dễ đọc hơn. “Rõ ràng tốt hơn ẩn ý” là một nguyên lý quan trọng của Python. Trong ví dụ trên, chúng tôi hy vọng rằng các khóa sẽ có mặt trong từ điển trong hầu hết các trường hợp, đó là những gì mã EAFP gợi ý. Tuy nhiên, mã LBYL nhấn mạnh trường hợp hiếm khi các phím bị thiếu

Hiệu suất tốt hơn

EAFP thường nhanh hơn LBYL — đặc biệt khi cần nhiều lần kiểm tra. Xem xét ví dụ trên. Trong phương pháp LBYL, chúng tôi thực hiện ba lần kiểm tra xem liệu các khóa có trong từ điển hay không. Gọi từ điển ba lần là tốn thời gian và lặp đi lặp lại. EAFP nhanh hơn vì nó chỉ in trực tiếp từ điển

Bây giờ, đúng là các trường hợp ngoại lệ đắt hơn các câu lệnh if. Nhưng các ngoại lệ chỉ được kích hoạt một vài lần, trong khi câu lệnh if luôn được thực thi. Bên cạnh đó, bạn nên lưu ý rằng các ngoại lệ là một thao tác rẻ hơn trong Python so với trong Java hoặc C++. Vì vậy, thật tốt khi sử dụng các ngoại lệ cho luồng điều khiển

Ngăn chặn điều kiện chủng tộc

Quan trọng nhất, EAFP giúp chúng tôi tránh các điều kiện chủng tộc. Điều kiện chủng tộc xảy ra khi nhiều luồng đang cố truy cập vào một đối tượng. Xem xét hai luồng đang cố truy cập từ điển person trong kịch bản LBYL. Nếu một trong các luồng xóa một khóa khỏi từ điển và luồng thứ hai đã qua kiểm tra, chúng tôi sẽ nhận được một ngoại lệ khi câu lệnh in được thực thi

Tuy nhiên, trong EAFP, chúng tôi có thể yên tâm rằng bất kể trường hợp nào xảy ra, tất cả các trường hợp ngoại lệ sẽ được xử lý bởi khối except

Vậy có trường hợp nào cho LBYL không?

Có, có một số trường hợp sử dụng LBYL có ý nghĩa hơn

Tác dụng phụ phức tạp

Nếu chức năng của bạn có tác dụng phụ khó hoàn tác, sử dụng EAFP có thể là một ý tưởng tồi. Giả sử bạn bắt đầu ghi vào một tệp và nhận được một ngoại lệ khi một số thay đổi đã được thực hiện. Cố gắng hoàn nguyên các thay đổi trong khối except có thể khó khăn. Sử dụng LBYL để dừng hoạt động trước sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều

Quá nhiều ngoại lệ

Nếu bạn mong đợi các ngoại lệ được ném vào nhiều điểm trong mã của mình, việc sử dụng EAFP có thể làm giảm khả năng theo dõi nơi mã thực sự bị lỗi. Tốt nhất, bạn nên cấu trúc lại mã của mình để có các khối try-except hẹp và tiếp tục sử dụng EAFP. Trong trường hợp bạn không thể, chỉ cần đi với LBYL

Vào cuối ngày, cuộc tranh luận này vẫn mở và một số nhà phát triển chỉ thích phong cách này hơn phong cách kia. Nếu bạn không đồng ý, tôi rất muốn nghe suy nghĩ của bạn

Từ Wikipedia, bách khoa toàn thư miễn phí

Bước tới điều hướng Bước tới tìm kiếm

EAFP có thể đề cập đến

  • Xin tha thứ thì dễ hơn xin phép
    • Trong lập trình, nó đề cập đến việc thực hiện một thao tác có thể là bất hợp pháp mà không kiểm tra trước xem thao tác này có thành công hay không, sau đó xử lý lỗi có thể xảy ra thay vì kiểm tra trước. Điều này làm giảm nguy cơ lỗi từ thời điểm kiểm tra đến thời điểm sử dụng. Đặc biệt, phương pháp này được khuyến khích trong ngôn ngữ lập trình Python
  • Hiệp hội Khoa Dược Châu Âu;

Xem thêm [sửa]

Các chủ đề được gọi bằng cùng một thuật ngữ