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


10

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

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

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

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

2
このmain機能はOOPの概念ではありません。
Andres F.

回答:


10

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

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

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

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

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

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

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


1
メソッドのようなものが存在し得ないほどオブジェクト指向真剣に受け止める言語の例については、ニュースピークを参照してください。main
イェルクWミッターク

1
良い答えですが、もし私があなたなら、依存性注入についても言及したでしょう。
Arseni Mourzenko 2016年

私のコードがオブジェクト指向ではないことの意味がわかります。気づきませんでしたが、実際に作成したオブジェクトには動作がありません。それを「もっとOO」にするためには、すでに持っているオブジェクトを「使用」する他のオブジェクトを作成するというアイデアが考えられますが、メソッドのないオブジェクトをまったく持たない方が良いでしょうか?
エリア2016年

@エリア-いいえ、それは良くないでしょう。構造化データをタイプして名前を付けることには価値があります(それを単ににダンプするのではありませんMap)。ただし、Javaではこれを行う方法が1つしかありません(構造体とクラスを区別するC ++とは異なります)。そのため、プログラムを理解しやすくするために動作なしでクラスを定義しますが、そうすることでプログラムが「オブジェクト指向」にならないことを認識してください。
kdgregory 2016年

1

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

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

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

上記は一般的なルールであり、OOと関数型プログラミングに適用されます。


1

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

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

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

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

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

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


-1

Main()メソッドは、プログラムを実行するために使用されます

責任-プログラムの実行を開始すると、Main()メソッドは他のメソッドを呼び出してプログラムの実行を開始します。

これは、Main()メソッドの責任が何であるかを理解するのに役立つ簡単な答えです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.