プログラムの話でserviceについての質問です。
一般的にMVCモデルの一連の流れはC→M→Vですが、serviceなるものを作って、C→S→M→Vとしているところがたまにあります。
C→M→Vと書きましたが細かく話すと、CはMからデータを受けとりCがVにデータを渡す。
MがVに渡すわけではないので、厳密には、C→M→C→Vということになります。
C→S→M→Vの場合こうなってます。
CはSを呼び出し、SはMからデータを受けとり形成、その結果を受け取ったCがVにデータを渡す。
なので、C→S→M→S→C→Vになります。
で、このSですが、どういうときに作るべきなのでしょうか?
レビューでたまに「なんでサービス作ってないの?」って言われることがあります。
逆に「なんでサービスなんか作らないといけないんだ」と思うわけであります。
どういうときにサービスが必要かをご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答2件
8
CはSを呼び出し、SはMからデータを受けとり形成、その結果を受け取ったCがVにデータを渡す。
なので、C→S→M→S→C→Vになります。
このことから、ここで言っているサービスは、汎用処理を担うサービスクラスではなく、アプリケーションをレイヤ化した時のサービス層
のことだと考えます。
サービスという言葉は曖昧で、ここは混在されがちなので、まずここはレビューされる方と共通認識を持たれたほうが良いかと思います。
で、このSですが、どういうときに作るべきなのでしょうか?
サービス層の前提で記載しますが、大規模な業務アプリケーション(例えば銀行のシステム等)を開発する時はだいたいこの層を設けます。
理由は大規模な業務アプリケーションだけに業務ロジックが複雑
だからです。
各層の役割を明確にし、単一の責任を持たせ、見通して良くして保守性や可読性を向上させる目的
があります。
上記の目的から、このサービス層を設ける時は、業務データへのアクセスにリポジトリというデータアクセスにフォーカスした層を設けるのが一般的です。また、この時ModelはEntityと呼ばれることがあります。
Service、Model、Repositoryはアプリケーションのコアとなる層であり、システムの実体や関連性(ビジネス)を表現することから、これらをまとめてドメイン層と呼ばれることがあります。
この時各層の責任分界点はプロジェクトによって異なりますが、だいたい以下のようになります。
Controller
- リクエストのルーティング
→フレームワークでRoutingサービスに委譲することが多い
- リクエストデータに対する単項目や相関項目チェック
→フレームワークでValidationサービスに委譲することが多い
- セッション管理
- リクエストをServiceに適切な状態(Model、Entity等)に変換する処理
- 処理結果をViewに適切な状態に変換する処理
→Controllerをより薄くするためにPresenterに委譲することもある
Service
- ビジネスルールに関わる処理
→例えばECで言うと、在庫がないと注文を確定できない等、ビジネスルールに即して注文確定させるような主処理
Repository
- 業務データへのアクセス
ざっくりな分類ですが、上記を見て、Controllerの役割が多いことにお気づきでしょうか。
本来、Controllerで行うべき多くの処理をフレームワークが各サービス(ここで言っているサービスはサービス層ではない方)に委譲してくれているので、フレームワークを利用するとControllerでやるべきことが少なくなります。
故に、フレームワークを使って、比較的小規模なアプリケーションや業務ロジックがそこまで複雑でないアプリケーションを作る時は、わざわざ新しい層を作るのが面倒なので、この薄くなったControllerに大半の処理を書く人が多いのかと思います。
大規模な業務アプリケーションで利用する言語(Java等)では、言語の特性やフレームワークによるサポートによってアプリケーションのレイヤ化がしやすくなっていますが、PHPもそれに近づいてきていると実感しています。
実際にPHPを代表するSymfonyフレームワークでも、Javaの仕組みをPHPに適応させることでPHPをより良くしていくと言っています。
昨今の変化が激しい時代に、長い目で見て変更に強いアプリケーションを作る
のであれば、上記の様にサービスを設けてドメイン層を切り出すというアプローチを取るのも良いかと思います。
ただ、考え方を見直したり、作成するクラス数も増加しますので、検討が必要です。
大事なのは、先人たちが考え出した様々アーキテクチャ(DDD, Clean Architecture, MVVM等)を知って、開発するシステムの特性によってアーキテクチャ使いわけることが重要
だと考えます。
投稿2018/02/05 07:17
総合スコア4256
2
ベストアンサー
「なんでサービスなんか作らないといけないんだ」をレビュワーに確認してはいかがでしょうか。
プロジェクトによりコーディングの規約なども違います。
そのレビュワーはプロジェクトの規約や主旨を理解した上で「なんでサービス作ってないの?」という指摘をしているのでは、と思います。
必要ないと思うのであればそのレビュワーときちんと相談した上で方針を決めるべきです。
一般的な意見で良ければ、下記の質問(stackoverflow)などが参考になるかと。
投稿2018/02/05 04:29
総合スコア80598
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
2018/02/05 05:35
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
意見交換
クローズ
HTMLファイル一つでどこまでできるのか
回答20
クリップ0
更新
2023/05/27
意見交換
受付中
Python経験2年からゲームプログラマーになるためには
回答18
クリップ2
更新
2023/05/31
意見交換
クローズ
プログラミングの設計が分からない
回答24
クリップ11
更新
2023/04/17
Q&A
解決済
Uriの中身(存在)チェックのやり方について
回答2
クリップ0
更新
2023/05/26
意見交換
受付中
大規模言語モデル ファインチューニングの方法
回答4
クリップ0
更新
2023/06/02
Q&A
解決済
SQLiteで正規化されたDBにデータを追加したい
回答1
クリップ0
更新
2023/05/21
意見交換
受付中
データ分析、機械学習や人工知能にPythonが使われている理由に関して。
回答9
クリップ2
更新
2023/06/01
Q&A
解決済
Ajax成功時の部分ビューの更新 (ASP.NET Core MVC)
回答1
クリップ0
更新
2023/06/01
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。