0

我正在尝试实现一个库,该库提供了一种与服务器通信的统一方式,该服务器正在将其 API 调用从一个版本更改为另一个版本。我计划以这种方式实现它:

连接.rb:

class Connect
    def self.getConn(params)
        case params[:version]
            when '4.0' then return Connect4.new(params)
            when '5.0' then return Connect5.new(params)
            else 'Version not supported.'
        end

    end 
end

class Connect4
    def initialize(params)
        # Code for v4.
    end 
end

class Connect5
    def initialize(params)
        # Code for v5.
    end 
end

测试.rb:

require 'connect'

conn = Connect.getConn(:version => '4.0')

puts conn

我认为它会起作用,但我对 ruby​​ 还是很陌生,可能有一些我没有考虑的问题。是否有处理此类“挑战”的最佳实践?

4

1 回答 1

1

我不认为你的方法有什么问题,它当然可以工作。另一方面,如果您的 API 有多个入口点,那么将版本传递给每个入口点会让人感觉有点难看。你可以用一些全局设置来解决它,但我们不要去那里......

Twitter 的 Cassandra gem 有一个有趣的方法,而不是传递版本号,您需要一个不同的子库(docs):

require 'cassandra' # default version
require 'cassandra/1.0' # 1.0 version

这在与Bundler一起使用时特别有用,因为您可以像这样选择版本

gem "cassandra", require: "cassandra/1.0"

你完成了整个应用程序。

于 2013-01-16T18:47:55.387 回答