2011-10-22 42 views
14

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)?

+2

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

Trả lời

22

Đố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.

+0

Bạn có nguồn để sao lưu yêu cầu tối ưu hóa không? – jocull

+0

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. –

+3

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

10

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.

+3

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

3

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.

Các vấn đề liên quan