web-dev-qa-db-ja.com

Javaでクラスとパッケージに名前を付ける最良の方法

CamelCase、PascalCaseなどを使用するためのコード規則のほかに、Javaでパッケージとクラスに名前を付けるための規則はありますか?

たとえば、mvcプロジェクトがあり、メインパッケージはcom.myprojectです。このパッケージには次のものが含まれます。

  1. com.myproject.model
  2. com.myproject.view
  3. com.myproject.controller。

これらの3つのパッケージのクラスに名前を付けるための規則またはベストプラクティスはありますか?パッケージ1のように、クラス名のモデルを避けますか、このようなものですか?そして、私がユーザーのように同じクラス名を使用したい場合、何が良いですか:UserModel、UserView、UserControllerを使用するか、または3つのクラスに同じ名前を付けますか?これを行うための何らかのベストプラクティスまたは命名規則はありますか?

6
Liz Lamperouge

短い答え:2つのクラスに同じプロジェクト/ライブラリ/コンテキストで同じ名前を付けることはお勧めできません。

明らかな不便さはさておき、なぜそれが良い考えではなく、提案されたパッケージの名前付けでもないというより深い点があります。開発者としての私たちには、モデル化ビジネス問題の責任があり、命名用語はこの事実を反映する必要があります。これは、ドメイン駆動設計の要点です。

テクノロジー、パターン、アーキテクチャなどに関心があるため、テクノロジーを実際の機能より上に置くことは私たちにとって論理的かもしれませんが、モデルの表現力や保守性が低下します。

私のポイントは:パッケージ名とクラス名はビジネスコンセプトを反映する必要がありますmodelviewcontrollerパッケージがあってはならず、UserModelUserControllerクラスなどがあってはなりません。

テクノロジーではなく問題をモデル化!ビジネス要件から直接適切な抽象化を見つけ、MVCを使用しているという事実など、実装の詳細を非表示にします。

13

一般に、同じプロジェクト内の複数のクラスに同じ名前を付ける(パッケージではなくproject)ことはお勧めできません。発生する可能性のある悪いことの中でも、これらを相互に参照する必要がある場合、たとえば、新しいユーザーを作成するときにインスタンス化しようとしている「ユーザー」が不明確になります。

MVCでは、私が通常見ている方法では、パッケージにcom.MYNAME.PROJECTNAMEという名前が付けられ、各モジュールに.MODULENAMEが追加されます(この場合、「モデル」、「ビュー」、「コントローラー」など)。

クラスの場合、クラス名はクラスが何であるかを示す必要があります。それがユーザーオブジェクトのコントローラーの場合は、UserControllerと呼ぶ必要があります。これは、パッケージが「コントローラー」モジュールであっても当てはまります。 IDEでコードを確認するとき、特定のファイルについてどのパッケージを確認しているのかを間違えたり、忘れたりすることがよくあります。

1
Ertai87

命名規則はほとんどの場合、開発者またはチームにほとんど任されています。私個人としては、Javaで作業する場合、Oracleを通じて公開された情報にほぼ常に依存してきました。

http://www.Oracle.com/technetwork/Java/codeconventions-135099.html

より直接あなたの質問に関連している、もしあなたが3つすべてのパッケージに「Person」と呼ばれるクラスを持ちたいなら、それは許されるでしょう。これらのパッケージをどこかに含めて実際にそのクラスを使用したい場合、その場所が良いアイデアであるかどうかはわかりません。

たとえば、「com.myproject.model」などのパッケージ名を見ると、「Person」や「Order」など、他に「Model」というクラスがあるのはなぜですか。

多分私は質問を誤解しているかもしれませんが、次の疑似コードのようにこのように使用することは私にとってより論理的な意味があります:

com.myproject.model.Person x = new com.myproject.model.Person();
1
RobertMcAtee

言語に関係なく、具体的にはJavaで、多かれ少なかれこれらのガイドラインに従ってください。

  1. 名詞(Printer、Controller、Mailbox、Manager、Handler)にちなんで名付けられたクラス、つまり、問題のドメインで意味をなすというエンティティを意味します。
  2. 形容詞としてのインターフェース(Iterable、Serializable、Secured、Asynchronous)、つまり、そのインターフェースを実装するエンティティの機能または特性。
  3. 動詞、場合によっては副詞または副詞句、アクションを説明する意味のあるメソッド(実行、配信、検証
  4. 一緒にいることに意味のあるもののグループとしてのパッケージ(ここでも、これは問題のドメインに非常に強く結びついています。)

これらの一般的なガイドライン(ルールではなく、ガイドラインまたは提案)を超えて、具体的な問題領域なしに具体的な例を示すことは困難です。

プログラミング言語とは独立して問題ドメインを定義したいと思います。プログラミング言語は、必要な機能と、機能を提供するエンティティ、およびそれらの間の相互作用を記述したものです。

そのときだけ、クラス、パッケージ、メソッドの命名を開始するための開始点があります。

1
luis.espinal