Introdução à Computação, Programação e POO
Enviado por Anônimo e classificado em Computação
Escrito em em
português com um tamanho de 14,27 KB
Tema 1: Introdução ao Computador
Computador: um conjunto de conhecimentos científicos, técnicas e tecnologias que permitem o tratamento automático de dados.
Sistema de Computador: um sistema que processa informação, inter-relacionando entidades. Componentes: hardware (processador), software (programas) e peopleware (usuários / operadores).
Item 2: Programação e Linguagens
Software: um conjunto de instruções que dizem ao computador o que deve fazer de forma precisa.
Os programas não são inteligentes.
Eles não têm iniciativa.
Eles não têm imaginação nem inventividade.
Modelo: simplificação da realidade que permite abstrair detalhes supérfluos e concentrar-se no que é verdadeiramente importante.
Linguagens de Programação
Consoante o nível de abstração:
- linguagem de máquina
- linguagem Assembly
- linguagem de alto nível: C, C++ ...
- 4ª geração: SQL ...
- linguagens baseadas em componentes: Nesc ...
- linguagens de modelagem
De acordo com o estilo de programação:
- declarativa (Prolog, LISP ...)
- imperativa (C, Java, C++ ...)
De acordo com o processo de tradução:
- compiladas
- interpretadas
Componentes de uma linguagem
A linguagem de programação tem dois componentes básicos:
- Sintaxe: o que e como se pode escrever (vocabulário e regras de escrita).
- Semântica: o significado do que se escreve.
Erros em programas
Boa prática: definir de forma sistemática, ordenada e seguindo convenções reduz significativamente os erros semânticos. Fazer um design de programação antes de codificar é uma regra muito importante.
Tipos de erros:
- Erros de compilação: detectados em tempo de compilação; geralmente erros de sintaxe, verificados pelo compilador.
- Erros de execução: detectados em tempo de execução.
- Erros lógicos / não-programador: erros de concepção ou lógica do programa (bugs atribuíveis ao programador).
Mecanismo de exceções em Java — para tratar erros em tempo de execução.
Algoritmos
Algoritmos: estudo dos processos ideais para resolver um problema. Um algoritmo é uma receita para resolver um problema.
Eficiência: a eficiência descreve o desempenho de um algoritmo ao executar uma tarefa de forma ótima. A eficiência de um algoritmo é medida por suas ordens de complexidade (tempo e espaço).
Engenharia de Software: princípios e técnicas de desenvolvimento de software com base em engenharia.
Análise: captação e análise de requisitos.
Requisitos:
- funcionais
- não funcionais: custo, tempo de desenvolvimento, modificabilidade e extensibilidade, tempo de execução, tempo de implementação global ...
Design: várias propostas são feitas para que o cliente decida qual deseja.
Implementação: parte menos criativa: codifica-se um projeto.
Ensaios / V&V (Verificação e Validação)
Manutenção de software (≈ 80% do ciclo):
- extensão e melhorias (≈ 10%)
- resolução de problemas e correção de erros (≈ 60%)
- realização de testes periódicos (≈ 30%)
Item 3: Introdução à Programação
(Conteúdo introdutório sobre programação — ver itens seguintes para mais detalhes.)
Item 4: Programação Estruturada
Princípios de programação estruturada:
- Um programa é uma sequência de instruções.
- Princípio do empilhamento: qualquer ação pode ser substituída por duas ou mais ações em sequência.
- Princípio das estruturas básicas: qualquer ação pode ser substituída por uma das três estruturas de controlo válidas:
- sequência
- seleção (condicional)
- iteração (repetição)
Todas as estruturas de controlo devem ter um único ponto de entrada e um único ponto de saída. Estas regras podem ser aplicadas repetidamente conforme necessário.
Item 5: Processos e Abstração de Dados
Programação estruturada (ver item 4).
Programação modular — princípio "dividir para conquistar".
Benefícios da programação modular
- Encapsulamento de algoritmos: os módulos podem ser generalizados como operadores que recebem alguns parâmetros de entrada (0 ou mais) e produzem resultados de saída (0 ou mais).
- Vantagem: se for necessário corrigir, melhorar ou modificar um módulo, só é preciso alterar a sua implementação.
- Código modular facilita modificar e depurar o programa.
- Abstração processual: um módulo pode ser reutilizado quantas vezes forem necessárias sem repetir o código — módulos como caixas-pretas.
- Vantagem: código menor, sem duplicação e, portanto, mais legível.
Em Java, módulos são chamados de métodos.
Tipos de classes em Java
- classe
- biblioteca
- métodos estáticos de biblioteca: métodos que não necessitam de um objeto para ser executados; são chamados usando o nome da classe.
- classes de objetos modelados
Uma classe descreve a estrutura (atributos) e o comportamento (métodos não estáticos).
Parâmetros de métodos
Na definição, os parâmetros são chamados de parâmetros formais (tipo + identificador). Quando invocamos um método, os valores passados são os parâmetros atuais (valores literais ou variáveis).
Passagem de argumentos em Java:
- passagem por valor: é passada uma cópia do valor;
- passagem por referência: passa-se o endereço de memória (ponteiro) — observar que, em Java, tudo é passado por valor (o valor de referências é copiado).
Os métodos sempre recebem zero ou mais parâmetros de entrada. Os parâmetros formais em Java recebem uma cópia dos parâmetros atuais; alterar um parâmetro formal dentro do método não altera a variável atual passada, salvo se a cópia for uma referência para um objeto cujo conteúdo for modificado.
Sobrecarga de métodos
Em Java você pode definir vários métodos com o mesmo nome dentro da mesma classe, desde que tenham assinaturas diferentes. Quando isso acontece, dizemos que o método está sobrecarregado. A versão invocada depende da lista de parâmetros reais (número, tipo e ordem).
Duas versões de um método são válidas se e somente se têm assinaturas diferentes. O tipo de retorno não faz parte da assinatura.
Assinatura de um método: assinatura = nome + lista de parâmetros.
Abstração
Abstração de controlo (loops), abstração processual (métodos) e abstração de dados (tipos abstratos de dados, classes).
Resumo do tipo de dados abstrato (TDA / ADT): modelo ou estrutura abstrata que define a estrutura (atributos) e comportamento (métodos) dos objetos que pertencem a essa classe.
Envolucros (wrappers) são usados quando precisamos de um objeto em vez de um tipo de dados primitivo (por exemplo, para estruturas encadeadas onde um elemento referencia o próximo).
Métodos não estáticos: executam a pedido de uma instância.
Métodos estáticos: pertencem à classe e podem ser chamados sem um objeto.
Item 6: Recursividade (vs. Iteração)
Recursão é quando algo chama a si próprio; tem relação com o princípio de indução.
Recursão pode consumir muita memória, pois mantém variáveis de método em pilha durante a execução, e também pode levar mais tempo. A recursão é cara, mas muitas vezes mais natural e preferida para certas soluções. Por exemplo, não é viável calcular recursivamente o fatorial de um milhão em Java por limitações de memória, embora a recursão seja útil para escrever e entender certos programas.
Recursão versus Iteração
- Ambas executam repetição:
- a) solução iterativa repete o corpo do laço;
- b) solução recursiva repete chamadas ao método recursivo.
- Ambas têm uma condição de término:
- a) solução iterativa: termina quando a condição de continuação do laço deixa de ser satisfeita;
- b) solução recursiva: termina quando se alcança o caso base (indução), desencadeando uma sequência de retorno.
- Ambas devem convergir para a solução (princípio da convergência):
- a) solução iterativa: deve garantir que a condição de término será alcançada;
- b) solução recursiva: deve garantir que o caso base será alcançado.
Princípio importante: qualquer solução recursiva tem uma solução iterativa equivalente, embora o inverso nem sempre seja tão direto.
Backtracking
Backtracking: técnica de busca que envolve tentativa e retrocesso (backtracking) na resolução de problemas por sucessão de decisões experimentais.
Teoria do 2º Semestre
1. Encapsulamento em tempo de desenvolvimento
Construímos uma classe que agrupa dados e métodos correspondentes ao conceito modelado.
2. Encapsulamento em tempo de execução
Quando a classe existe e criamos objetos, eles são tratados como caixas-pretas. Objetos encapsulam dados e métodos; deve-se interagir com eles apenas por meio da sua interface pública. O estado de um objeto deve ser modificado apenas através dos seus próprios métodos.
3. Interface: definição e propriedades
Uma interface é uma coleção de constantes e métodos abstratos. Interfaces não são utilizadas sozinhas; devem ser implementadas por classes que fornecem implementações dos métodos declarados. Uma classe pode implementar várias interfaces, permitindo algum nível de herança múltipla.
4. Abstração
Encapsulamento é uma forma de abstração. Em baixo nível de abstração manipulamos dados e métodos individualmente; em alto nível consideramos a classe como uma unidade e usamos apenas seus serviços.
5. Relações entre classes
- generalização (herança)
- associação
- uso (dependency / utilização)
6. Generalização (herança)
Relação entre um elemento geral (superclasse) e um caso específico (subclasse). A subclasse herda atributos (dados) e procedimentos (métodos) do pai e pode adicionar os seus próprios.
7. Associação
Indica que uma classe é composta por outras classes usando objetos de uma classe como atributos de outra. A multiplicidade indica quantos objetos estão ligados em uma associação.
8. Uso (dependência)
Relação de utilização: quando uma mudança no estado de um objeto (independente) afeta o estado de outro (dependente), mas não vice-versa.
9. Construtores
Construtores são um ou mais métodos (podem ser sobrecarregados) usados para criar objetos de uma classe. Têm o mesmo nome da classe e não têm tipo de retorno, mas podem aceitar parâmetros para inicializar as variáveis do objeto.
10. Referências
Na atribuição por referência, se duas variáveis referenciam o mesmo objeto, alterar o conteúdo através de uma referência altera o objeto acessado pela outra, pois ambas referenciam a mesma instância.
11. Modificadores
Visibilidade:
- public: acessível de qualquer lugar;
- protected: acessível por classes no mesmo pacote ou por subclasses;
- private: acessível apenas na mesma classe;
- final: usado para declarar constantes (não permite alteração);
- static: faz a variável ou método pertencer à classe, sendo comum a todos os objetos.
Métodos estáticos podem ser chamados sem um objeto daquela classe.
12. Três características-chave da POO
encapsulamento, herança e polimorfismo.
13. Polimorfismo
Capacidade de uma referência referir-se a objetos de várias classes relacionadas por herança. Na prática, uma referência pode apontar para qualquer objeto da sua classe ou de uma subclasse.
14. Abstração e classes abstratas
Classes abstratas podem declarar métodos sem implementar sua lógica, obrigando classes filhas a implementá-los. Se o método não fosse abstrato, a classe filha poderia herdar a implementação do pai.
15. Exceções
- Exceções verificadas (checked): é obrigatório capturá-las com try/catch ou declará-las na cláusula throws; caso contrário, geram erro de compilação.
- Exceções não verificadas (unchecked): não precisam ser declaradas; são erros que podem ser evitados ao programar corretamente (ex.: divisão por zero, acesso fora dos limites de um array, etc.).
16. Frameworks
Um framework é uma aplicação semi-completa que pode ser especializada e reutilizada por meio de mecanismos de extensão ou configuração para produzir aplicações específicas, frequentemente incluindo infraestrutura de implementação.
O ponto-chave de um framework é definir pontos que podem ser alterados ou especializados pelo programador (hot spots) e código estável. Frameworks são projetados usando design patterns.
17. Árvores binárias
Estruturas formadas por nós onde existe um nó primeiro (raiz), que tem dois nós descendentes; a partir daí cada nó pode ter, por sua vez, dois nós descendentes. Cada nó tem um valor "V", um filho esquerdo e um filho direito.