Jakie są główne obowiązki programowania obiektowego?

10

Jestem nowy w programowaniu obiektowym i nie rozumiem, jaki jest cel głównego.

Tak, czytam, że jest to „punkt wejścia” programu, ale nie rozumiem, co powinno być w głównym? A jakie są jego obowiązki?

Może się zdarzyć, że coś napisanego w main może być enkapsulowane w innym obiekcie, ale ile powinieneś użyć tego podejścia?

Oto moja pierwsza główna wersja, którą napisałem w Javie, jest bardzo prosta, ale może sprawić, że lepiej zrozumiesz moje wątpliwości. Mam abstrakcyjną klasę Animal, którą rozszerzają „Cat” i „Dog”. Użyłem main do stworzenia jakiegoś obiektu, a także jako „interfejsu” z użytkownikiem, w rzeczywistości, jak widać, użyłem instrukcji warunkowej, aby „zapytać użytkownika”, co chce zrobić.

Moje pytanie wynikało z faktu, że interfejs można zamknąć w innym obiekcie i nie przypisywać tej odpowiedzialności głównej.

    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);
}
Elia
źródło
2
Ta mainfunkcja nie jest koncepcją z OOP.
Andres F.,

Odpowiedzi:

10

Po pierwsze, twój przykład nie jest programem obiektowym. Jest to program proceduralny, który zdarza się przechowywać dane w obiektach, ponieważ jest to narzędzie, które Twój język (Java?) Udostępnia dla danych strukturalnych.

Prawdziwy program obiektowy składa się z obiektów, które współdziałają ze sobą - chodzi raczej o zachowanie niż dane (zdaję sobie sprawę, że jest to kontrowersyjne stwierdzenie, więc tutaj jest link, w którym można zobaczyć wiele definicji orientacji obiektowej od osób o większej liczbie referencji niż ja; zauważ, że zachowanie pojawia się w większości z nich).

W prawdziwym programie obiektowym, zgodnie z definicją, której używam, masz niezależne obiekty oddziałujące ze sobą. Rolą tej mainfunkcji jest tworzenie początkowych obiektów i łączenie ich ze sobą.

Jako prosty przykład rozważ aplikację internetową zbudowaną na bazie danych. Ta aplikacja może być podzielona na obiekty na wiele sposobów, ale oto jeden z nich: Networkingobiekt, który przyjmuje połączenia, analizuje żądanie HTTP i wysyła do odpowiedniego Controllerobiektu, który współdziała z Databaseobiektem i generuje odpowiedź (jeśli chcesz aby skojarzyć jeden lub więcej Viewobiektów z każdym kontrolerem, możesz to zrobić). Możesz także dodać Threadpoolobiekt, aby zapewnić osobne strumienie wykonania.

Rolą mainw tej aplikacji może być:

  1. Utwórz Databaseobiekt
  2. Utwórz wszystkie Controllerobiekty i powiąż je z Databaseobiektem
  3. Utwórz Networkobiekt i powiąż z nim wszystkie Controllerobiekty.
  4. Uruchom Networkobiekt uruchomiony (co może również obejmować utworzenie Threadpooli podłączenie go do Network).

Te kroki konfiguracji mogą być wyraźnie określone w mainlub mogą być obsługiwane przez inny obiekt. Na przykład w typowej aplikacji Spring mainfunkcja ta tworzy kontekst aplikacji (pojedynczy obiekt). Powoduje to utworzenie i okablowanie wszystkich obiektów wymienionych w konfiguracji dla tego kontekstu aplikacji.

kdgregory
źródło
1
Zobacz Newspeak na przykład języka, który traktuje OO tak poważnie, że coś takiego jak mainmetoda nie może nawet istnieć.
Jörg W Mittag
1
Dobra odpowiedź, ale gdybym był tobą, wspominałbym również o wstrzykiwaniu zależności.
Arseni Mourzenko
Rozumiem, co masz na myśli mówiąc, że mój kod nie jest obiektowy. Nie zauważyłem, ale w rzeczywistości obiekty, które stworzyłem, nie zachowują się. Aby uczynić go bardziej „OO”, pomysłem mogłoby być stworzenie innych obiektów, które „wykorzystują” te, które już posiadam, ale czy lepiej byłoby nie mieć żadnego obiektu bez metod?
Elia
@Elia - Nie, nie byłoby lepiej. Przypisywanie i nazwanie uporządkowanych danych ma wartość (w przeciwieństwie do zwykłego zrzutu w a Map). Ale Java zapewnia tylko jeden sposób, aby to zrobić (w porównaniu z C ++, który odróżnia struktury i klasy). Zdefiniuj więc klasy bez zachowania, ponieważ dzięki temu Twój program będzie łatwiejszy do zrozumienia, ale zrozum, że to nie czyni programu „obiektowym”.
kdgregory,
1

Cóż, to zależy. Weź to do dwóch skrajności:

  1. Umieść cały kod wiersz po wierszu w swoim main. To będzie dobrze się kompilować i działać. Ale dla człowieka kod nie będzie strawny.
  2. Wystarczy umieścić jedną funkcję maini wywołać ją, doWhatNeedsToBeDonea następnie kontynuować tę procedurę w ten sam sposób. Teraz jesteś bardzo schludny, mainale oczywiście nie rozumiesz, co trzeba zrobić.

Tak więc prawda jest gdzieś pośrodku. Spróbuj utworzyć stronę mainpasującą do jednej strony, aby ktoś mógł uzyskać najważniejsze instrukcje, które należy wykonać. Uzyskanie właściwej granicy jest po prostu kwestią doświadczenia.

Powyższe jest ogólną zasadą i dotyczy OO, a także programowania funkcjonalnego.

qwerty_so
źródło
1

Główna metoda statyczna istnieje jako przejście ze świata nieobiektywnego do świata zorientowanego obiektowo. Zostało to zrobione w ten sposób od co najmniej C ++ w latach 80-tych.

Metody statyczne są zasadniczo metodami nieobiektywnymi: mogą być metodami proceduralnymi; mogą to być metody funkcjonalne. Pojęcie metod statycznych jest zasadniczo ucieczką OOP od innych paradygmatów programowania.

Java, C # i C ++ używają statycznego main jako przejścia od tradycyjnego maina w stylu C do odpowiedniego języka programowania, z którego można teraz dowolnie korzystać z obiektów (lub nie).

Te języki mogły wymagać pierwotnego obiektu instancji zamiast statycznego main, ale zamiast tego wybrały statyczne podejście main. Stosując alternatywne podejście do instancji, mainklasa byłaby podklasą threadklasy, a środowisko wykonawcze języka wyczarowałoby początkową instancję obiektu mainklasy, a następnie runwywołało metodę instancji, podobnie jak uruchamiane / tworzone są dodatkowe wątki.

Ale historycznie zostało to zrobione w inny sposób: po części te języki są po prostu takie same, a po części dlatego, że wątki nie były w tamtych czasach priorytetem, więc stosowali prostsze podejście statyczne.

Ponadto statyczne podejście główne jest „prostsze”, ponieważ nie musisz używać podklasy, więc trywialne programy samouczków hello worldsą w pewnym sensie prostsze (jednak używają stosunkowo niewytłumaczalnego static, co trudno jest komuś wyjaśnić, gdy jesteś próbując najpierw nauczyć OOP.)

Erik Eidt
źródło
-1

Do uruchomienia programu używana jest metoda Main ()

Odpowiedzialność - po uruchomieniu programu metoda Main () wywołuje inne metody uruchamiania programu.

To prosta odpowiedź, która pomaga mi zrozumieć, na czym polega metoda Main ().

Narinder Kaur
źródło