我正在创建两个包装相同API的gem。一个是包含API端点的vanilla客户端库,第二个是与第三方API集成,并在第一个上提供另一层抽象。他们没有任何重叠的方法。
第二个扩展第一个命名空间是否可以接受?
例如:
# vanilla client lib
module Foo
class Bar
def do_bar
puts "Bar!"
end
end
end
# more complex client lib
module Foo
class Baz
def do_baz
puts "Baz!"
end
end
end
基于this question,看起来AWS就是这样做的。是否存在可以接受的情况以及不存在的情况?
答案 0 :(得分:1)
这似乎是构建宝石的完全可接受的方式。在您的代码示例中,Foo::Bar
和Foo::Baz
将是同一名称空间中的两个完全不同的类,并且它们不会相互冲突。即使您在两个类中使用相同的方法名称,也是如此:
module Foo
class Bar
def do_thing
puts "Bar!"
end
end
end
module Foo
class Baz
def do_thing
puts "Baz!"
end
end
end
在此修改示例中,Foo::Bar#do_thing
将输出"Bar!"
,Foo::Baz#do_thing
将输出"Baz!"
,因为它们是不同类中的单独方法。这种方法允许您为Foo::Baz
个对象交换Foo::Bar
个对象以改变行为,因为它们具有相同的接口。
如果您希望第三方API gem扩展您的vanilla API gem的功能,您可能需要考虑调整使用继承的方法。