Tất cả các sách có vẻ như nói rằng export_all là thực hành không tốt nhưng không đưa ra lý do. Cuối cùng, hầu hết các mô-đun dành phần lớn thời gian của họ với biên dịch (export_all) vì liên tục cập nhật danh sách các mô-đun để loại bỏ các hàm trợ giúp là một rắc rối. Có thực hành không tốt vì tôi phải quan tâm đến các chức năng tôi vạch trần cho các nhà phát triển khác? Hoặc là thực hành không tốt bởi vì có một số loại chi phí hiệu suất trong số các chức năng mà một mô-đun có, vì có thể là những thứ như tải mã nóng. Nếu có một hiệu suất hit để nhồi một mô-đun với rất nhiều chức năng, làm thế nào xấu là nó?Tại sao thực thi không đúng (export_all)?
Trả lời
Đối với nhiều lý do:
Clarity: nó dễ dàng hơn để xem những chức năng được dự định sẽ được sử dụng bên ngoài module.
Khi tab của bạn hoàn tất trong vỏ Erlang, bạn sẽ nhận được một danh sách chỉ các hàm được xuất và không có các hàm khác. Khi bạn cấu trúc lại mô-đun, bạn biết những chức năng nào bạn có thể đổi tên một cách an toàn mà không cần người dùng bên ngoài tùy thuộc vào chúng.
Mùi mã: bạn nhận được cảnh báo cho các chức năng không sử dụng.
Vì vậy, bạn sẽ tránh được mã chết.
Tối ưu hóa: trình biên dịch có thể thực hiện tối ưu hóa tích cực hơn khi biết rằng không phải tất cả các hàm đều phải được xuất.
Bạn có nguồn để sao lưu yêu cầu tối ưu hóa không? – jocull
Thật không may là không, nhưng tôi tưởng tượng rằng nó sẽ có thể các chức năng nội tuyến chỉ được sử dụng ở một nơi ví dụ, nếu nó biết họ sẽ không bao giờ được gọi từ bên ngoài mô-đun. –
Ngoài ra, nó làm cho dialyzer khó sử dụng hơn. @jocull Trong cuốn sách của Joe Armstrong, Lập trình Erlang, 2nd ed., pg. 164, ông nói rằng "trình biên dịch có thể tạo ra mã tốt hơn nhiều" khi bạn xuất ít hàm hơn. – JDong
Mặc dù tôi không biết chắc chắn có bất kỳ ý nghĩa thực tiễn nào về việc sử dụng -compile(export_all).
hay không, tôi nghi ngờ chúng đủ quan trọng để quan tâm.
Tuy nhiên, có lợi ích khi khai báo danh sách hàng xuất khẩu một cách rõ ràng. Bằng cách này, mọi người có thể tìm ra giao diện của mô-đun bằng cách xem trang đầu tiên của tệp .erl
. Ngoài ra, như với nhiều thứ khác mà chúng ta có xu hướng viết ra, khai báo rõ ràng về giao diện mô-đun giúp duy trì sự rõ ràng của nó.
Với những gì đã nói, khi tôi bắt đầu làm việc trên một mô-đun Erlang mới tôi luôn luôn gõ -module(...). -compile(export_all).
Sau khi giao diện trở nên trưởng thành đủ để tôi thêm một rõ ràng -export([...])
trong khi vẫn giữ tùy chọn export_all
biên dịch.
Không có tác động hiệu quả của việc sử dụng '-compile (export_all) .'. Trình biên dịch xử lý tất cả các cuộc gọi như nhau và xuất khẩu được thực hiện theo cùng một cách như với xuất khẩu rõ ràng. – rvirding
Có danh sách được xác định của các chức năng nào là bên ngoài và do đó chức năng nào là nội bộ, rất hữu ích cho bất kỳ ai sẽ làm việc trên mã của bạn trong tương lai. Gần đây tôi đã được refactoring một số mã cũ, và việc sử dụng export_all trong hầu hết các mô-đun đã được một nguồn liên tục của sự khó chịu.
- 1. jQuery không thực thi đúng thứ tự?
- 2. Tại sao "cuối cùng" này thực thi?
- 3. Tại sao Clojure không thực thi chức năng này?
- 4. Tại sao IO không được thực thi theo thứ tự?
- 5. Android AsyncTask - tại sao doInBackground() không được thực thi?
- 6. Tại sao cuối cùng không được thực thi?
- 7. Tại sao mã trong khối tĩnh không thực thi?
- 8. Có sử dụng thực thi không đúng số nguyên không?
- 9. Tại sao TextRenderer.MeasureText không hoạt động đúng?
- 10. Tại sao thực thi chậm trong Python MySQLdb?
- 11. AutoMapper: Tại sao UseValue chỉ được thực thi sau khi
- 12. Tại sao initWithCoder không khởi tạo đúng mục?
- 13. Tại sao Cron của tôi không hoạt động đúng?
- 14. Gọi lại JSONP không thực thi khi chạy tại localhost
- 15. Tại sao Thuộc tính được thực thi chậm hơn so với Thực thi Phương thức hoặc Phương thức?
- 16. Tại sao Python không thể thực thi java.exe qua tiến trình con?
- 17. Tại sao một phần mã của tôi không được thực thi?
- 18. Tại sao hàm tạo mặc định của chương trình lớp không bao giờ được thực thi?
- 19. Tại sao cron không thực thi tập lệnh PHP của tôi một cách chính xác?
- 20. tại sao việc định giờ không trì hoãn việc thực thi chức năng?
- 21. Tại sao biểu tượng thực thi này trông xấu khi biểu tượng không chính xác?
- 22. Tại sao tất cả kết quả kiểm tra Visual Studio của tôi "Không được thực thi"
- 23. Tại sao C++ không thực thi const trên dữ liệu con trỏ?
- 24. Tại sao địa chỉ ảo thực thi ELF có dạng 0x80xxxxx và không phải là 0x0?
- 25. Tại sao các trang web chính không vượt qua xác thực W3C đúng cách?
- 26. Tại sao pom của tôi không được thực hiện đúng khi sử dụng Android Studio/IntelliJ?
- 27. Tại sao console.log (đúng, '\ t') in đúng "\t"?
- 28. Tại sao ô này không được áp dụng đúng lớp?
- 29. Tại sao thi đua phải được thực hiện trong thời gian thực?
- 30. Tại sao không có một mod_ruby khả thi cho Apache?
vì kỹ thuật đảo ngược dễ dàng hơn và không nhất thiết tạo ra tệp thực thi lớn hơn cần thiết. không ai cần tên chức năng của bạn trong quyền thực thi? – fazo