Quali sono le responsabilità principali nella programmazione orientata agli oggetti?


10

Sono nuovo nella programmazione orientata agli oggetti e non capisco quale sia lo scopo principale.

Sì, ho letto che è il "punto di ingresso" del programma, ma quello che non capisco è quello che dovrebbe essere nel principale? E quali sono le sue responsabilità?

Può succedere che qualcosa di scritto nel principale possa essere incapsulato in un altro oggetto, ma quanto dovresti usare questo approccio?

Ecco il mio primo principale che ho scritto in Java, è molto semplice ma può farti capire meglio i miei dubbi. Ho un animale di classe astratta che è esteso da "Gatto" e "Cane". Ho usato il main per creare un oggetto e anche come "interfaccia" con l'utente, infatti come puoi vedere ho usato alcune istruzioni condizionali per "chiedere all'utente" cosa vuole fare.

La mia domanda è nata dal fatto che l'interfaccia potrebbe essere incapsulata in un altro oggetto e non dare quella responsabilità al principale.

    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
La mainfunzione non è un concetto di OOP.
Andres F.

Risposte:


10

Prima di tutto, il tuo esempio non è un programma orientato agli oggetti. È un programma procedurale che capita di archiviare dati negli oggetti, perché è lo strumento che il tuo linguaggio (Java?) Fornisce per i dati strutturati.

Un vero programma orientato agli oggetti è costituito da oggetti che interagiscono tra loro - si tratta di comportamento piuttosto che di dati (mi rendo conto che è un'affermazione controversa, quindi ecco un link in cui puoi vedere più definizioni di orientamento agli oggetti da persone con più credenziali di me; nota che il comportamento appare nella maggior parte di essi).

In un vero programma orientato agli oggetti, secondo la definizione che uso, hai oggetti indipendenti che interagiscono tra loro. Il ruolo della mainfunzione è creare gli oggetti iniziali e collegarli insieme.

A titolo di esempio, si consideri un'applicazione Web costruita su un database. Questa applicazione potrebbe essere suddivisa in oggetti in molti modi, ma eccone uno: un Networkingoggetto che accetta connessioni, analizza la richiesta HTTP e invia a un Controlleroggetto appropriato , che interagisce con un Databaseoggetto e produce la risposta (se lo desideri per associare uno o più Viewoggetti a ciascun controller, sentiti libero di farlo). È inoltre possibile aggiungere un Threadpoologgetto per fornire flussi di esecuzione separati.

Il ruolo di mainin questa applicazione potrebbe essere quello di:

  1. Crea l' Databaseoggetto
  2. Crea tutti gli Controlleroggetti e associali Databaseall'oggetto
  3. Crea l' Networkoggetto e associa tutti gli Controlleroggetti con esso.
  4. Avviare l' Networkoggetto in esecuzione (che potrebbe anche comportare la creazione Threadpoole il cablaggio nel Network).

Questi passaggi di installazione potrebbero essere specificati in modo esplicito maino potrebbero essere gestiti da qualche altro oggetto. Ad esempio, in una tipica applicazione Spring, tutto ciò che fa la mainfunzione è creare il contesto dell'applicazione (un singolo oggetto). Ciò innesca la creazione e il cablaggio di tutti gli oggetti menzionati nella configurazione per quel contesto applicativo.


1
Vedi Newspeak per un esempio di un linguaggio che prende OO così sul serio che qualcosa come un mainmetodo non può nemmeno esistere.
Jörg W Mittag,

1
Buona risposta, ma se fossi in te, avrei anche menzionato l'iniezione di dipendenza.
Arseni Mourzenko,

Capisco cosa intendi sul fatto che il mio codice non è orientato agli oggetti. Non me ne sono accorto, ma in effetti gli oggetti che ho creato non hanno alcun comportamento. Per rendere "più OO" un'idea potrebbe essere la creazione di alcuni altri oggetti che "utilizzano" quelli che già ho, sarebbe meglio non avere affatto oggetto senza metodi?
Elia,

@Elia - No, non sarebbe meglio. È utile avere dati strutturati digitati e denominati (invece di scaricarli in a Map). Ma Java fornisce solo un modo per farlo (rispetto al C ++, che distingue tra strutture e classi). Quindi definisci le classi senza comportamento, perché ciò rende il tuo programma più facile da capire, ma riconosci che farlo non rende il tuo programma "orientato agli oggetti".
kdgregory,

1

Beh, dipende. Portalo a due estremi:

  1. Inserisci tutto il codice riga per riga nel tuo main. Ciò verrà compilato ed eseguito correttamente. Ma per un essere umano, il codice non sarà digeribile.
  2. Basta inserire una singola funzione maine chiamarla doWhatNeedsToBeDoneed eventualmente continuare in questa routine allo stesso modo. Ora hai un aspetto molto pulito mainma ovviamente non ottieni ciò che deve essere fatto.

Quindi, la verità è da qualche parte nel mezzo. Prova a creare una mainpagina adatta a qualcuno, in modo che qualcuno possa ottenere quali sono le istruzioni principali che devono essere eseguite. Ottenere il giusto confine è semplicemente una questione di esperienza.

Quanto sopra è una regola generale e si applica a OO e alla programmazione funzionale.


1

Il metodo principale statico esiste come transizione dal mondo non orientato agli oggetti al mondo orientato agli oggetti. È stato fatto in questo modo almeno dal C ++ negli anni '80.

I metodi statici sono essenzialmente metodi non orientati agli oggetti: possono essere metodi procedurali; possono essere metodi funzionali. La nozione di metodi statici è essenzialmente una fuga di OOP verso altri paradigmi di programmazione.

Java, C # e C ++ usano tutti il ​​main statico come transizione dal main in stile C tradizionale al rispettivo linguaggio di programmazione, dal quale ora puoi scegliere di usare gli oggetti (o meno) a piacimento.

Questi linguaggi avrebbero potuto richiedere un oggetto di istanza primordiale invece di un main statico, ma invece hanno scelto l'approccio statico principale. Usando un'alternativa all'approccio dell'istanza, la mainclasse sarebbe una sottoclasse della threadclasse e il runtime del linguaggio evocherebbe un'istanza iniziale dell'oggetto della mainclasse e quindi invocherebbe il suo runmetodo di istanza, in modo simile al modo in cui vengono avviati / creati thread aggiuntivi.

Ma storicamente è stato fatto nell'altro modo: in parte, questi linguaggi stanno solo seguendo l'esempio, e in parte, perché il threading non era una priorità in quei giorni, quindi hanno usato un approccio statico più semplice.

Inoltre, l'approccio principale statico è "più semplice" in quanto non è necessario utilizzare la sottoclasse, quindi i programmi di esercitazione banali come hello worldsono in un certo senso più semplici (tuttavia usano il relativamente inspiegabile static, che è difficile da spiegare a qualcuno quando sei cercando di insegnare prima OOP.)


-1

Il metodo Main () viene utilizzato per eseguire il programma

Responsabilità: una volta avviato l'esecuzione del programma, il metodo Main () chiama altri metodi per avviare l'esecuzione del programma.

Questa è una risposta semplice che mi aiuta a capire quale sia la responsabilità del metodo Main ().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.