ホームページ > ウェブフロントエンド > jsチュートリアル > フォームオブジェクトに対するケース

フォームオブジェクトに対するケース

DDD
リリース: 2025-01-17 00:31:13
オリジナル
115 人が閲覧しました

A case against form objects

注: この説明では Ruby on Rails の例を使用しますが、中心となる概念は他の言語やフレームワークにも広く適用されます。

フォームオブジェクトの問題: 重要な検討

Web アプリケーション開発における「フォーム オブジェクト」という曖昧になりがちな概念を明確にしましょう。 さまざまな記事 (以下にリンク) や実際の経験に基づくと、フォーム オブジェクトには普遍的に合意された定義と目的がありません。 彼らの役割は次のように説明されることがよくあります:

  • データ検証: ユーザー入力を検証する単純な Ruby オブジェクト。
  • モデル集約: 複数のモデルからのデータを表す仮想モデル。
  • 強力なパラメータ置換: 入力サニタイズ用の強力なパラメータの代替です。
  • コールバック リファクタリング: モデルのライフサイクル コールバックを再編成する手段。
  • form_for ヘルパー: Rails の form_for ヘルパーで使用するために特別に設計されたオブジェクト。

主な目標は、パラメータ処理、型強制、および基本的な検証を処理することによってコントローラを簡素化することとしてよく挙げられます。 また、単一のフォーム送信から複数の ActiveRecord モデルへの更新をカプセル化するためにも使用され、コントローラーに慣れ親しむために ActiveRecord の動作を模倣します。 これらは、複雑な動作を管理する方法として提示されています。

フォーム オブジェクトを使用する理由意図された利点:

想定される利点は次のとおりです:

  • デカップリング: ビジネス ロジックをコントローラーやモデルから分離します。
  • ビュー ヘルパー: 複雑なフォーム要素 (選択フィールドのオプションなど) のヘルパー メソッドを提供します。
  • Rails 規約の遵守: 単一の ActiveRecord モデルに直接マッピングされない複雑なフォームを簡素化します。

しかし、明確な定義がないと、コミュニケーション不足という最初の大きな問題が生じます。コードベースでフォーム オブジェクトに遭遇した場合、それらがこれらの役割 (またはその組み合わせ) のどれを満たすのかは不明です。

本質的に、フォーム オブジェクトは、通常はモデル層やコントローラー層内で責任を集中化することで、コードの複雑さをリファクタリングすることを目的としています。 しかし、これは 2 番目の問題、意図しない肥大化につながります。

欠点: 「ファット フォーム オブジェクト」アンチパターン

一般的な実装を考えてみましょう:

<code class="language-ruby">class SomethingController
  def create
    @form = MyForm.new(action_params)
    if @form.valid?
      @form.save!
      redirect_to "somewhere"
    else
      render :new
    end
  end
  def new
    @form = MyForm.new
  end
end</code>
ログイン後にコピー
ログイン後にコピー

この一見単純なアプローチには、重大な問題が隠されています。 フォーム オブジェクトのパブリック API (newvalid?save!、およびビュー内のその存在) は、次の処理を明らかにします。

  • パラメータ解析: リクエスト パラメータの理解と変換。
  • 検証: パラメーターのタイプと検証ルール (ビジネス ロジック) を理解します。
  • 永続性: データを作成および永続化する方法 (データベースとの対話) を理解します。
  • ビュー ロジック: ビュー関連のロジック (フォーム要素のヘルパー メソッド) を保持する可能性があります。

これは単一責任の原則に違反します。 フォーム オブジェクトはさまざまな懸念事項のリポジトリとなり、時間の経過とともにより多くの責任 (追加のビュー ヘルパー、検証ルールなど) を引きつけます。 それは、それが解決しようとしていた問題そのものを反映する「ファットフォームオブジェクト」に進化します。

3 番目の問題: 冗長性

さらに重要な懸念は、これらの責任がすでに他のコンポーネントによって処理されていることが多いということです。

  • 永続性: これはモデルの責任です。 機能を複製するのではなく、モデルに委任します。
  • ビジネス ロジック: 複雑なビジネス ロジックにはサービス オブジェクトを使用します。
  • 入力検証: 検証ライブラリ (ActiveRecord::Model、Scrivener、ドライスキーマ) を使用します。
  • ビュー ヘルパー: ビュー モデルまたはプレゼンターを使用します。

中規模から大規模のアプリケーションでは、これらのコンポーネントはおそらくすでに存在します。重複する責任を持つフォーム オブジェクトを導入すると、不必要な複雑さとアーキテクチャ上の曖昧さが追加されます。 複雑さは曖昧にするのではなく、直接対処する必要があります。

提案された代替案: よりモジュール化されたアプローチ

より構造化されたアプローチでは、各責任に専用のオブジェクトを使用します。

<code class="language-ruby">class SomethingController
  def create
    @form = MyForm.new(action_params)
    if @form.valid?
      @form.save!
      redirect_to "somewhere"
    else
      render :new
    end
  end
  def new
    @form = MyForm.new
  end
end</code>
ログイン後にコピー
ログイン後にコピー

このアプローチの利点:

  • 明確な責任: 各オブジェクトには、明確に定義された単一の目的があります。
  • テスト容易性: 個々のコンポーネントのテストがより簡単かつ迅速になりました。
  • 保守性: コード構造と保守性が向上しました。

結論:

フォーム オブジェクトは本質的に悪いものではありません。賢明に使用すると、有益な効果を得ることができます。 ただし、定義が曖昧であり、責任が肥大化する傾向があるため、慎重に検討する必要があります。 フォーム オブジェクトを導入または使用する前に、既存のコンポーネントが必要な機能をすでに処理しているかどうかを検討してください。 複雑さが存在する場合は、不十分に定義された「フォーム オブジェクト」内に隠すのではなく、明確に定義された単一目的のオブジェクトを通じてそれを受け入れます。

リンクされた記事 (わかりやすくするために再フォーマットされています):

  • 太い ActiveRecord モデルをリファクタリングする 7 つのパターン
  • 規律ある Rails: フォーム オブジェクトのテクニックとパターン — パート 1
  • RubyOnRails の必須パターン — パート 4: フォーム オブジェクト
  • ActiveModel フォーム オブジェクト
  • フォーム オブジェクトを使用してコントローラーを薄く保つ方法
  • Ruby on Rails でのフォーム オブジェクトの使用
  • フォームオブジェクトの検証
  • ActiveModel を使用したフォーム オブジェクトの作成
  • フォーム オブジェクトを使用してコードをリファクタリングします

以上がフォームオブジェクトに対するケースの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート