Postagens

Introdução à AOO (Análise Orientada a Objetos)

Imagine que você está construindo uma casa. Antes de começar a assentar os tijolos ou escolher a cor da tinta, é preciso entender muito bem como a casa será usada: quantos quartos são necessários, onde ficará a cozinha, como a luz do sol entra pela janela pela manhã. Na programação, acontece algo parecido. A Análise Orientada a Objetos (AOO) é justamente essa etapa de "planejamento da casa": é o processo de entender profundamente o problema que queremos resolver antes de começar a escrever qualquer código. Muitas vezes, na ansiedade de colocar a mão na massa, os desenvolvedores pulam essa etapa e partem diretamente para a programação. O resultado pode ser um software que até funciona, mas que não atende direito às necessidades reais dos usuários, como uma casa com a porta principal abrindo para a parede. A AOO existe para evitar isso. Ela nos força a fazer as perguntas certas, a conversar com as pessoas que usarão o sistema e a compreender as regras do "mundo real" ...

Explorando Classes Básicas

Hoje vamos mergulhar um pouco mais no mundo das classes, construindo sobre o que já aprendemos anteriormente. Imagine que uma classe é como uma planta baixa para criar objetos - ela define como algo deve ser construído e como vai se comportar. Pense em uma classe como uma receita de bolo. A receita em si não é o bolo, mas nos diz exatamente quais ingredientes usar e como misturá-los para criar deliciosos bolos. Da mesma forma, uma classe descreve que atributos (ingredientes) e métodos (ações) nossos objetos terão. Um conceito importante que vamos explorar são os construtores. Eles são como os primeiros passos na preparação do nosso bolo. Temos dois tipos principais: os construtores que não recebem ingredientes especiais (chamados de "noargs") e aqueles que já começam com ingredientes específicos. Por exemplo, se pensarmos em uma classe "Café", um construtor sem argumentos poderia criar um café padrão, enquanto um construtor com argumentos poderia especificar se quer...

configurando o ambiente Java

Antes de colocarmos a mão na massa e começarmos a programar, precisamos preparar o nosso "ambiente de trabalho". Pense nisso como um pintor preparando sua tela e suas tintas, ou um chef organizando seus ingredientes e facas. Para criar programas em Java, a nossa "tinta" e o nosso "ingrediente" principal é o Kit de Desenvolvimento Java, também conhecido como JDK. Não se preocupe com os nomes técnicos. O JDK é simplesmente um pacote de ferramentas que instalamos no computador para que ele entenda e execute comandos escritos em Java. Para todos os exercícios e para o projeto final que faremos juntos, vamos usar a linguagem Java. A versão mínima que precisamos é a 1.2, mas, como sempre queremos o melhor e mais atualizado, é recomendável baixar a versão mais recente disponível. O local mais comum para conseguir o JDK é diretamente do site da Oracle (que herdou o projeto da Sun Microsystems). Você pode encontrá-lo facilmente fazendo uma busca na internet por ...

Como o encapsulamento atende os objetivos da POO

O encapsulamento é um dos conceitos mais importantes da programação orientada a objetos e pode ser entendido como a ideia de “esconder o que não é necessário e mostrar apenas o que importa”. Para os alunos que estão começando, pense em uma televisão: você não precisa saber como todos os circuitos funcionam por dentro para usá-la, basta apertar os botões do controle remoto. O funcionamento interno fica escondido (encapsulado), e você só tem acesso ao que realmente precisa. Esse conceito traz várias vantagens. A primeira delas é que ele nos ajuda a pensar nos problemas de maneira natural. Quando estamos modelando um programa, conseguimos separar responsabilidades e criar classes que representem as coisas do mundo real. Isso torna o raciocínio mais simples, porque podemos focar no problema em si e não nos detalhes técnicos da implementação. Outra vantagem é a confiabilidade. Quando cada parte do programa tem responsabilidades bem definidas e sua implementação fica escondida, fica mais f...

Dicas da ocultação da implementação

Quando falamos em ocultação da implementação, estamos nos referindo a um dos princípios mais importantes da programação orientada a objetos. Decidir o que deve ser exposto em uma interface e o que precisa permanecer oculto nem sempre é simples, mas existem orientações que ajudam a tornar essa escolha mais clara. O ponto central é entender que apenas os métodos destinados ao uso por outros devem compor a interface pública, enquanto aqueles que servem apenas para o funcionamento interno da classe devem permanecer ocultos. Outro aspecto essencial é o tratamento das variáveis internas. Elas devem sempre ser escondidas, exceto quando se tratarem de constantes. Mais do que ocultas, recomenda-se que estejam acessíveis somente dentro da própria classe, garantindo maior segurança e evitando que detalhes internos de implementação sejam expostos de forma desnecessária. Esse é um conceito que será explorado de maneira mais aprofundada nas próximas aulas, mas desde já é importante compreender que ...

Dicas e armadilhas do TAD

É natural que, ao aprender sobre Tipos Abstratos de Dados (TADs), você comece a fazer a conexão com classes, um dos pilares da Programação Orientada a Objetos. E você está no caminho certo! A transformação de um TAD em uma classe concreta é, de fato, um passo importante, mas é preciso entender que essa transição possui nuances específicas de cada linguagem de programação. No entanto, por trás dessa diversidade, existem princípios universais que podemos observar. A grande maioria das linguagens OO já vem equipada com palavras-chave e estruturas pensadas justamente para ajudá-lo a construir classes bem encapsuladas, que é a essência de um bom TAD. O primeiro e mais fundamental desses recursos é a própria definição da classe. Pense nela como a evolução natural do conceito de TAD, mas agora turboalimentada com funcionalidades poderosas que você vai explorar e dominar ao longo desta jornada de aprendizado. Dentro do escopo de uma classe, organizamos a realidade do nosso objeto. Lá dentro, e...

Dicas e armadilhas da abstração

Ao escrever uma classe, você pode ter problemas, se tentar trabalhar de forma abstrata demais. É impossível escrever uma classe que satisfaça todos os usuários e cada situação. Imagine que você tivesse de escrever um objeto pessoa para um sistema de folha de pagamento de uma empresa. Esse objeto pessoa vai ser muito diferente de um objeto pessoa no simulador de fluxo de tráfego que discutimos anteriormente. A abstração pode ser perigosa. Mesmo que você tenha abstraído algum elemento, ele poderá não funcionar em todos os casos. É muito difícil escrever uma classe que satisfaça as necessidades de todos os usuários. Não caia na fixação da abstração — resolva seus problemas primeiro! Tudo se resume a fazer o suficiente para resolver o problema imediato. Incluir todos os detalhes necessários para o objeto pessoa funcionar nos dois contextos seria muito dispendioso. Isso pode provocar todos os problemas que você viu hoje, devido à responsabilidade embaralhada. Embora você possa ligar seu obj...

Divisão da responsabilidade: preocupando-se com seu próprio negócio

 A ocultação da implementação evolui naturalmente para uma discussão sobre a divisão da responsabilidade. Na seção anterior, você viu como poderia desacoplar código ocultando detalhes da implementação. A ocultação da implementação é apenas um passo na direção da escrita de código fracamente acoplado. Para ter realmente código fracamente acoplado, você também deve ter uma divisão da responsabilidade correta. Divisão da responsabilidade correta significa que cada objeto deve executar uma função — sua responsabilidade — e executá-la bem. A divisão da responsabilidade correta também significa que o objeto é coesivo. Em outras palavras, não faz sentido encapsular muitas funções aleatórias e variáveis. Elas precisam ter um forte vínculo conceituai entre si. Todas as funções devem trabalhar no sentido de uma responsabilidade comum. A ocultação da implementação e a responsabilidade andam lado a lado. Sem ocultação da implementação, a responsabilidade pode faltar em um objeto. É de responsa...

Protegendo segredos através da ocultação da implementação

Até aqui, você viu que uma interface pode ocultar a implementação subjacente de um objeto. Quando oculta a implementação atrás de uma interface, você protege seu objeto de uso não projetado ou destrutivo. Proteger seu objeto de uso não projetado é uma vantagem da ocultação da implementação. Entretanto, existe outro lado na história: os usuários de seus objetos. A ocultação da implementação leva a um projeto mais flexível, pois ela impede que os usuários de seus objetos se tornem fortemente acoplados à implementação subjacente dos objetos. Então, não apenas a ocultação da implementação protege seus objetos, como também protege aqueles que usam seus objetos, estimulando um código fracamente acoplado. Novo Termo O código fracamente acoplado é independente da implementação de outros componentes. Novo Termo O código fortemente acoplado é fortemente vinculado à implementação de outros componentes. Você poderia estar se perguntando, “para que serve código fracamente acoplado?” Quando um recur...

Protegendo seu objeto através do TAD

O Tipo Abstrato de Dados (TAD) não é um conceito novo. Os TADs, junto com a própria OO, cresceu a partir da linguagem de programação Simula, introduzida em 1966. Na verdade, os TADs são decididamente não OO; em vez disso, eles são um subconjunto da OO. Entretanto, os TADs apresentam duas características interessantes: abstração e tipo. É essa idéia de tipo que é importante, pois sem ela, você não pode ter um verdadeiro encapsulamento. O verdadeiro encapsulamento é imposto em nível de linguagem, através de construções internas da linguagem. Qualquer outra forma de encapsulamento é simplesmente um acordo de cavalheiros, que é facilmente malogrado. Os programadores o contornarão porque podem fazer isso! Novo Termo Um TAD é um conjunto de dados e um conjunto de operações sobre esses dados. Os TADs permitem que você defina novos tipos na linguagem, ocultando dados internos e o estado, atrás de uma interface bem definida. Essa interface apresenta o TAD como uma única unidade atômica. Os TADs...

Aprendendo a pensar e programar de forma abstrata

Imagem
Embora as linguagens OO estimulem o encapsulamento, elas não o garantem. E fácil construir código dependente e frágil. O encapsulamento eficaz vem apenas com um projeto cuidadoso, abstração e experiência. Um dos primeiros passos para o encapsulamento eficaz é aprender como abstrair software e os conceitos subjacentes eficientemente. O que é abstração? Abstração é o processo de simplificar um problema difícil. Quando começa a resolver um problema, você não se preocupa com cada detalhe. Em vez disso, você o simplifica, tratando apenas dos detalhes pertinentes a uma solução. Imagine que você tenha de escrever um simulador de fluxo de tráfego. E possível que você modele classes para sinais de trânsito, veículos, condições da pista, auto-estradas, ruas de mão dupla, ruas de mão única, condições climáticas etc. Cada um desses elementos afetaria o fluxo do tráfego. Entretanto, você não modelaria insetos e pássaros no sistema, mesmo que eles possam aparecer em uma via real. Além disso, você om...

Os três pilares da programação orientada a objetos

Imagem
Para edificar seu entendimento e domínio de OO, você deve primeiro ter uma base sólida a partir da qual possa expandir sua compreensão. Primeiro, você precisará identificar, definir e explorar os conceitos básicos da OO. Somente quando você tiver uma boa base das teorias básicas de OO é que poderá aplicá-la corretamente no software que escrever. Tal discussão o leva naturalmente aos três conceitos que devem estar presentes para que uma linguagem seja considerada realmente orientada a objetos. Esses três conceitos são frequentemente referidos como os três pilares da programação orientada a objetos. Novo Termo Os três pilares da programação orientada a objetos são: encapsulamento, herança e polimorfismo. Como a POO é baseada neles, os três pilares são semelhantes a uma torre de blocos: remova o bloco inferior e tudo mais virá abaixo. O encapsulamento, que você abordará hoje, é uma peça extremamente importante do quebra-cabeça, pois ele forma a base da herança e do polimorfismo.  Enca...