質問: 背景 -- AngularでWebアプリを作ろうとしています。 緯度経度などの地理情報の便利計算サイトのようなものです。 Angular, TypeScriptについては素人(公式チュートリアルを一通り終えた程度)です。 質問 -- 例ですが、以下のような緯度経度に関する計算を司るモジュール(関数群)の実装が必要です。 * 緯度経度で与えられる2地点間の直線距離を計算する関数 * 緯度経度で与えられる基準地点から、与えられた距離だけ平行移動した地点の緯度経度を計算する関数 * 上記関数群を統一的・効率的に実装するための型やインターフェースの定義 **これらは基本的にWebとは無関係なので、Angularのcomponentやserviceとして実装するのはおかしい**と感じています。 しかしこの場合、**Angularプロジェクトディレクトリ内のどこのファイル・ディレクトリに実装するのが一般的なのでしょうか?** `src`ディレクトリ以下の階層はコンポーネント志向のコードが格納されると理解しています。 かといって`src`と同じ階層に手動で適当なディレクトリを作っていいものか、よく分かっておりません。 参考 -- Angularの標準的なディレクトリ構成(`ng new`コマンドで作成したプロジェクト) ``` . ├── angular.json ├── browserslist ├── e2e ├── karma.conf.js ├── node_modules ├── package.json ├── package-lock.json ├── README.md ├── src │ ├── app │ ├── assets │ ├── environments │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── styles.css │ └── test.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json ```
回答: 前置きをさせていただきますと、ある程度、使用者達の傾向や、CLIを使っている以上、その方が、構築しやすい、などはありますが、最終的には正解はなく、作成者の自由ということはご承知おきください。 (つまり本回答も、ただの一つの案に過ぎないということ) > > ・外部にNPMライブラリとして公開する予定はない。あくまで自サイト内でのみ使用するライブラリ。 > > > を踏まえて回答させていただきます。 > > これらは基本的にWebとは無関係なので、Angularのcomponentやserviceとして実装するのはおかしいと感じています。 > > > たとえそうであっても、Angularを使う以上、Angularは**compornent指向**であるため、(言語ではなく、フレームワーク自体がコンポーネント指向ということ) **compornent**を中心に構築すべきですし、そちらの方が、自然に、かつ機能的な構築が可能です。 よって、今回の機能を作成するには、`service`で構築するのが一番妥当でしょう。 ディレクトリを綺麗にしたいなら、 `app/services/`といった風にディレクトリを作り、その中に各`service`を展開していくのがいいかと。 Angularはもちろん、その枠組み外のライブラリなどを読み込むことは可能です。 ただし、インポートがやりずらかったり、そのライブラリの機能を、Angular内で使うには、設定やらないし、毎回手で各コンポーネントで仕様を記述しなければいけなくなる、など、けっこう厄介です。 (かくいう私も同じことをやろうとして、様々格闘した挙句、これserviceでいいじゃん・・・って結論になった経験があるので) それであれば、Angularの枠組み内で機能を作成した方が、手間も少ないですし、 最終的にコンポーネントに落とし込むのも、自然にできるのでそちらのほうがいいかと。 逆に、最終的にはWebページで使うが、直接Webページで使うわけではないが様々な処理をするために、Angularの枠組み内で機能を提供するのが、**serviceという機能**と推察されます。