私は学生で、Java は初めてです。私が行っているこの課題は、oop 規則に厳密に従う必要がある最初の課題です。したがって、これは初心者の質問かもしれません。メニューをコーディングするとき、メニュー コードをメイン メソッドに配置するのが適切でしょうか?それとも、クラスに配置して、他のすべてと一緒にインスタンス化する必要がありますか?
編集: メニュー メニューは、GUI ではなく数字で入力される単純なコマンド ライン メニューです。まだそこまでではない。
OOP規約に厳密に従いたい場合は、次のような独自のクラスを作成できます
abstract class MenuItem {
int index;
protected MenuItem(int index) {
this.index = index;
}
abstract void action();
}
class ExitMenuItem {
ExitMenuItem() {
super(3); // the index value of the menu item
}
void action() {
System.exit(0);
}
}
その動作を持つすべてのメニュー項目に固有のサブクラスを持つことができるように。
次に、次のようなメニュー コンテナーを作成できます。
class Menu {
ArrayList<MenuItem> items;
void executeAction(String input) {
..
}
}
これは、stdin 入力に従ってどのボイスが選択されたかを理解し、それを実行する必要があります。もちろん、すべてのメニュー項目などにデフォルトのテキストを設定することで、すべてを充実させることができます。次に、メイン メソッドでメニューをインスタンス化し、stdin 入力をそれに転送するようにします。
これは通常、単純なメニューではやり過ぎですが、OOP を理解したい場合は、良い方法です。
オブジェクト指向のアプローチでは、特定のクラスでメニューを作成する必要があります。main メソッドは、手続き型/命令型プログラミング言語の遺産です。メイン メソッドは、メイン スレッドを実行するだけです。
場合によります。これは通常、人が提供できる最悪の答えですが、残念ながら、それは完全に当てはまります。
完全な要件を提供していないため、意図していることを推測するのは少し困難です。このメニューは単一のクラスに固有のものですか? 複数回実行できますか?並行して実行できるはずですか?
というか、このメニューは実際のプログラムへの入り口にすぎませんか? 例: 1 を押してログインし、2 を押して画面に何かを表示し、3 を押して ....
これらの質問をする理由は、それらがコードの構造を形成するからです。最初のケースでは、それらが特にクラスに関連するメニューであり、複数のポイントでコード内の複数の場所から実行できる場合、クラス構造自体 (非静的) 内に属していることが理にかなっています。
ただし、メニューが純粋にアプリケーションへのエントリ ポイントである場合は、コードの main() セクションに配置するか、分かりやすくするために menu() という別の静的メソッドをコーディングすることをお勧めします。しかし現実的には、menu() メソッドはメインからのみ呼び出されます。
次に自問することは、メニュー選択からの応答をどのように検証する予定かということです。複雑/複雑なコードが必要ですか? 検証ルーチンがメイン メソッドの一部であること、または独自のメソッドを持つことは、より理にかなっていますか? メソッドクラス間で通信して検証するためのメンバー変数を持つ方が理にかなっていますか?
クラスをインスタンス化せずに静的メソッドを呼び出すことができることに注意してください。そうは言っても、静的な main() メソッドまたは静的な menu() メソッドは依然としてクラス自体に残り、OOP 設計の一部です。
これを自問してみてください - メインメソッドにメニューを印刷するコードを配置する場合、複数回印刷を処理するにはどうすればよいですか?
メインと同じクラスのメソッドにコードを入れて、別のメイン クラスの別の場所にメニューを出力する必要がある場合、どうすればそれを処理できますか?
最終的に、メニューの表示を処理するコードを処理するクラスが作成され、メイン クラスはそのクラスのメソッドのみを呼び出します。:)
おそらくこれにはさまざまな好みがあり、良い答えは、アプリが何をしているかによっても異なります。
まず、小さなアプリケーションの場合、メイン クラスにメニューを配置してもかまいません。
しかし、優れた構造を実現するには、行ベースのメニューを出力し、ユーザー入力を読み取り、ユーザーが要求するアクションを呼び出すクラスを用意することをお勧めします。Controller
そのようなクラスまたはを呼び出すことは良い考えだと思いますDispatcher
。このクラスはシングルトンになります。さらに、メソッドdisplayMenu
とdispatch
. どちらもコンストラクターから連続して呼び出されます。
dispatch
適切なアクションを呼び出す方法は、アプリの残りの部分によって異なります。
メインルーチンにはおそらく宣言しかないため、このスタイルを好まない人もいます。