Каковы основные обязанности в объектно-ориентированном программировании?


10

Я новичок в объектно-ориентированном программировании, и я не понимаю, какова цель основного.

Да, я читал, что это «точка входа» в программу, но я не понимаю, что должно быть в основном? И каковы его обязанности?

Может случиться так, что что-то написанное в main может быть инкапсулировано в другой объект, но насколько вы должны использовать этот подход?

Вот моя самая первая основная статья, которую я написал на Java, она очень проста, но может помочь вам лучше понять мои сомнения. У меня есть абстрактный класс Animal, который расширен "Cat" и "Dog". Я использовал main для создания некоторого объекта, а также как «интерфейс» с пользователем, действительно, как вы можете видеть, я использовал некоторую условную инструкцию, чтобы «спросить пользователя», что он хочет сделать.

Мой вопрос возник из-за того, что интерфейс мог быть инкапсулирован в другой объект и не передавал эту ответственность основному.

    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Функция не является понятием из объектно - ориентированного программирования.
Андрес Ф.

Ответы:


10

Во-первых, ваш пример не является объектно-ориентированной программой. Это процедурная программа, которая хранит данные в объектах, потому что это инструмент, который ваш язык (Java?) Предоставляет для структурированных данных.

Истинный объектно-ориентированная программа состоит из объектов , которые взаимодействуют друг с другом - это о поведении , а не данных (я понимаю , что это спорное утверждение, так вот ссылка , где вы можете увидеть несколько определений объектно-ориентированного программирования от людей с большим количеством учетных данных чем я; обратите внимание, что поведение появляется в большинстве из них).

В настоящей объектно-ориентированной программе, согласно определению, которое я использую, у вас есть независимые объекты, взаимодействующие друг с другом. Роль mainфункции заключается в создании начальных объектов и их соединении.

В качестве простого примера рассмотрим веб-приложение, построенное поверх базы данных. Это приложение может быть разбито на объекты разными способами, но вот один из них: Networkingобъект, который принимает соединения, анализирует HTTP-запрос и отправляет соответствующий Controllerобъект, который взаимодействует с Databaseобъектом и выдает ответ (если вы хотите чтобы связать один или несколько Viewобъектов с каждым контроллером, не стесняйтесь делать это). Вы также можете добавить Threadpoolобъект для обеспечения отдельных потоков выполнения.

Роль mainв этом приложении может быть:

  1. Создать Databaseобъект
  2. Создайте все Controllerобъекты и свяжите их с Databaseобъектом
  3. Создайте Networkобъект и свяжите все Controllerобъекты с ним.
  4. Запустите Networkзапущенный объект (который также может включать создание Threadpoolи подключение к нему Network).

Эти шаги настройки могут быть явно указаны в mainили они могут быть обработаны другим объектом. Например, в типичном приложении Spring все, что mainделает функция, - это создает контекст приложения (один объект). Это инициирует создание и подключение всех объектов, упомянутых в конфигурации для этого контекста приложения.


1
Посмотрите Newspeak для примера языка, который воспринимает ОО настолько серьезно, что нечто вроде mainметода не может даже существовать.
Йорг Миттаг,

1
Хороший ответ, но на вашем месте я бы также упомянул инъекцию зависимости.
Арсений Мурзенко

Я понимаю, что вы имеете в виду, что мой код не является объектно-ориентированным. Я не заметил, но на самом деле созданные мной объекты не имеют никакого поведения. Чтобы сделать его «более ОО», можно было бы создать несколько других объектов, которые «используют» те, которые у меня уже есть, но лучше ли вообще не иметь объект без методов?
Элия

@Elia - Нет, это не будет лучше. Есть смысл иметь типизированные и именованные структурированные данные (а не просто помещать их в a Map). Но Java предоставляет только один способ сделать это (по сравнению с C ++, который различает структуры и классы). Поэтому определяйте классы без поведения, потому что это облегчает понимание вашей программы, но следует понимать, что это не делает вашу программу «объектно-ориентированной».
kdgregory

1

Смотря как. Возьмите это к двум крайностям:

  1. Размещайте весь код построчно в вашем main. Это будет компилироваться и работать хорошо. Но для человека код не будет усваиваемым.
  2. Просто поместите одну функцию mainи вызовите ее, doWhatNeedsToBeDoneи, в конце концов, продолжайте в том же духе. Теперь у вас очень аккуратно, mainно, конечно, вы не получаете того, что нужно сделать.

Итак, истина где-то посередине. Попробуйте создать mainфайл, который умещается на одной странице, чтобы кто-то мог понять, какие основные инструкции необходимо выполнить. Получение правильной границы просто вопрос опыта.

Вышесказанное является общим правилом и применимо как к ОО, так и к функциональному программированию.


1

Основной статический метод существует как переход от не объектно-ориентированного мира к объектно-ориентированному миру. Так было сделано по крайней мере с C ++ в 80-х.

Статические методы - это, по сути, не объектно-ориентированные методы: они могут быть процедурными методами; они могут быть функциональными методами. Понятие статических методов по сути является выходом ООП из других парадигм программирования.

Java, C # и C ++ используют статический main как переход от традиционного main в стиле C к соответствующему языку программирования, из которого вы теперь можете использовать объекты (или нет) по своему желанию.

Эти языки могли бы потребовать первичного экземпляра объекта вместо статического основного, но вместо этого выбрали статический основной подход. Используя альтернативный подход к экземпляру, mainкласс будет подклассом threadкласса, а среда выполнения языка вызовет заклинание начального экземпляра объекта mainи затем вызовет его runметод экземпляра, во многом способ запуска / создания дополнительных потоков.

Но исторически это было сделано другим путем: частично, эти языки просто следуют их примеру, а частично, потому что многопоточность не была приоритетом в те дни, поэтому они использовали более простой статический подход.

Кроме того, статический основной подход «проще» в том hello worldсмысле, что вам не нужно использовать подклассы, поэтому тривиальные обучающие программы, такие как , в некотором смысле проще (хотя они используют относительно необъяснимое static, что трудно кому-то объяснить, когда вы пытаюсь сначала научить ООП.)


-1

Метод Main () используется для запуска программы

Ответственность. После запуска вашей программы метод Main () вызывает другие методы для запуска вашей программы.

Это простой ответ, который помогает мне понять, какова ответственность метода Main ().

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.