私はオブジェクト指向プログラミングに不慣れで、メインの目的が何なのかわかりません。
はい、私はそれがプログラムの「エントリーポイント」であると読みましたが、私が理解していないことは、メインにあるべきものは何ですか?そして、その責任は何ですか?
メインで書かれた何かが別のオブジェクトにカプセル化される可能性がありますが、このアプローチをどれだけ使用する必要がありますか?
これが私がJavaで書いた最初のメインです。非常にシンプルですが、私の疑問をよりよく理解できるかもしれません。 「Cat」と「Dog」によって拡張された抽象クラスAnimalがあります。メインを使用してオブジェクトを作成し、ユーザーとの「インターフェース」としても使用しました。実際に、条件付きの指示を使用して、ユーザーが何をしたいかを「ユーザーに尋ねる」ことができます。
私の質問は、インターフェイスが別のオブジェクトにカプセル化され、メインにその責任を与えないという事実から生じました。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("What type of animal do you want to create? \n dog cat");
String type = input.nextLine();
if ( Objects.equals(type, "dog")){
System.out.println("Enter the animal's age: ");
int age = input.nextInt(); // Scans the next token of the input as an int.
System.out.println("Enter the animal's name: ");
String name = input.next();
Dog first = new Dog(name, age);
}
else if ( Objects.equals(type, "cat")) {
System.out.println("Enter the animal's age: ");
int age = input.nextInt(); // Scans the next token of the input as an int.
System.out.println("Enter the animal's name: ");
String name = input.next();
Cat first = new Cat(name, age);
}
else{
System.out.println("Error: the specified type does not exist.");
}
System.out.println("The number of animals is:" + numberOfAnimals);
}
まず、あなたの例はオブジェクト指向のプログラムではありません。言語(Java?)が構造化データに提供するツールであるため、たまたまオブジェクトにデータを格納する手続き型プログラムです。
真のオブジェクト指向プログラムは、相互に作用するオブジェクトで構成されています-dataではなくbehaviorについてです(私はは物議を醸す声明なので、 ここにリンクがあります ここで、私よりも多くの資格情報を持つ人々からのオブジェクト指向の複数の定義を見ることができます。ほとんどの人に動作が見られることに注意してください)。
真のオブジェクト指向プログラムでは、私が使用する定義によれば、互いに相互作用する独立したオブジェクトがあります。 main
関数の役割は、初期オブジェクトを作成してそれらを相互に関連付けることです。
簡単な例として、データベースの上に構築されたWebアプリケーションを考えてみましょう。このアプリケーションはさまざまな方法でオブジェクトに分割できますが、そのうちの1つは、接続を受け入れ、HTTPリクエストを解析し、適切なNetworking
オブジェクトにディスパッチするController
オブジェクトで、Database
オブジェクトとやり取りして応答を生成します( 1つ以上のView
オブジェクトを各コントローラーに関連付けたい場合は、自由に関連付けてください)。 Threadpool
オブジェクトを追加して、個別の実行ストリームを提供することもできます。
このアプリケーションでのmain
の役割は次のとおりです。
Database
オブジェクトを作成するController
オブジェクトを作成し、それらをDatabase
オブジェクトに関連付けますNetwork
オブジェクトを作成し、すべてのController
オブジェクトを関連付けます。Network
オブジェクトの実行を開始します(これには、Threadpool
の作成とNetwork
へのワイヤリングも含まれる場合があります)。これらのセットアップ手順は、main
で明示的に指定することも、他のオブジェクトで処理することもできます。たとえば、典型的なSpringアプリケーションでは、main
関数が行うことは、アプリケーションコンテキスト(単一のオブジェクト)を作成することだけです。これにより、そのアプリケーションコンテキストの構成で言及されているすべてのオブジェクトの作成と関連付けがトリガーされます。
まあ、それは異なります。それを2つの極端にしてください。
main
に1行ずつ配置します。これでコンパイルと実行がうまくいきます。しかし、人間にとって、コードは消化できません。main
に配置してdoWhatNeedsToBeDone
を呼び出すだけで、最終的にこのルーチンを同じ方法で続行できます。これで、非常にきちんとしたmain
が得られましたが、もちろん、何を実行する必要があるのかわかりません。したがって、真実はその中間にあります。 1ページに収まるmain
を作成してみてください。そうすれば、実行する必要のある主な手順を誰かが入手できます。適切な境界線を取得することは、単に経験の問題です。
上記は一般的な規則であり、OOおよび関数型プログラミングに適用されます。
静的メインメソッドは、非オブジェクト指向の世界からオブジェクト指向の世界への移行として存在します。これは、少なくとも80年代のC++以降、この方法で行われています。
静的メソッドは、本質的にオブジェクト指向ではないメソッドです。これらは手続き型メソッドである場合があります。それらは機能的な方法かもしれません。静的メソッドの概念は、本質的にOOP=から他のプログラミングパラダイムへのエスケープです。
Java、C#、およびC++はすべて、静的メインを、従来のCスタイルのメインからそれぞれのプログラミング言語への移行として使用します。ここから、オブジェクトを使用するかどうかを自由に選択できます。
これらの言語では、静的メインではなく原始インスタンスオブジェクトが必要だった可能性がありますが、代わりに静的メインアプローチを選択しています。代替のインスタンスアプローチを使用すると、main
クラスはthread
クラスのサブクラスになり、言語ランタイムはmain
クラスの初期オブジェクトインスタンスを呼び出して、そのrun
インスタンスメソッド。追加のスレッドが起動/作成される方法とほぼ同じです。
しかし、それは歴史的には他の方法で行われていました。一部では、これらの言語はちょうどそれに追随しています。一部には、当時はスレッド化が優先されていなかったため、より単純な静的アプローチを使用していました。
また、静的メインアプローチは、サブクラス化を使用する必要がないという点で「シンプル」です。そのため、hello world
のような自明なチュートリアルプログラムは、ある意味で単純です(ただし、比較的説明のつかないstatic
を使用します)。これは、最初にOOPを教えようとしているときに誰かに説明するのは難しいです。)