2010-11-02 42 views
7

Khi tôi đọc thêm về lập trình siêu lập trình Ruby, hầu hết thời gian chúng tôi tìm thấy ít nhất hai giải pháp để giải quyết vấn đề. Hãy xem xét hai ví dụ dưới đây:Class vs Module trong việc thiết kế Ruby API?

class Base 
    def self.has_many(*args) 
    # ... 
    end 
end 

class Student < Base 
    has_many :books 
end 

Một phong cách:

module Base 
    def self.included(klass) 
    klass.extend ClassMethods 
    end 

    module ClassMethods 
    def has_many(*args) 
     # ... 
    end 
    end 
end 

class Student 
    include Base 

    has_many :books 
end 

Nhưng khi chúng tôi thiết kế api, chúng ta phải quyết định cái nào để sử dụng, nhưng tôi muốn hỏi ý tưởng của bạn và một số thực hành tốt nhất mà hầu hết mọi người đã triển khai trong thư viện của họ.

Trả lời

5

Nếu API của bạn đang cung cấp các chức năng cơ sở đó sẽ được kéo dài thêm khách hàng, sau đó bạn nên thích thừa kế.

Nếu API của bạn sẽ mở rộng các ứng dụng khác nhau với chức năng cơ sở của riêng chúng, thì bạn nên đi tới thành phần.

2

Bạn có nhiều lý thuyết về câu hỏi đó.

Tôi có xu hướng thích bố cục hơn vì nó làm cho hành vi có thể tái sử dụng nhiều hơn theo cách đó nhưng nếu bạn nhìn vào Rails, bạn sẽ phải phân lớp ActiveRecord :: Base mỗi khi bạn muốn một đối tượng trong cơ sở dữ liệu của mình. Nếu bạn nhìn vào DataMapper, nó ngược lại vì chúng chỉ yêu cầu bạn đưa vào DataMapper :: Resource.

Thừa kế vs Thành phần (thông qua mô-đun) là một chủ đề lớn và câu hỏi bạn sẽ phải tự hỏi mình sẽ đi đến: làm cách nào để có được sự tách rời lớn hơn giữa các thành phần mà tôi cung cấp và cơ sở mã người dùng hiện tại khác?

1

Ruby chỉ hỗ trợ đơn thừa kế. Do đó, nếu ứng dụng khách API phải kế thừa lớp cơ sở của bạn, chúng sẽ mất khả năng kế thừa các lớp khác. Sử dụng tính năng bao gồm mô-đun, bạn có thể tạo một mã như:

class Student < Person 
    include Base 
    has_many :books 
end 

Và do đó bạn có thể "kế thừa" cả Người và Cơ sở.

Tuy nhiên, cú pháp thừa kế cổ điển trông tự nhiên hơn và ít "ma thuật"

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