[Golang]Proxyパターンを学ぼう!~Version 2~

こんにちは。KOUKIです。

以前、Proxyパターンについて記事を書きましたが、別パターンでも実装したので紹介します。

golang

Proxyパターン

Proxyパターンは、プログラムの要求を代理人(Proxy)が受け取って処理するパターンです。

DB操作を題材に、理解を深めていきましょう!

Proxyを実装する

まずは、Proxyを実装してみましょう。

UserListProxyが件のProxyです。

このProxyは、データベース、キャッシュ、スタックサイズ、キャッシュの使用有無判定をパラメータとして持っています。

Proxyを経由して呼び出すメソッドの結果は、Proxy自身のパラメータで管理されます。例えば、データベースを検索したらその結果をProxyがキャッシングする、といった具合にです。

テストコードの実装

実装の途中ですが、テストコードを実装して使い方を確認してみましょう。

コードは長くなりましたが、流れは以下のようになっています。

  1. Mockデータベースを作成
  2. Proxy設定
  3. テスト用のID取得
  4. Proxyの動作確認

FindUserメソッドの中身を実装していないのでイメージしづらいかもしれません。

Mockデータベースから検索を行うと、結果をProxy自身にキャッシングします。キャッシング数は、StackSizeに記録され、キャッシュの使用の有無については、LastSearchUsedCacheプロパティをチェックする仕様になります。

テストを実行してみましょう。

FindUserメソッドの実装1

UserList構造体にFindUserメソッドを実装します。

UserList構造体(キャッシュ)はUserのリスト型ですが、上記の様にメソッドを定義することが可能です。

これで、自身が保持しているデータから該当するデータを戻り値として返却できるようになりました。

FindUserメソッドの実装2

次は、ProxyのFindUserメソッドを実装します。

ここでの処理は明快です。キャッシュをチェックし、データが存在しない場合のみDBに問い合わせます。

ユーザーをスタックに入れる

ユーザーをスタックに入れる処理を実装します。

この関数を先ほど実装したFindUserメソッドから呼び出します。

テストコードの実行

テストコードを実行してみましょう。

OKですね。

おわりに

デザインパターンの学ぶメリットは、綺麗なソースコードを実装できるようになることです。しかし、何事においてもやりすぎはいけません

あまりデザインパターンに固執しすぎると自分だけが読めるソースコードを量産することに繋がります。

基本的な考え方として、「ソースコードの意味を最短で理解できる」コードが最も優れていると思います。

まあ、リーダブルコードの受け入りですが^^


それでは、また!

Go記事まとめ

デザインパターンまとめ

Go記事をまとめます。

ソースコード

proxy.go

proxy_test.go

コメントを残す