2012-02-15 27 views
20

gì là dành cho bạn những ưu và nhược điểm của việc sử dụng:Cách ưa thích (kiểu tốt hơn) để đặt tên cho một không gian tên trong Ruby là gì? Số ít hoặc số nhiều?

FooLib::Plugins 
FooLib::Plugins::Bar 

ước vs

FooLib::Plugin 
FooLib::Plugin::Bar 

đặt tên? Và những gì bạn sẽ sử dụng hoặc những gì bạn đang sử dụng? Điều gì thường được sử dụng trong cộng đồng?

+1

Bằng cách nhìn vào [Rails API] (http: //api.rubyonrails .org/classes/ActiveRecord.html), tôi thấy có nhiều tên số nhiều hơn trên các mô-đun hơn trong các lớp (xem không gian tên, ở nửa thứ hai của trang). Tuy nhiên, tôi không có đủ kinh nghiệm với Rails để có được khi nào nên sử dụng nó và khi nào thì sử dụng cái kia. –

Trả lời

11

Để tôi FooLib::Plugins xuất hiện như một mô-đun, được sử dụng làm không gian tên mà các lớp plugin khác nhau được lưu giữ. FooLib::Plugin trông giống như một lớp bậc trên cho các plugin FooLib.

Trong FooLib::Plugins::Bar, Bar chắc chắn có vẻ giống như tên của plugin. Với FooLib::Plugin::Bar, tôi sẽ nghi ngờ liệu Bar là lớp trợ giúp được sử dụng bởi Foo::Plugin hay tên của một plugin.

+0

Đây là một câu hỏi chung. Không gắn liền với những gì tôi đang làm. Tôi có một số suy nghĩ về chủ đề này và tôi muốn xem những gì người khác nghĩ về nó. –

+0

Điều gì về FooLib :: Plugins :: Bar vs FooLib :: Plugin :: Bar? - cái thứ hai trông giống như một tên đối tượng -> Bar là một Plugin trong FooLib, cái đầu tiên không phù hợp với lý do này. –

+0

@ Jeznet, tôi vừa chỉnh sửa câu trả lời của mình. –

4

Giả sử Plugin là một lớp cơ sở:

  • class FooLib::Plugin::Bar < FooLib::Plugin

    Đây là một trong tôi sử dụng và giới thiệu. BarPlugin trong số FooLib nó được kế thừa từ FooLib::Plugin. Nó cũng giúp các plugin được cung cấp bởi các FooLib thư viện được đặt nằm dưới namespace của lớp nói chung, mà đọc một cách tự nhiên:

    # Assign the Bar Plugin of the FooLib library to p. 
    p = FooLib::Plugin::Bar 
    

    Nếu tôi là để phát triển một plugin của bên thứ ba cho thư viện của bạn, tôi sẽ tạo ra cấu trúc sau:

    # Baz is a Plugin for the FooLib library provided by BarLib. 
    class BarLib::FooLib::Plugin::Baz < ::FooLib::Plugin 
    

    Lưu ý rằng tôi phản ánh thứ bậc FooLib, nhưng dưới namespace BarLib 's. Tôi sẽ không mở rộng nó trực tiếp.

  • class FooLib::Plugins::Bar < FooLib::Plugin

    Tôi cũng đã sử dụng thế này, và tôi nghĩ rằng nó làm cho ý nghĩa nhất. Bar mở rộng FooLib::Plugin và là một trong số Plugins được cung cấp bởi FooLib. Tuy nhiên, nó tạo ra một mô-đun không cần thiết.

    Tôi nghĩ đây sẽ là lựa chọn tuyệt vời nếu Plugins là một kho lưu trữ plugin trung tâm triển khai các phương pháp như Plugins.add, Plugins.allPlugins.loaded.

    Sử dụng nó nếu bạn có thể biện minh cho mô-đun bổ sung.

  • class FooLib::Plugins::Bar < FooLib::Plugins

    Không kiếm được nhiều ý nghĩa với tôi. Bar là một trong số Plugins trong FooLib, phần đó có vẻ ổn. Tuy nhiên, nó kế thừa từ Plugins. Có phải kế thừa từ nhiều plugin không? Nghe có vẻ kì lạ với tôi; tên lớp không nên gợi ý điều gì đó là không thể.

+1

Nhiều điểm tốt được thực hiện, +1. Nếu các plugin không kế thừa từ một lớp cơ sở chung, 'FooLib :: Plugins' có vẻ rất hấp dẫn. –

1

Nói chung, cách tiếp cận tôi có xu hướng thực hiện là:

module Foo 
    module Plugin 
    class Base; end 
    end 
end 

class Foo::Plugin::Bar < Foo::Plugin::Base; end 

Lớp Base cho plugin là một quy ước tìm thấy khắp nơi trong RubyOnRails codebase cũng như nhiều người khác. (ví dụ: ActiveRecord::Base, ActionController::Base, v.v.)

Tôi không đồng ý với @Matheus Cách tiếp cận của Moreira nơi được sử dụng làm lớp cơ sở và không gian tên cho plugin.

Lý do chức năng duy nhất tại sao điều này không nên làm với quy ước - trong cộng đồng Ruby, người ta sẽ tìm thấy ít trường hợp của các lớp như không gian tên hơn mô-đun. Thời gian duy nhất tôi thực sự thấy các lớp được sử dụng như một vùng tên cho một lớp khác là khi mục đích của lớp được nói là riêng tư cho lớp không gian tên và không được sử dụng bên ngoài.

15

Sử dụng:

module FooLib end 
module FooLib::Plugins end 
class FooLib::Plugins::Plugin; end #the base for plugins 
class FooLib::Plugins::Bar < FooLib::Plugins::Plugin; end 
class FooLib::Plugins::Bar2 < FooLib::Plugins::Plugin; end 

hoặc trong một từ khác nhau:

module FooLib 
    module Plugins 
    class Plugin; end #the base for plugins 
    class Bar < Plugin; end 
    class Bar2 < Plugin; end 
    end 
end 

Cũng sắp xếp các tập tin như thế này:

- foo_lib/ 
    - plugins/ 
    - plugin.rb 
    - bar.rb 
    - bar2.rb 

Đây là how Rails does it (vì vậy đây là Way Rails). I E. xem xét không gian tên Associations và Associations::Association class từ đó tất cả các lớp tạo thành không gian tên Associations thừa kế (tức là Associations::SingularAssociation).

1

Tôi sẽ xếp thứ hai cách tiếp cận được vạch ra bởi @jtrim.

Cho rằng các mô-đun (tức Plugin) đang được sử dụng cho không gian tên, tôi thường ghi đè lên các phương pháp mới trong module:

module Foo 
    module Plugin 

    def self.included(base) 
     raise "cannot be included" 
    end 

    def self.extended(base) 
     raise "cannot extend" 
    end 

    def self.new(*args) 
     Base.new(*args) 
    end 

    class Base;end 
    end 
end 


base_plugin_obj = Foo::Plugin.new(...) 
Các vấn đề liên quan