window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() Railsでユースケースパターンを適用する - The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2022-04-05
ソフトウェア開発

Railsでユースケースパターンを適用する

ニコラ・ニソリア

Railsを使っているときによくある問題は、機能のロジックをどこに配置するかということです。

ロジックは多くの場合、コントローラやモデル、あるいは運が良ければサービスオブジェクトに配置される。では、サービスオブジェクトがあるのなら、なぜユースケースが必要なのでしょうか?

この記事で、このパターンの利点を発見しよう。

ユースケース

定義

ユースケースとは、ゴールを達成するための、役割とシステム間の相互作用を定義する、アクションまたはイベントステップのリストである。

このパターンがさまざまな形で応用され、別の呼び名もあることは特筆に値する。例えば インターアクター, オペレーター または コマンドしかし ルビー コミュニティ ユースケース.すべての実装は異なるが、目的は同じである。

たとえ プロジェクト を使って要件を定義しているわけではありません。 ユースケースこのパターンは、ビジネス・ロジックを実用的な方法で構造化するのに役立つ。

ルール

私たちの 使用例 でなければならない:

  • フレームワークにとらわれない
  • データベースに依存しない
  • ひとつのことだけに責任を持つ(ユーザーの目標を達成するためのステップを定義する)

メリット

  • 読みやすさ:ステップが明確に定義されているため、読みやすく理解しやすい。
  • デカップリング:コントローラやモデルからロジックを移動し、新しい抽象化レベルを作成する。
  • 可視性:コードベースは、システムで利用可能な機能を明らかにする。

実践へ

私たちのシステムで何かを購入したいユーザーを例にとってみましょう。

モジュール UseCases
  モジュール Buyer
    クラス Purchase
      def initialize(buyer:, cart:)
        買い手 = 買い手
        カート = カート
      終了
      def call
        return unless check_stock
        return unless create_purchase
通知 end
プライベート
      attr_reader :buyer, :cart
      def check_stock
        Services::CheckStock.call(cart: cart)
終了
      def create_purchase
        Services::CreatePurchase.call(buyer: バイヤー, cart: カート).call
      終了
      def notify

         Services::NotifyBuyer.call(buyer: バイヤー)
       end
     終了
   終了
 終了

ご覧のように コード 例として ユースケース Purchaseと呼ばれます。パブリック・メソッドは コール.callメソッドの内部には、購入を行うための基本的なステップがあり、すべてのステップはprivateメソッドとして定義されています。すべてのステップはサービスオブジェクトを呼び出しています。 ユースケース は購入を行うためのステップを定義しているだけで、ロジックそのものを定義しているわけではありません。これにより、私たちのシステムで何ができるのか(購入をする)、そしてそれを達成するためのステップが明確になります。

これで、最初の ユースケース コントローラーから

クラス コントローラ
  購入
    UseCases::Buyer::Purchase.new(
      buyer: purchase_params[:buyer]、
      cart: purchase_params[:cart].
    ).call

    ...
  終了

  ...
終わり

この観点から ユースケース はサービス・オブジェクトによく似ているが、目的は異なる。サービス・オブジェクトは低レベルのタスクを実行し、データベースのようなシステムのさまざまな部分と相互作用します。 ユースケースの作成 新しいハイレベルの抽象化であり、論理的なステップを定義している。

改善点

最初の ユースケース は機能しているが、もっと良くなるかもしれない。どうすれば改善できるだろうか?を活用しよう。 ドライ 宝石。今回は ドライトランザクション.

まず、ベース・クラスを定義しよう。

クラス UseCase
  include Dry::Transaction

  クラス << self
    def call(**args)
      new.call(**args)
    終了
  end
エンド

これにより、UseCaseトランザクションに属性を渡して使用することができるようになります。これでPurchaseユースケースを再定義する準備が整いました。

モジュール UseCases
  モジュール Buyer
    クラス Purchase
      def initialize(buyer:, cart:)
        買い手 = 買い手
        カート = カート
      終了

      def call
        return unless check_stock
        return unless create_purchase
        通知
      終了

      プライベート

      attr_reader :buyer, :cart

      def check_stock
        Services::CheckStock.call(cart: cart)
      終了

      def create_purchase
        Services::CreatePurchase.call(buyer: バイヤー, cart: カート).call
      終了

      def notify
        Services::NotifyBuyer.call(buyer: バイヤー)
      end
    終了
   終了
 終了

この新しい変更により、ステップがどのように定義されているかが明確になり、各ステップの結果をSuccess()とFailure()で管理できるようになった。

コントローラで新しいユースケースを呼び出し、最終結果に応じてレスポンスを準備する準備ができました。

クラス コントローラ
  def購入
    UseCases::Buyer::Purchase.new.call(
      buyer: purchase_params[:buyer]、
      cart: purchase_params[:cart].
    ) do |result|
      result.success do
        ...
      終了
      result.failure do
        ...
      終了
    終了

    ...
  終わり

  ...
終わり

この例は検証によってさらに改善できるが、このパターンの威力を示すにはこれで十分だ。

結論

正直に言おう。 ユースケースパターン はとてもシンプルで、サービス・オブジェクトによく似ていますが、この抽象化レベルはアプリケーションに大きな変化をもたらします。

新しい開発者がプロジェクトに参加し、use_casesフォルダを開くことを想像してみてください。第一印象として、彼はシステムで利用可能なすべての機能のリストを持ち、1つのユースケースを開いた後、彼はロジックに深く入ることなく、その機能に必要なすべてのステップを見るでしょう。この秩序とコントロールの感覚は、このパターンの大きな利点です。

これを道具箱に入れておけば、もしかしたら将来、有効活用できるかもしれない。

関連記事

ソフトウェア開発

パックワークによるRuby on Railsのモジュール化 エピソード1

人間は、多くの時間と労力を割かなければ、問題の全体像を把握することが難しい。これは特に、大規模で複雑なアプリケーションを扱っているときに起こる......。

ニコラ・ニソリア
ソフトウェア開発

Packwerk Episode IIによるRuby on Railsのモジュール化

Packwerkを使ったRuby on Railsモジュール化の第2回では、パッケージとしてのアプリケーションのコンセプトを詳しく見ていこう。

ニコラ・ニソリア
ソフトウェア開発

レールおよびその他の輸送手段

Railsは、迅速なアプリケーション開発に焦点を当てたRack互換フレームワークです。しかし残念なことに、「すべてを箱から出す」というアプローチとRails流の盲目的な動作は、しばしばアプリケーションコードの品質を低下させ、...

The Codest
クシシュトフ・ブシェビッチ シニア Software Engineer

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

    jaJapanese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek jaJapanese