2012-05-24 29 views
9

Sự khủng khiếp của tiêu đề của câu hỏi là những gì tôi đang cố gắng giải quyết. Ví dụ:Làm cách nào để tìm các phương thức "thiết yếu" để cung cấp giao diện của các mixin Ruby?

trong Ruby, Enumerable là một giao diện trong một cảm giác mà tôi có thể thực hiện một cái gì đó và ghi lại nó như:

def myfancymethod(please_pass_me_an_Enumerable_here) 

nhưng mặt khác, Enumerable là một loại khuếch đại của giao diện có #each là một trong những phương pháp của nó. Nếu tôi có một lớp

class Foo 
    def each 
    :bar 
    end 
end 

Đối với những người không quen với Ruby, nếu bạn mô-đun mixin Enumerable trong một lớp học, bạn sẽ có hàng chục phương pháp mà chỉ dựa vào #each phương pháp để cung cấp những thứ như #map, #select vv

Tôi có thể nói lớp học Foo của tôi là Có thể đếm được hoặc Tương thích với số hoặc những gì? Những cụm từ mô tả một câu trả lời cho "những gì hiện nó đi để trở thành một Enumerable?", "Vâng, bạn cần phải có #each"

Tương tự như vậy, trong Ruby

(Array.new.methods - Object.new.methods).size # 111 

Điều đó có nghĩa rằng để giả mạo một mảng giao diện, tôi phải thực hiện 111 phương pháp? Không có cách nào, nhưng làm thế nào để tôi tìm ra phương pháp nào là "bản chất" của Mảng. chỉ là #[], #[]=#size? Làm thế nào để làm cho tinh thần của nó?

+1

Câu hỏi của bạn về thuật ngữ? Hoặc về cách tìm các phương pháp "thiết yếu"? –

+1

Tôi nghĩ điều này sẽ dễ dàng hơn nhiều khi trả lời bằng ngôn ngữ có giao diện. – Russell

+0

@SergioTulentsev sau này sẽ là tuyệt vời. Tôi vẫn không biết phương thức ActiveRecord hoặc Array "cần thiết" là gì. – ulver

Trả lời

4

Bạn có thể quan tâm đến this feature request, điều này gợi ý một số cải tiến đối với kiến ​​trúc của lớp được sử dụng rộng rãi Hash.

Sự thật đáng buồn là , hãy quên nó. Tại thời điểm này Ruby không có gì như thế này cả. EnumerableComparable gần đúng như hiện tại và "hợp đồng" của chúng chỉ là vấn đề tài liệu.

Nhân tiện, tôi tin rằng #size là phương pháp khác mà Enumerable có thể sử dụng, mặc dù đó là tùy chọn.

5

Tôi nghĩ về từ "contract". Ví dụ, hợp đồng của Enumerable là "cung cấp cho tôi #each và tôi sẽ cung cấp cho bạn những phương pháp ưa thích".

+0

Có một danh mục nào đó về "Hợp đồng" phổ biến/hiện có không? Tôi chưa bao giờ thấy bất cứ điều gì như thế trong thế giới của Ruby. Tôi có thể thấy bây giờ trong Java theo dõi này là không cần thiết vì bạn chỉ xuất bản một lớp được sử dụng như "new Enumerable (Eachable source)" hoặc làm thừa kế. – ulver

+0

Ngoài ra, "Thiết kế theo hợp đồng" là tuyệt vời, nhưng nó đi vào toàn bộ khoa học của pre/post điều kiện/bất biến, vv Tôi chỉ quan tâm đến bộ giao diện "thiết yếu". – ulver

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