web-dev-qa-db-ja.com

オブジェクト指向プログラミングにおけるメインの責任は何ですか?

私はオブジェクト指向プログラミングに不慣れで、メインの目的が何なのかわかりません。

はい、私はそれがプログラムの「エントリーポイント」であると読みましたが、私が理解していないことは、メインにあるべきものは何ですか?そして、その責任は何ですか?

メインで書かれた何かが別のオブジェクトにカプセル化される可能性がありますが、このアプローチをどれだけ使用する必要がありますか?

これが私が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);
}
10
Elia

まず、あなたの例はオブジェクト指向のプログラムではありません。言語(Java?)が構造化データに提供するツールであるため、たまたまオブジェクトにデータを格納する手続き型プログラムです。

真のオブジェクト指向プログラムは、相互に作用するオブジェクトで構成されています-dataではなくbehaviorについてです(私はは物議を醸す声明なので、 ここにリンクがあります ここで、私よりも多くの資格情報を持つ人々からのオブジェクト指向の複数の定義を見ることができます。ほとんどの人に動作が見られることに注意してください)。

真のオブジェクト指向プログラムでは、私が使用する定義によれば、互いに相互作用する独立したオブジェクトがあります。 main関数の役割は、初期オブジェクトを作成してそれらを相互に関連付けることです。

簡単な例として、データベースの上に構築されたWebアプリケーションを考えてみましょう。このアプリケーションはさまざまな方法でオブジェクトに分割できますが、そのうちの1つは、接続を受け入れ、HTTPリクエストを解析し、適切なNetworkingオブジェクトにディスパッチするControllerオブジェクトで、Databaseオブジェクトとやり取りして応答を生成します( 1つ以上のViewオブジェクトを各コントローラーに関連付けたい場合は、自由に関連付けてください)。 Threadpoolオブジェクトを追加して、個別の実行ストリームを提供することもできます。

このアプリケーションでのmainの役割は次のとおりです。

  1. Databaseオブジェクトを作成する
  2. すべてのControllerオブジェクトを作成し、それらをDatabaseオブジェクトに関連付けます
  3. Networkオブジェクトを作成し、すべてのControllerオブジェクトを関連付けます。
  4. Networkオブジェクトの実行を開始します(これには、Threadpoolの作成とNetworkへのワイヤリングも含まれる場合があります)。

これらのセットアップ手順は、mainで明示的に指定することも、他のオブジェクトで処理することもできます。たとえば、典型的なSpringアプリケーションでは、main関数が行うことは、アプリケーションコンテキスト(単一のオブジェクト)を作成することだけです。これにより、そのアプリケーションコンテキストの構成で言及されているすべてのオブジェクトの作成と関連付けがトリガーされます。

10
kdgregory

まあ、それは異なります。それを2つの極端にしてください。

  1. すべてのコードをmainに1行ずつ配置します。これでコンパイルと実行がうまくいきます。しかし、人間にとって、コードは消化できません。
  2. 単一の関数をmainに配置してdoWhatNeedsToBeDoneを呼び出すだけで、最終的にこのルーチンを同じ方法で続行できます。これで、非常にきちんとしたmainが得られましたが、もちろん、何を実行する必要があるのか​​わかりません。

したがって、真実はその中間にあります。 1ページに収まるmainを作成してみてください。そうすれば、実行する必要のある主な手順を誰かが入手できます。適切な境界線を取得することは、単に経験の問題です。

上記は一般的な規則であり、OOおよび関数型プログラミングに適用されます。

1
qwerty_so

静的メインメソッドは、非オブジェクト指向の世界からオブジェクト指向の世界への移行として存在します。これは、少なくとも80年代のC++以降、この方法で行われています。

静的メソッドは、本質的にオブジェクト指向ではないメソッドです。これらは手続き型メソッドである場合があります。それらは機能的な方法かもしれません。静的メソッドの概念は、本質的にOOP=から他のプログラミングパラダイムへのエスケープです。

Java、C#、およびC++はすべて、静的メインを、従来のCスタイルのメインからそれぞれのプログラミング言語への移行として使用します。ここから、オブジェクトを使用するかどうかを自由に選択できます。

これらの言語では、静的メインではなく原始インスタンスオブジェクトが必要だった可能性がありますが、代わりに静的メインアプローチを選択しています。代替のインスタンスアプローチを使用すると、mainクラスはthreadクラスのサブクラスになり、言語ランタイムはmainクラスの初期オブジェクトインスタンスを呼び出して、そのrunインスタンスメソッド。追加のスレッドが起動/作成される方法とほぼ同じです。

しかし、それは歴史的には他の方法で行われていました。一部では、これらの言語はちょうどそれに追随しています。一部には、当時はスレッド化が優先されていなかったため、より単純な静的アプローチを使用していました。

また、静的メインアプローチは、サブクラス化を使用する必要がないという点で「シンプル」です。そのため、hello worldのような自明なチュートリアルプログラムは、ある意味で単純です(ただし、比較的説明のつかないstaticを使用します)。これは、最初にOOPを教えようとしているときに誰かに説明するのは難しいです。)

1
Erik Eidt