Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyAPIラッパーを構成する3つの方法

Rubyを使用してAPIをラップする場合、それを構成する方法が必要です。ラッパーにはユーザー名と秘密鍵が必要な場合もあれば、ホストだけが必要な場合もあります。

これを処理する方法はいくつかあります。では、どちらを選ぶべきですか?

簡単でグローバルな方法

あなたはあなたのサービスがいつものように振る舞うことを望むかもしれません。 アプリのどこにいても、すぐに使用できます。 それ以外の場合は、使用するすべての行に対して3行の構成に費やします!

定数またはクラス属性を使用して、構成をグローバルにすることができます:

config / initializers / product_api.rb
ProductApi.root = "https://staging-host.example.com/"
ProductApi.user = "justin"
ProductApi.secret = "mysecret123"
app / controllers / products_controller.rb
def show
  @product = ProductApi.find(params[:id])
end

多くの宝石がこのパターンを使用しています。書くのはとても簡単で、本当に使いやすいです。しかし、それにはいくつかの大きな問題があります:

  • ProductApiは1つだけ持つことができます 。

    Product APIを2人の異なるユーザーとして使用したい場合、または1つのアプリから異なるサーバーにアクセスしたい場合は、運が悪いです。

  • ProductApi 誤って変更しやすいグローバルデータがあります。

    スレッドまたはアプリの一部が変更された場合ProductApi.userProductApiを使用するその他すべて 壊れます。そしてそれらは痛い 追跡するバグ。

したがって、クラス変数にはいくつかの問題があります。 インスタンスを構成した場合はどうなりますか 代わりに、Product APIクラスの?

#initializeではどのようになりますか ?

インスタンスを使用した場合は、必要なときにAPIラッパーを作成して構成します。

app / controllers / products_controller.rb
def show
  product_api = ProductApi.new(
    root: "https://staging-host.example.com/",
    user: "justin",
    secret: "mysecret123")
  @product = product_api.find(params[:id])
end

これで、APIを使用するたびに、さまざまな詳細をAPIに渡すことができます。他のメソッドやスレッドがインスタンスを使用していないため、知らないうちにインスタンスが変更されることを心配する必要はありません。

これは良いようです。しかし、それでも本来あるべきほど簡単ではありません。 APIを毎回設定する必要があるため あなたはそれを使います。

ほとんどの場合、APIの設定方法は気にせず、適切なオプションを使用して使用するだけです。ただし、インスタンスを操作する場合、APIを使用するアプリのすべての部分で、APIの構成方法を知っている必要があります。

ただし、必要に応じて変更できる一方で、適切なデフォルトを使用して、グローバルアクセスの利便性を確保する方法があります。

そして、このパターンは、OSXとiOSの開発という興味深い場所に常に現れています。

どのようにして適切なデフォルトを取得しますかおよび 柔軟性?

APIラッパーの各インスタンスを構成できても、気にしないときにグローバルな「デフォルト」インスタンスがあった場合はどうなりますか?

この「defaultSomething」または「sharedWhatever」パターンは、iOSおよびMac OS SDK全体に表示されます:

[[NSURLSession sharedSession] downloadTaskWithURL:@"https://www.google.com"];

[[NSFileManager defaultManager] removeItemAtPath:...];

また、デフォルトで提供される以上のものが必要な場合でも、これらのクラスのインスタンスを要求できます。

NSURLSession *session = [NSURLSession sessionWithConfiguration:...];

NSFileManager fileManager = [[NSFileManager alloc] init];

default_apiを使用して、Rubyでそのようなものを構築できます。 クラスメソッド:

app / controllers / products_controller.rb
def show
  @product = ProductApi.default_product_api.find(params[:id])
end

...

def show_special
  special_product_api = ProductApi.new(
    root: "https://special-product-host.example.com/"
    user: "justin"
    secret: "mysecret123")
  @special_product = special_product_api.find(params[:id])
end

また、実装は次のようになります。

class ProductApi
  def initialize(root:, user:, secret:)
    @root, @user, @secret = root, user, secret
  end

  def self.default_api
    @default_api ||= new(
      root: ENV['PRODUCT_API_ROOT'],
      user: ENV['PRODUCT_API_USER'],
      secret: ENV['PRODUCT_API_SECRET'])
  end

  def find(product_id)
    ...
  end
end

ここでは、default_apiで環境変数を使用しました 、ただし、構成ファイルを使用することもできます。そして、||=を切り替えることができます 代わりにスレッドまたはリクエストローカルストレージを使用します。

しかし、これはまともなスタートです。

私が見たほとんどのgemは、Twitter gemのように、必要なときに各APIオブジェクトを構成および作成する必要があります。これは問題のない解決策です(ただし、通常、これらをグローバルに割り当てる人がいますが、とにかく

ただし、さらに一歩進んで、事前に構成されたデフォルトオブジェクトを使用すると、はるかに快適な時間を過ごすことができます。


  1. Mac の画面をロックする 9 つの方法

    1 ~ 2 分離れている間にデータを安全に保ちたい場合は、Mac で画面をロックすることが非常に必要かつ重要です。 . MacBook をロックすると、アクティブなアプリケーションを終了したり中断したりせずに、MacBook をスリープ状態にできます。通常、再度アクセスするには、ログイン パスワードを入力する必要があります。 この投稿には、Mac 画面をロックする方法がすべて含まれています。 .その前に、パスワード保護を有効にしていない場合は、Mac のロックを解除するためにまずパスワードを要求する必要があります。 目次: 1. Mac をパスワードで保護 2. Mac のふたを閉じて

  2. Chrome ブラウザを高速化する 10 の方法

    Chrome はうまく機能しますが、ある時点で速度が低下します。膨大な数のキャッシュ ファイルや拡張機能など、Chrome の速度が低下する理由は多数あります。多くの場合、これらの原因となるアイテムはブラウザに含める必要さえありません. コンピューターで Chrome ブラウザーを高速化するには、キャッシュの削除、ブラウザーの更新、Chrome の非表示オプションの使用などがありますが、これらに限定されません。これらの項目を微調整すると、コンピューターの Chrome ブラウザーのパフォーマンスが向上します。 Chrome ブラウザを更新 Chrome ブラウザーを高速化する 1 つの方