3

私は過去 6 年間 Java プログラマーをしており、今年の初めからゲーム プログラミングに興味を持つようになりました。それで、人気のあるゲームから始めるのは良い考えだと思い、JavaでMs. Pac-Manというゲームを実装しました。私の実装は元のゲームとほぼ 90% 似ていると言えます。これは基本的な 2D ゲームのコーディングを学ぶための個人的なプロジェクトにすぎないため、できるだけ多くのデザイン パターンとベスト プラクティスを使用するように努めました。

コーディングを終えた今、19 個のインターフェースと 17 個のクラスしかないことに気付きました! そのため、インターフェイスを使いすぎているのではないかと考え始めました。

私が使用するいくつかのクラス/インターフェースの例を次に示します。

クラス- FullGame (FullGameInterface と FullGameObservable を実装)

クラス- View1 (FullGameObserver を実装)

インターフェイス- FullGameInterface (基本的な機能メソッド: 再開、一時停止、再生など)

インターフェース- FullGameObservable (更新通知用にビューを登録できます)

インターフェース- FullGameObserver (通知を受け取るために、ゲームの 2 つの異なるビューによって実装されます)

インターフェイスを使いすぎていませんか?

あなたの意見は何ですか?

4

4 に答える 4

9

実装を変更したい場合は、インターフェースを使用してください。

FullGame オブジェクトのようなものでは、おそらくインターフェイスは必要ありません。

FullGame の機能を変更する場合は、FullGameInterface 用にインスタンス化するオブジェクトを切り替えることができるように、インターフェイスを作成することを検討できます。

編集 2: 必要な場合にのみ、コードをより複雑にします。インターフェイスが必要だと思われる場合は、最初に停止してください。すでにお持ちのクラスをご利用ください。(ただし、それを使用している間は、呼び出し元が実装の詳細に触れないようにしてください。) 2 つ目の同様のクラスができたら、何が実際のインターフェイスで、何が実装であるかを理解できます。共通インターフェースに入れるのが面倒な実装の詳細がまだ呼び出し元に必要な場合は、それらを十分に明確に分離していません。

より完全な回答については編集してください:

インターフェイスは、オブジェクトにアクセスするメソッド (インターフェイス) を実際のオブジェクト (実装) から切り離すのに役立ちます。これはいくつかの状況に適しています:

  1. これらのメソッドの複数の実装があり、セマンティクスと一般的な操作は同じですが、基になる実装が異なります。たとえば、ListArrayList、およびLinkedListListは、多くのコレクションベースのメソッドがArrayListまたは のいずれかを受け入れることを可能にする一般的なインターフェイスですLinkedListCollectionインターフェイスは、すべてのコレクションに対して同様の配置を許可します。
  2. アーキテクチャ上の理由から、インターフェイスを実装から分離する必要があります。たとえば、あるマシンに呼び出しオブジェクトを配置し、別のマシンに実装オブジェクトを配置できます。呼び出し元のマシン上のプロキシは、ネットワークを介して実際のオブジェクトを呼び出すためのインターフェイスを実装します。インターフェイスは、呼び出し元が違いを知る必要がないことを意味します。Java RMI はこれを行いました。
  3. オブジェクトの呼び出し方法を変更できる必要があります。たとえば、インターフェイスImageと 2 つの実装者、FileImageおよびFileImageProxy. プロキシはFileImageオンデマンドでロードし、Imageインターフェイスへの呼び出しを実際のオブジェクトに渡します。クライアントは、イメージを取得する方法や、イメージが実際にロードされているかどうかを知りません。があり、それを使用できることを知っているだけImageです。
于 2009-10-02T14:50:49.080 に答える
1

私はよくインターフェースを使ってデザインを具体化します。私はそれらを徹底的に文書化します。これにより、クラスの責任について熟考する必要があります。API とクラスの内部には常に何らかの違いがあるため、(まだ) の複数の実装がない場合でも、通常はインターフェイスを指定しても問題はありません。

于 2009-10-02T17:22:40.097 に答える