2009-11-24 25 views
12

Có vẻ như nó không nhất quán trong mô-đun danh sách. Ví dụ, phân chia có số là đối số đầu tiên và danh sách thứ hai, nhưng danh sách con có danh sách là đối số đầu tiên và len làm đối số thứ hai.Có cách nào thành ngữ để sắp xếp các đối số hàm trong Erlang không?

+0

Không, đó là một mớ hỗn độn vì các thư viện không được thiết kế quá nhiều khi chúng phát triển. Chờ đợi câu trả lời của rvirding và làm theo phong cách của mình. :) – Christian

+1

Có lẽ đó là vì tôi đến từ một nền OO, nhưng có vẻ như tất cả các chức năng hoạt động trên danh sách nên lấy danh sách là đối số đầu tiên – pjb3

Trả lời

19

OK, một chút lịch sử khi tôi nhớ và một số nguyên tắc đằng sau phong cách của mình.

Như Christian đã nói rằng các thư viện đã phát triển và có xu hướng để có được thứ tự đối số và cảm nhận từ các xung chúng tôi đã nhận được ngay sau đó. Vì vậy, ví dụ lý do tại sao yếu tố/setelement có thứ tự đối số họ làm là vì nó phù hợp với vị từ arg/3 trong Prolog; hợp lý nhưng không phải bây giờ. Thông thường, chúng tôi sẽ làm việc điều trước tiên, nhưng tiếc là không phải lúc nào cũng vậy. Đây thường là một lựa chọn tốt vì nó cho phép các đối số "tùy chọn" được thêm thuận tiện vào cuối; ví dụ chuỗi: substr/2/3. Các hàm có điều là đối số cuối cùng thường bị ảnh hưởng bởi các ngôn ngữ chức năng với currying, ví dụ Haskell, nơi rất dễ sử dụng currying và đánh giá từng phần để xây dựng các chức năng cụ thể mà sau đó có thể được áp dụng cho điều . Điều này rất đáng chú ý trong các hàm bậc cao trong danh sách.

Ảnh hưởng duy nhất chúng tôi không có là từ thế giới OO. :-)

Thông thường chúng tôi ít nhất được quản lý để nhất quán trong mô-đun, nhưng không phải lúc nào. Xem lại danh sách. Chúng tôi đã cố gắng để có một số tính nhất quán, do đó, thứ tự đối số trong các hàm bậc cao hơn trong dict/sets khớp với các hàm tương ứng trong các danh sách.

Sự cố cũng đã trầm trọng hơn do thực tế rằng chúng tôi, đặc biệt là tôi, có thái độ khá nghiêm trọng đối với thư viện. Tôi chỉ không nhìn thấy chúng như là một điểm bán hàng cho ngôn ngữ, vì vậy tôi đã không phải lo lắng về nó. "Nếu bạn muốn một thư viện mà làm một cái gì đó sau đó bạn chỉ cần viết nó" là phương châm của tôi. Điều này có nghĩa là các thư viện của tôi đã được cấu trúc, không phải lúc nào cũng có cấu trúc giống nhau. :-) Đó là số lượng thư viện ban đầu được đưa ra.

Điều này, tất nhiên, tạo ra sự nhầm lẫn không cần thiết và vi phạm luật ít ngạc nhiên nhất, nhưng chúng tôi đã không thể làm bất cứ điều gì về nó. Bất kỳ đề xuất sửa đổi các mô-đun đã luôn luôn được đáp ứng với một "không" vang dội.

Phong cách cá nhân của riêng tôi thường được cấu trúc, mặc dù tôi không biết nó có phù hợp với bất kỳ hướng dẫn hoặc tiêu chuẩn nào được viết hay không.

Tôi thường có điều hoặc mọi thứ Tôi đang làm việc với tư cách là đối số đầu tiên hoặc ít nhất là rất gần đầu; thứ tự phụ thuộc vào cảm giác tốt nhất. Nếu có một trạng thái toàn cầu bị xâu chuỗi thông qua toàn bộ mô-đun, mà thường có, nó được đặt làm đối số cuối cùng và được đặt tên rất giống như St0, St1, ... (Tôi thuộc về nhà thờ của các tên biến ngắn). Đối số được xâu chuỗi thông qua các hàm (cả đầu vào và đầu ra), tôi cố giữ nguyên thứ tự đối số giống như thứ tự trả về. Điều này làm cho nó dễ dàng hơn nhiều để xem cấu trúc của mã. Bên cạnh đó, tôi cố gắng nhóm các tranh luận lại với nhau.Ngoài ra, nếu có thể, tôi cố gắng giữ nguyên cùng thứ tự đối số trong toàn bộ mô-đun.

Không ai trong số này là rất cách mạng, nhưng tôi thấy nếu bạn giữ một phong cách nhất quán thì đó là một điều ít lo lắng và nó làm cho mã của bạn cảm thấy tốt hơn và thường dễ đọc hơn. Ngoài ra tôi sẽ thực sự viết lại mã nếu thứ tự đối số cảm thấy sai.

Một ví dụ nhỏ mà có thể giúp:

fubar({f,A0,B0}, Arg2, Ch0, Arg4, St0) -> 
    {A1,Ch1,St1} = foo(A0, Arg2, Ch0, St0), 
    {B1,Ch2,St2} = bar(B0, Arg4, Ch1, St1), 
    Res = baz(A1, B1), 
    {Res,Ch2,St2}. 

Đây Ch là một địa phương xích qua biến trong khi St là một trạng thái toàn cầu hơn. Kiểm tra mã trên github cho LFE, đặc biệt là trình biên dịch, nếu bạn muốn có một ví dụ dài hơn.

Điều này đã trở nên lâu hơn rất nhiều so với điều đáng lẽ phải làm.

P.S. Tôi đã sử dụng từ điều thay vì đối tượng để tránh nhầm lẫn về những gì tôi đang nói.

4

Không, không có thành ngữ được sử dụng nhất quán theo ý nghĩa của bạn.

Tuy nhiên, có một số gợi ý có liên quan hữu ích áp dụng đặc biệt khi bạn sắp thực hiện các cuộc gọi đệ quy sâu sắc. Ví dụ, giữ bất kỳ đối số nào sẽ không thay đổi trong suốt cuộc gọi đuôi trong cùng một thứ tự/vị trí trong danh sách đối số cho phép máy ảo thực hiện một số tối ưu hóa rất tốt đẹp.

+2

Hỏi: Tôi nên đặt đối số của mình ở đâu? Trả lời: Các luận cứ nên ở lại vị trí của chúng. Nghe như trí tuệ cổ đại: o) – Zed

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