ハピタスの「カテゴリーランキング」の新機能にStrategyパターンで実装してみた。
はじめに
株式会社オズビジョン ハピタス事業部 開発グループ所属の李です。
ハピタスのトップページにおける新機能「カテゴリーランキング」の開発において、私たちは「Strategyパターン」を学び、その理念を実装に応用しました。この記事では、「Strategyパターン」を用いて新機能を開発する過程について共有いたします。
Strategyパターンの採用理由
「カテゴリーランキング」の要件を確認すると、10個のカテゴリーそれぞれに合致するランキングを表示する必要がありました。初めは、このランキングに対して、以下のようなswitch-case文を用いて実装しました。
switch ($category) {
case category1:
// category1処理
break;
case category2:
// category2処理
break;
// ... 他のカテゴリーについても同様に記述
case category10:
// category10処理
break;
}
switch-case文を使用することで、上記のようなコードが生まれました。コードの省略があるため、簡潔に見えるかもしれません。省略されたコードを簡単に説明すると、基本各カテゴリー案件の中で、一定期間中に利用数が高い案件を探します。(一部例外があります。)その中で「特定フラグ」、「除外条件」、「カテゴリーの大分類&小分類連係」など複雑な条件があります。カテゴリ毎に条件が異なるので抽出処理が複雑であります。期間や要件によって、新しいカテゴリーランキングが追加されたり、既存カテゴリーがなくなる可能性があるので、メンテナンスや運用の観点で考える必要がありました。そこで、「もっとスマートな方法はないか?」と考えたところ、「Strategyパターン」の活用についてのレビューコメントが提案されました。その後、「Strategyパターン」の調査を行い、開発と運用の効率性向上が期待できることから、このパターンを採用することを決定しました。このパターンを採用することで、以下の利点が期待されました。
-
可読性の向上: Strategyパターンは、異なる戦略(Strategy)をクラスとして抽象化し、それぞれの戦略を別々のクラスに分ける方法です。これにより、コードが簡潔で理解しやすくなりました。
-
保守性の向上: 新しいカテゴリーの追加や既存カテゴリーの変更が容易になりました。新しい戦略を追加するだけで済み、既存の戦略に変更があっても他の部分への影響を最小限に抑えられます。
-
拡張性の向上: Strategyパターンを使用することで、新しい戦略を追加し、既存の戦略を変更することが容易になりました。これにより、要件の変更に柔軟に対応できます。
-
効率性の向上: 各戦略を最適化することが容易になり、実行時の性能向上が期待できます。
-
運用の簡素化: Strategyパターンを用いたコードは運用と保守が容易であり、エラーの発生リスクが低減します。
以上の理由から、Strategyパターンの導入が採択され、コードの品質、保守性、拡張性、効率性、運用性の向上が期待されています。この決定により、より洗練されたアーキテクチャが実現し、開発プロセスが改善されると思われます。
クラス図
Strategyパターンによる実装
interface CategoryInterface
{
public function getItems();
}
各カテゴリーに対応するための共通インターフェースCategoryInterface
を定義し、getItems()
メソッドを使用してランキング情報を取得します。
class Category1 implements CategoryInterface
{
public function getItems()
{
// ... 省略
}
}
各カテゴリーに関連する処理を記述します。
//context
$items = $strategy->getItems();
最後に、コンテキスト内で必要なカテゴリーのメソッドを呼び出します。
結果画面
https://hapitas.jp/#category-tabs (登録・ログインが必要です)
上記の画像のように、ユーザーが各カテゴリーを選択すると、そのカテゴリーに対応するランキング情報が表示されるようになりました。
まとめ
「Strategyパターン」を理解し、ハピタスの「カテゴリーランキング」新機能を実装しました。このパターンは新しいプログラミング言語でも容易に適用でき、試す価値があると考えています。
Discussion