-
Posted by honda28 on 2021-09-02T01:56:31.948Z Angular 歴1ヶ月ほどの初心者です。現在他者が作成したアプリケーションのコードを読んでおり、表記の疑問が出たので質問させてください。 【質問】サービス内でデータの Http リクエストを送って返ってきたレスポンスの処理まで行うのは不適切ですか? 【詳細】私が読んでいるコードでは、コード例の api.service.ts のようにサービス内では、Observable レスポンスを渡すまでとなっており、app.component.ts にて subscribe して処理が行われています。 そのようなコードだと、同じサービスを使用するコンポーネントすべてで処理を書く必要があり、冗長に感じました。例えば、上記リンクのコードを以下のように修正すればコンポーネント側ではサービスのメソッドを使用するだけでよく、シンプルなコードになると思いました。 [api.service.ts]
[app.component.ts]
このような書き方は不適切でしょうか?また「①サービスがレスポンスを返すまでとする」、「②サービスがレスポンスの処理まで行う」のどちらが適切かに関わらず、それぞれのメリット・デメリットもわかる方がいればご教授いただけると幸いです。 |
Beta Was this translation helpful? Give feedback.
Replies: 12 comments
-
Posted by rdlabo on 2021-09-02T03:05:21.998Z サンプルコードはエンドポイントの同一レスポンスを使いまわしたい時にはよくします。これをすると、2回目からのリクエストはエンドポイントにアクセスしなくていいので、高速化、またサーバへの負荷軽減が見込めるのでいいですよね。 質問の「Serviceでどこまで処理をするか」についてですが、私は ・共通化できない部分があればそれはComponentsで処理する というルールで処理しています。Serviceは細かくファイルを句切ればあまりFatになりませんが、Componentsは複雑な処理をするとすぐに行数が膨れ上がってるので、Serviceにおいた方が見通しがいい構成になることが多いです。 |
Beta Was this translation helpful? Give feedback.
-
Posted by lacolaco on 2021-09-02T03:43:30.606Z ある処理をサービスでやるかコンポーネントでやるかについては、その処理がユースケースに依存するかどうかで考えることが多いです。 たとえばバックエンドから返ってくるUserのJSONがフロントエンドで扱いにくいために整形したオブジェクトにする、ということならそれはフロントエンドの中でそのデータを「何に使うか」に依存しないので、サービスに含めています。 結局そのサービスの責務の切り方は?ということになるので、 |
Beta Was this translation helpful? Give feedback.
-
Posted by honda28 on 2021-09-02T04:20:33.375Z rdlabo さん、迅速で丁寧なご回答ありがとうございます。 質問の時点では「コードのわかりやすさやメンテナンス性」という観点しかなかったので、「高速化やサーバの負荷軽減」というメリットには気づいていませんでした。ご教授いただき、ありがとうございます。 私が現在読んでいるコードでは、用途に合わせて API 自体が細かく分けられています。ですので、今回のコードに関しては共通化できそうなので、自身が始めに思ったようにサービス内で処理までを行おうかと思います。 |
Beta Was this translation helpful? Give feedback.
-
Posted by akai on 2021-09-02T04:37:22.859Z 主題からは離れてしまうのですが、本コードはおそらくバギーなコードになっています。
提示されたコードのように処理を分けるのであれば、 サンプルコードでは、 主題の |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
Posted by honda28 on 2021-09-02T04:49:16.732Z akai さん、ご回答ありがとうございます。 たしかに仰るとおりですね、ご指摘ありがとうございます。本筋に関わらないため意図的にこのようにしたわけではなく、単純に気づいていませんでした。今後同様の処理を行う際にハマる可能性もあるので、事前に教えていただけてとても助かりました。 下記のように、
|
Beta Was this translation helpful? Give feedback.
-
Posted by akai on 2021-09-02T05:20:26.272Z api.service.tsのget関数が返す値はPromiseではないので、そのままではasync/awaitは利用できません。 ちなみに、よくあるのは以下のようなイメージですかね。 [api.service.ts]
[app.component.ts]
|
Beta Was this translation helpful? Give feedback.
-
Posted by honda28 on 2021-09-02T05:49:30.457Z akai さん、ご丁寧にありがとうございます。 仰るとおり、Observable を サービス内で処理を行うのであれば、さらに |
Beta Was this translation helpful? Give feedback.
-
Posted by akai on 2021-09-02T06:01:01.468Z
そのようになります。 また、then/catchを利用せずに、RxJSを利用して複雑な実装を行うことも可能です。
|
Beta Was this translation helpful? Give feedback.
-
Posted by lacolaco on 2021-09-02T06:07:46.531Z
はい、それならサービスの名前と責務が一致していてメンテナンスしやすいのではないかと思います。 さらに、 |
Beta Was this translation helpful? Give feedback.
-
Posted by honda28 on 2021-09-02T06:12:11.490Z akai さん、丁寧なご回答ありがとうございます。 RxJS を利用するとそんなに便利なこともできるんですね、とても勉強になりました!コードとしても非常に見やすいですし、ぜひ参考にさせていただこうと思います! |
Beta Was this translation helpful? Give feedback.
-
Posted by honda28 on 2021-09-02T06:31:57.185Z lacolaco さん、丁寧なご回答ありがとうございます。 認識が合っていたようで安心しました。またサービスの共通部分をさらにサービスとして分ける( こちらのコミュニティでの初の質問でしたが、多くの方から丁寧かつ勉強になるコメントをたくさんいただくことができ、非常に助かりました。lacolaco さんはコミュニティ管理者の方とのことですので、ぜひとも引き続きこの良いコミュニティの管理を続けていただければと思います。私も回答者側になれるように勉強したいと思います。本当にありがとうございました。 |
Beta Was this translation helpful? Give feedback.
Posted by rdlabo on 2021-09-02T03:05:21.998Z
サンプルコードはエンドポイントの同一レスポンスを使いまわしたい時にはよくします。これをすると、2回目からのリクエストはエンドポイントにアクセスしなくていいので、高速化、またサーバへの負荷軽減が見込めるのでいいですよね。
質問の「Serviceでどこまで処理をするか」についてですが、私は
・共通化できない部分があればそれはComponentsで処理する
・それ以外はすべてServiceで行う
というルールで処理しています。Serviceは細かくファイルを句切ればあまりFatになりませんが、Componentsは複雑な処理をするとすぐに行数が膨れ上がってるので、Serviceにおいた方が見通しがいい構成になることが多いです。