2012-04-05 38 views
5

Có một sự khác biệt trong việc sử dụng giữaSử dụng lớp << tự, khi nào cần sử dụng các lớp học hoặc mô-đun?

class Helper 
    class << self 
    # ... 
    end 
end 

module Helper 
    class << self 
    # ... 
    end 
end 

Khi bạn sẽ sử dụng một trong khác không?

+0

Một trong số họ có thêm một chữ cái so với chữ cái kia? :) Bạn có ý nghĩa gì bởi "có sự khác biệt"? Một là một lớp, một là một mô-đun, và trong cả hai bạn đang nhập eigenclass. – Phrogz

+0

Tôi nghĩ rằng tôi muốn hỏi, khi nào bạn sẽ sử dụng cái này qua cái kia. Tôi đã chỉnh sửa câu hỏi để phản ánh điều đó. –

Trả lời

4

Các class<<self có vẻ là một cá trích đỏ, vì sự khác biệt duy nhất ở đây là một lớp so với một mô-đun. Có lẽ bạn đang yêu cầu "Tôi muốn tạo một đối tượng mà tôi không có ý định khởi tạo, nhưng chỉ tồn tại dưới dạng không gian tên cho một số phương thức (và có thể là một singleton với trạng thái toàn cầu, riêng của nó)."

Nếu trường hợp này xảy ra, cả hai sẽ hoạt động tốt như nhau. Nếu có bất kỳ cơ hội mà bạn có thể muốn tạo một dẫn xuất (một đối tượng kế thừa những phương pháp tương tự) thì bạn nên sử dụng một lớp vì nó hơi là dễ dàng hơn để viết:

class Variation < Helper 

thay vì

module Helper 
    module OwnMethods 
    # Put methods here instead of class << self 
    end 
    extend OwnMethods 
end 

module Variation 
    extend Helper::OwnMethods 

Tuy nhiên, đối với chỉ là không gian tên tôi thường sẽ sử dụng một mô-đun trên một lớp, như một lớp học ngụ ý rằng sự diễn giải sẽ xảy ra.

2

Sự khác biệt giữa Mô-đun và Lớp là bạn có thể tạo một phiên bản của một Lớp, chứ không phải là Mô-đun. Nếu bạn cần tạo một thể hiện của Helper (h = Helper.new) thì nó phải là một lớp. Nếu không, nó có lẽ là tốt nhất để duy trì một mô-đun. Tôi không chắc cách phần còn lại của mã của bạn có liên quan đến câu hỏi; cho dù bạn có các phương thức lớp trên một Mô-đun hay một Lớp không liên quan đến việc bạn có cần tạo các cá thể của đối tượng đó hay không.

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