Які основні обов'язки в об'єктно-орієнтованому програмуванні?


10

Я новачок в об'єктно-орієнтованому програмуванні і не розумію, яка мета головного.

Так, я читав, що це "точка входу" програми, але те, що я не розумію, це те, що повинно бути головним? А які його обов'язки?

Може статися, що щось написане в основному може бути інкапсульовано в інший об’єкт, але наскільки ви повинні використовувати цей підхід?

Ось мій найперший головний, який я написав на Java, це дуже просто, але це може змусити вас краще зрозуміти мої сумніви. У мене є абстрактний клас «Тварина», який поширюється на «Кіт» та «Собака». Я використовував головний для створення якогось об'єкта, а також як "інтерфейс" з користувачем, дійсно, як ви бачите, я використав деяку умовну інструкцію "запитати користувача", що він хоче робити.

Моє запитання виникло з-за того, що інтерфейс можна було інкапсулювати в інший об’єкт і не надати цю відповідальність головному.

    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 на прикладі мови, яка сприймає OO настільки серйозно, що щось на зразок mainметоду навіть не може існувати.
Йорг W Міттаг

1
Хороша відповідь, але якби я був ти, я б також згадав про введення залежності.
Арсеній Муренко

Я бачу, що ви маєте на увазі про те, що мій код не орієнтований на об'єкт. Я не помітив, але насправді об’єкти, які я створив, не мають жодної поведінки. Для того, щоб зробити "більш OO" ідеєю могло б бути створення деяких інших об'єктів, які "використовують" ті, які у мене вже є, однак, було б краще взагалі не мати об'єкта без методів?
Елія

@Elia - Ні, не було б краще. Цінність має структуровані дані набрані та названі (порівняно з просто демпінгуванням у a Map). Але Java пропонує лише один спосіб зробити це (проти C ++, який розрізняє структури та класи). Тому визначайте класи без поведінки, оскільки це полегшує розуміння вашої програми, але визнайте, що це не робить вашу програму "об'єктно-орієнтованою".
kdgregory

1

Ну, це залежить. Візьміть це до двох крайнощів:

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

Отже, правда десь посеред. Спробуйте створити mainвідповідну для однієї сторінки сторінку, щоб хтось міг отримати основні вказівки, які потрібно виконати. Отримати правильну межу - це просто питання досвіду.

Вищезазначене є загальним правилом і стосується ОО, а також функціонального програмування.


1

Статичний основний метод існує як перехід від необектно-орієнтованого світу до об'єктно-орієнтованого світу. Це було зроблено таким чином, щонайменше з C ++ у 80-х.

Статичні методи по суті є не об’єктно орієнтованими методами: вони можуть бути процедурними методами; вони можуть бути функціональними методами. Поняття статичних методів по суті є втечею OOP до інших парадигм програмування.

Усі Java, C # і C ++ використовують статичний основний як перехід від традиційного основного стилю С до відповідної мови програмування, з якого тепер можна за бажанням використовувати об'єкти (чи ні).

Ці мови могли б вимагати об'єкта споконвічного екземпляра замість статичного основного, але обрали замість нього статичний основний підхід. Використовуючи альтернативу підходу до екземпляра, mainклас був би підкласом threadкласу, а час виконання мови спричинив би початковий екземпляр об'єкта mainкласу, а потім викликає його runметод екземпляра, так, як запущені / створені додаткові потоки.

Але історично це було зроблено інакше: частково ці мови відповідають лише відповідності, а частково тому, що нитка в ті часи не була пріоритетною задачею, тому вони використовували простіший статичний підхід.

Крім того, статичний основний підхід "простіший" в тому, що вам не доведеться використовувати підкласифікацію, тому тривіальні програми підручника на зразок hello worldпростіші в певному сенсі (все ж вони використовують відносно незрозуміле static, що важко пояснити комусь, коли ви намагаючись спочатку навчити ООП.)


-1

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

Відповідальність - Після запуску програми метод Main () викликає інші методи для запуску програми.

Це проста відповідь, яка допомагає мені зрозуміти, у чому полягає відповідальність методу Main ().

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.