Quais são as responsabilidades dos principais na programação orientada a objetos?

10

Eu sou novo em programação orientada a objetos e não entendo qual é o objetivo principal.

Sim, eu li que é o "ponto de entrada" do programa, mas o que eu não entendo é o que deve ser o principal? E quais são as suas responsabilidades?

Pode acontecer que algo escrito no principal possa ser encapsulado em outro objeto, mas quanto você deve usar essa abordagem?

Aqui está o meu primeiro artigo principal que escrevi em Java, é muito simples, mas pode fazer você entender melhor minha dúvida. Eu tenho uma classe abstrata Animal, que é estendida por "Cat" e "Dog". Eu usei o main para criar algum objeto e também como uma "interface" com o usuário, como você pode ver, usei algumas instruções condicionais para "perguntar ao usuário" o que ele deseja fazer.

Minha pergunta surgiu do fato de que a interface poderia ser encapsulada em outro objeto e não atribuir essa responsabilidade ao principal.

    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
fonte
2
A mainfunção não é um conceito do OOP.
Andres F.

Respostas:

10

Primeiro, seu exemplo não é um programa orientado a objetos. É um programa processual que armazena dados em objetos, porque é a ferramenta que sua linguagem (Java?) Fornece para dados estruturados.

Um verdadeiro programa orientado a objetos consiste em objetos que interagem entre si - trata-se de comportamento e não de dados (eu percebo que é uma afirmação controversa, então aqui está um link onde você pode ver várias definições de orientação a objetos de pessoas com mais credenciais do que eu; observe que o comportamento aparece na maioria deles).

Em um verdadeiro programa orientado a objetos, de acordo com a definição que eu uso, você tem objetos independentes interagindo entre si. O papel da mainfunção é criar os objetos iniciais e conectá-los.

Como um exemplo simples, considere um aplicativo Web construído sobre um banco de dados. Esse aplicativo pode ser dividido em objetos de várias maneiras, mas eis uma delas: um Networkingobjeto que aceita conexões, analisa a solicitação HTTP e envia para um Controllerobjeto apropriado , que interage com um Databaseobjeto e produz a resposta (se você desejar para associar um ou mais Viewobjetos a cada controlador, sinta-se à vontade para fazê-lo). Você também pode adicionar um Threadpoolobjeto para fornecer fluxos de execução separados.

O papel maindeste aplicativo pode ser:

  1. Crie o Databaseobjeto
  2. Crie todos os Controllerobjetos e associe-os ao Databaseobjeto
  3. Crie o Networkobjeto e associe todos os Controllerobjetos a ele.
  4. Inicie o Networkobjeto em execução (o que também pode envolver a criação Threadpoole conexão do mesmo Network).

Essas etapas de instalação podem ser explicitamente especificadas em mainou podem ser tratadas por outro objeto. Por exemplo, em um aplicativo Spring típico, tudo o que a mainfunção faz é criar o contexto do aplicativo (um único objeto). Isso aciona a criação e a fiação de todos os objetos mencionados na configuração para esse contexto de aplicativo.

kdgregory
fonte
1
Veja o Newspeak para obter um exemplo de uma linguagem que leva o OO tão a sério que algo como um mainmétodo nem pode existir.
Jörg W Mittag
1
Boa resposta, mas se eu fosse você, também teria mencionado a injeção de dependência.
Arseni Mourzenko #
Entendo o que você quer dizer com meu código não ser orientado a objetos. Eu não percebi, mas, na verdade, os objetos que eu criei não têm nenhum comportamento. Para torná-lo "mais OO", uma idéia poderia estar criando alguns outros objetos que "usam" os que eu já tenho, no entanto, seria melhor não ter nenhum objeto sem métodos?
Elia
@Lia - Não, não seria melhor. É importante ter dados estruturados digitados e nomeados (em vez de apenas despejá-los em a Map). Mas o Java fornece apenas uma maneira de fazer isso (versus C ++, que diferencia estruturas e classes). Portanto, defina classes sem comportamento, porque isso facilita a compreensão do programa, mas reconheça que isso não torna o programa "orientado a objetos".
kdgregory
1

Bem, isto depende. Leve-o a dois extremos:

  1. Coloque todo o código linha por linha no seu main. Isso irá compilar e executar bem. Mas para um humano, o código não será digerível.
  2. Basta colocar uma única função maine chamá-la doWhatNeedsToBeDonee, eventualmente, continuar nessa rotina da mesma maneira. Agora você tem uma aparência muito elegante, mainmas é claro que não entende o que precisa ser feito.

Então, a verdade está em algum lugar intermediário. Tente criar um mainque se encaixe em uma página, para que alguém possa obter as principais instruções que precisam ser executadas. Obter a borda certa é simplesmente uma questão de experiência.

O acima é uma regra geral e aplica-se ao OO, bem como à programação funcional.

qwerty_so
fonte
1

O método principal estático existe como uma transição do mundo não orientado a objetos para o mundo orientado a objetos. Isso tem sido feito dessa maneira desde pelo menos C ++ nos anos 80.

Métodos estáticos são essencialmente métodos não orientados a objetos: podem ser métodos procedimentais; eles podem ser métodos funcionais. A noção de métodos estáticos é essencialmente uma fuga do POO para outros paradigmas de programação.

Java, C # e C ++ usam o main estático como uma transição do main do estilo C tradicional para a respectiva linguagem de programação, a partir da qual agora você pode optar por usar objetos (ou não) à vontade.

Essas linguagens poderiam ter exigido um objeto de instância primordial em vez de um main estático, mas optaram pela abordagem principal estática. Usando uma alternativa de abordagem de instância, a mainclasse seria uma subclasse da threadclasse e o language runtime conjuraria uma instância de objeto inicial da mainclasse e, em seguida, chamaria seu runmétodo de instância, da mesma maneira que threads adicionais são iniciados / criados.

Porém, historicamente, isso foi feito de outra maneira: em parte, essas linguagens estão apenas seguindo o exemplo, e em parte, porque o threading não era uma prioridade naqueles dias, então eles usaram a abordagem estática mais simples.

Além disso, a abordagem principal estática é "mais simples", pois você não precisa usar subclassificação; portanto, programas tutoriais triviais, como hello worldsão mais simples em algum sentido (ainda assim, eles usam o relativamente inexplicável static, que é difícil de explicar para alguém quando você está tentando primeiro ensinar OOP.)

Erik Eidt
fonte
-1

O método Main () é usado para executar o programa

Responsabilidade - Depois que você inicia a execução do programa, o método Main () chama outros métodos para iniciar a execução do programa.

Esta é uma resposta simples que me ajuda a entender qual é a responsabilidade do método Main ().

Narinder Kaur
fonte