Rails アプリケーションが複雑になるにつれて、クリーンで読みやすく、保守しやすいコードを維持することが重要になります。これを達成する効果的なアプローチの 1 つは、サービス オブジェクトを使用してコードベースをリファクタリングすることです。サービス オブジェクトは、複雑なビジネス ロジックをモデルまたはコントローラーから個別のクラスに抽出するのに役立ち、組織化、テスト容易性、再利用性の向上を促進します。この記事では、サービス オブジェクトを使用して Rails アプリケーションをリファクタリングするプロセスを検討し、その利点を示す実践的な例を示します。
問題の特定: リファクタリング プロセスを開始するには、複雑なロジックが含まれているか、単一責任原則 (SRP) に違反しているコードのセクションを特定することから始めます。ユーザーの作成、検証、通知を処理する UserController を備えた Rails アプリケーションがあると仮定します。
サービス オブジェクトの抽出: このコードをリファクタリングするには、ユーザーの作成と通知に関連する複雑なロジックを別のサービス オブジェクトに抽出します。 app/services ディレクトリの下に user_creation_service.rb という新しいファイルを作成します。サービス オブジェクトがどのようになるかの例を次に示します。
#app/services/user_creation_service.rb
クラスUserCreationService
def 初期化(user_params)
@user_params = ユーザーパラメータ
終わり
def create_user
ユーザー = User.new(@user_params)
user.save の場合
send_notification(ユーザー)
真実
それ以外
間違い
終わり
終わり
プライベート
def send_notification(ユーザー)
# ユーザーに通知を送信するためのロジック
終わり
終わり
UserController の更新: UserController で、複雑なロジックをサービス オブジェクトの呼び出しに置き換えます。更新方法の例を次に示します。
#app/controllers/users_controller.rb
クラス UsersController < ApplicationController
デフォルト作成
user_service = UserCreationService.new(user_params)
if user_service.create_user
redirect_to root_path、注意:「ユーザーは正常に作成されました!」
それ以外
レンダリング:新規
終わり
終わり
プライベート
デフォルトのuser_params
params.require(:user).permit(:name, :email, :password)
終わり
終わり
サービスオブジェクトのテスト: サービス オブジェクトは分離して簡単にテストでき、抽出されたロジックの正確性を確認できます。 UserCreationService クラスのテストを作成し、必要に応じて依存関係をモックします。例えば:
#spec/services/user_creation_service_spec.rb
「rails_helper」が必要
RSpec.describe UserCreationService do
'#create_user' を説明します
「ユーザーを作成して通知を送信」します
user_params = { 名前: 'John Doe'、メールアドレス: '[email protected]'、パスワード: 'password' }
user_service = UserCreationService.new(user_params)
Expect(user_service.create_user).to be true
Expect(通知).to have_received(:send).with(instance_of(User))
終わり
「ユーザーの作成が失敗した場合は false を返します」
# テスト失敗例
終わり
終わり
終わり
結論:
リファクタリングすることで、 Railsアプリケーション サービス オブジェクトを使用すると、複雑なビジネス ロジックを効果的に分離し、コード構成を改善し、テスト容易性を向上させることができます。提供されている実践的な例は、ユーザー作成および通知ロジックをサービス オブジェクトに抽出するプロセスを示しており、その結果、コードがよりクリーンで保守しやすくなります。サービス オブジェクトの力を利用して Rails アプリを合理化し、モジュール式でスケーラブルなコードベースの利点を活用してください。