Baixe o app para aproveitar ainda mais
Prévia do material em texto
PARADIGMAS DE LINGUAGENS 1 ALGORITMOS E PROGRAMAS Um algoritmo é uma norma executável para estabelecer um certo efeito desejado, que na prática será geralmente uma descrição detalhada para solucionar um certo tipo de problema. Programas são “formulações concretas de algoritmos abstratos, baseados em representações e estruturas específicas de dados”. Ou ainda “é a expressão de um algoritmo de modo que possa ser executado por um computador”. Exemplo de algoritmo para trocar uma lâmpada queimada: “pegar uma lâmpada nova no armário”; “pegar a escada na área de serviço”; “subir na escada com a lâmpada nova na mão”; “retirar a lâmpada queimada”; “colocar a lâmpada nova”; “descer a escada”; “testar se a lâmpada nova está funcionando” Seguindo com o exemplo da troca de lâmpadas, vamos supor que há a possibilidade de que a escada disponível não seja alta suficiente para alcançar a lâmpada e que, neste caso, gostaríamos prever este possível erro. Poderíamos reescrever o algoritmo desta forma: “pegar uma lâmpada nova no armário”; “pegar a escada na área de serviço”; “subir na escada com a lâmpada nova na mão”; se “for possível alcançar a lâmpada a ser trocada” então “retirar a lâmpada queimada”; “colocar a lâmpada nova”; fim-se; “descer da escada”; “guardar a escada”; Outro caso: supondo que havia várias lâmpadas para serem trocadas na casa. Poderíamos reescrever o algoritmo desta forma: “pegar todas as lâmpadas novas no armário”; “pegar a escada na área de serviço”; enquanto “existirem lâmpadas novas disponíveis” faça “subir na escada com uma lâmpada nova na mão”; se “for possível alcançar a lâmpada a ser trocada” então “retirar a lâmpada queimada”; “colocar a lâmpada nova”; fim-se; “descer da escada”; fim-enquanto; “guardar a escada”; PARADIGMAS DE LINGUAGENS 2 LINGUAGENS DE PROGRAMAÇÃO 1. É um método padronizado para expressar instruções para um computador; 2. É um conjunto de regras sintáticas e semânticas usadas para definir um programa de computador; 3. O conjunto de palavras (tokens), compostos de acordo com essas regras, constituem o código fonte de um software. Esse código fonte é depois traduzido para código de máquina, que é executado pelo processador. Um compilador é um programa de computador que, a partir de um código fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, porém escrito em outra linguagem, a linguagem alvo. PROCESSO DE DESENVOLVIMENTO DE PROGRAMAS Um processo de desenvolvimento de software é um conjunto de atividades, parcialmente ordenadas, com a finalidade de obter um produto de software (Engenharia de Software). Principais atividades do desenvolvimento de software: Análise de Requisitos � Projeto � Codificação � Testes � Implantação � Manutenção ESTILO E QUALIDADE DE PROGRAMAS Cada linguagem de programação aceita um estilo ou grupo de normas para que você escreva o programa. Os estilos mais comuns hoje em dia são: • Programação Procedural Nesse tipo de programação o programa é dividido em partes menores para facilitar a resolução do problema como um todo. Essas partes menores podem ser chamadas de procedimentos, de funções ou rotinas. • Programação Orientada a Objetos A idéia principal é fazer com que o programa e seu funcionamento se pareçam ao máximo com o mundo real. Na POO cada uma das funções ou procedimentos do programa estão dentro de uma classe. A qualidade de software abrange uma série de características: • Confiabilidade • Funcionabilidade • Usabilidade • Eficiência • Manutenibilidade • Portabilidade Linguagem fonte Linguagem alvo COMPILADOR PARADIGMAS DE LINGUAGENS 3 TIPOS DE DADOS Variáveis são os elementos básicos que um programa manipula. Uma variável é um espaço reservado na memória do computador para armazenar um tipo de dado determinado. Toda variável possui uma série de informações: • Nome: uma identificação. • Escopo: onde a variável é visível. • Tipo: especificação de classe de valores, operadores e operações válidas sobre o tipo. • Valor: conteúdo cuja interpretação depende do tipo. Tipos de dados é uma combinação de valores e de operações que uma variável pode executar, o que pode variar conforme o sistema operacional e a linguagem de computador. São utilizados para indicar ao compilador as conversões necessárias para obter os valores em memória durante a construção do programa. A amarração do tipo com a variável pode ser: • Estática: ⇒ Explícita: por declaração ⇒ Implícita: indicado pela primeira ocorrência • Dinâmica: ⇒ Em função do valor corrente. Tipos de Dados Primitivos • char: Caracter: O valor armazenado é um caractere. Caracateres geralmente são armazenados em códigos (usualmente o código ASCII). • int: Número inteiro é o tipo padrão e o tamanho do conjunto que pode ser representado normalmente depende da máquina em que o programa está rodando. • float: Número em ponto flutuante de precisão simples. São conhecidos normalmente como números reais. • double: Número em ponto flutuante de precisão dupla. • void: Este tipo serve para indicar que um resultado não tem um tipo definido. Uma das aplicações deste tipo em C é criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores. Tabela: alguns tipos de dados definidos pelo Padrão ANSI C, seus tamanhos em bytes e suas faixa de valores: Tipo Tamanho em Bytes Faixa Mínima char 1 -127 a 127 unsigned char 1 0 a 255 int 4 -2.147.483.648 a 2.147.483.647 unsigned int 4 0 a 4.294.967.295 short int 2 -32.768 a 32.767 unsigned short int 2 0 a 65.535 long int 4 -2.147.483.648 a 2.147.483.647 unsigned long int 4 0 a 4.294.967.295 float 4 Seis digitos de precisão double 8 Dez digitos de precisão PARADIGMAS DE LINGUAGENS 4 Tipo String de Caracteres É um tipo de dados composto definido através de um array (sequência) de caracteres. Exemplos (literais ou constantes): “Programação continua no 2º semestre!” “Amélia” Sintaxe na linguagem C: char nome[NUM-MAX] Ex: char descricao[20]; Tipo Ordinais Definidos pelo Usuário Muitas vezes é necessário manipular dados complexos que seriam difíceis de representar usando apenas os tipos primitivos (char, int, double, float). Na linguagem C o tipo de dado struct permite a definição deste tipo de dado. A struct é um tipo de dados resultante do agrupamento de várias variáveis nomeadas, não necessariamente similares, numa só. Ex.: struct mystruct { int a, b, c; double d, e, f; char string[25]; }; Tipo Array Arrays, também chamados vetores ou ainda matrizes, são uma maneira de armazenar vários dados num mesmo nome de variável através do uso de índices numéricos. Declaramos vetores de maneira muito semelhante à declaração de variáveis normais. A única diferença é que depois do nome da variável deve ser informada a quantidade de elementos do vetor. Para declarar um vetor chamado vetorx, com cinco elementos inteiros, escrevemos: int vetorx[5]; /*Declaração */ vetorx[0] = 3; /*Inicializando uma ocorrência */ int x = vetorx[2]; /*Copiando do vetor para variável */ Tipo Ponteiro Um ponteiro é simplesmente uma variável que armazena o endereço de outra variável. Em C, para declarar um ponteiro especificamos o tipo da variável para a qual ele aponta e seu nome precedido por asterisco: int *ponteiro; /* declaraum ponteiro para um inteiro */ e para para atribuir e acessar endereços de memória, a linguagem oferece dois operadores unários: & (endereço de) * (conteúdo do endereço apontado por) Ex.: int a; /* declara variável tipo inteiro */ int *p; /* declara variável tipo ponteiro para inteiro */ a = 5; /* a recebe o valor 5 */ p = &a; /* p recebe o endereço de a */ *p = 6; /* conteúdo do endereço apontado por p recebe 6 */ PARADIGMAS DE LINGUAGENS 5 EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO Expressões Aritméticas São aquelas que quando avaliadas produzem resultados numéricos. Constituem na aplicação de operadores aritméticos a operandos que têm valores numéricos. Nas linguagens de programação nós podemos executar operações aritméticas usando variáveis e constantes. Algumas operações mais comuns são: + adição - subtração * multiplicação / divisão % resto (módulo) Estas operações podem ser usadas como mostram os exemplos abaixo, assumindo que as variáveis necessárias já estão declaradas: celsius = (fahrenheit - 32) * 5.0 / 9.0; forca = massa * aceleracao; i = i + 1; Precedência de Operadores Assim como em álgebra, há uma ordem de precedência de operadores. As expressões em parênteses são avaliadas primeiro, seguidos por exponenciação, multiplicação, divisão, adição e subtração. Quando operações adjacentes têm a mesma precedência, elas são associadas da esquerda para a direita. Assim, a * b / c * d % e é o mesmo que ((((a * b) / c) * d) % e). A Operação de Resto (%) Esta operação é usada quando queremos encontrar o resto da divisão de dois inteiros. Por exemplo, 22 dividido por 5 é 4, com resto 2. Em C , a expressão 22 % 5 terá valor 2. Conversões de Tipo Uma conversão de estreitamento é aquela que converte um objeto para um tipo que não pode incluir todos os valores do tipo original. Por ex.: double para float, ou double para int. Uma conversão de alargamento é aquela na qual um objeto é convertido para um tipo que pode incluir pelo menos aproximações para todos os valores do tipo original. Por ex.: float para double, int para double. São sempre seguras mais seguras. PARADIGMAS DE LINGUAGENS 6 Uma coerção é uma conversão de tipo implícita, ou seja, o compilador realiza automaticamente as conversões necessárias. Por ex. em C: int a, b; float c; a = b * c; Uma conversão de tipo explícita, também conhecida como “casting”, deve ser declarada pelo programador no código. Por ex. em C: (int) speed /* sendo speed do tipo float */ Expressões Relacionais e Booleanas Um operador relacional compara os valores de seus dois operandos. Uma expressão relacional tem dois operandos e um operador relacional. Operadores relacionais sempre têm menor precedência do que os operadores aritméticos. Ex.: c = a + 1 > 2 * b; As expressões booleanas consistem em variáveis, em expressões relacionais e em operadores booleanos, que normalmente incluem aquelas para operações AND, OR e NOT. Instruções de Atribuição Sintaxe geral: <variável_alvo> <operador_atribuição> <expressão> Operadores de atribuição: = FORTRAN, BASIC, PL/I, C, C++, Java := ALGOLs, Pascal, Ada Operadores Compostos: a = a + b pode ser escrito como a += b Operadores Unários: cont++ (cont incrementado) cont-- (cont decremantado) PARADIGMAS DE LINGUAGENS 7 ESTRUTURAS DE CONTROLE Estruturas Condicionais Estrutura também conhecida como de decisão ou seleção, se caracteriza por executar determinados códigos de programação dependendo da veracidade de uma condição. Esta estrutura se subdivide em outras duas estruturas. Estrutura Condicional Simples Nesta estrutura, a condição irá determinar a execução ou não de um determinado comando. Descrição Narrativa: Se fizer sol então vou à praia. Linguagem Algorítmica: Se tempo = sol então Vou à praia Fim-se. Estrutura Condicional Composta Nesta , a condição ira determinar qual comando será executado dentre dois listados. Na estrutura simples temos “Se.....Então”, e neste caso teremos “Se.....Então.....Senão”. Descrição Narrativa: Se fizer sol então vou à praia senão jogarei cartas. Linguagem Algorítmica: Se tempo = sol então Vou à praia Senão Jogarei cartas Fim-se. Estrutura Condicional Composta (case) Esta estrutura é muito utilizada quando é necessário utilizar o comando if repetidas vezes para testar uma mesma variável. Descrição Narrativa: Caso o mês seja igual a 1 então é janeiro, caso igual a 2 então é fevereiro, caso igual a 3 então é março e assim por diante. Linguagem Algorítmica: Caso mês seja 1: mesext = Janeiro; 2: mesext = Fevereiro; 3: mesext = Março; 4: mesext = Abril; 5: mesext = Maio; 6: mesext = Junho; 7: mesext = Julho; 8: mesext = Agosto; 9: mesext = Setembro; 10: mesext = Outubro; 11: mesext = Novembro; 12: mesext = Dezembro; Fim-caso. PARADIGMAS DE LINGUAGENS 8 Estruturas de Repetição Essa estrutura trabalha com a repetição de comandos até que condições se satisfaçam. Esta estrutura e subdividida em três sub-estruturas: Estrutura de repetição com teste no início (comando while-do) Os comandos contidos neste tipo de estrutura podem não ser executados nenhuma vez, já que o mesmo testa a condição no início da estrutura. Descrição Narrativa: Enquanto não fizer sol, faça: ficarei em casa. Linguagem Algorítmica: Enquanto tempo <> sol faça Ficar em casa Olhar o tempo Fim-enquanto. Agora vou à praia Enquanto o tempo for diferente de sol ou seja, não tiver sol, (condição verdadeira) a estrutura irá executar os comandos contidos nela, e este se repetirá até que o tempo seja igual a sol, pois quando o tempo for igual a sol a condição será falsa, somente assim poderemos sair da estrutura de repetição while e executar o comando “Agora vou à praia”. Estrutura de repetição com teste no final (comando repeat-until) Permite a repetição dos comandos contidos nesta estrutura até que a mesma seja verdadeira. Neste tipo de estrutura o comando sempre será executado pelo menos uma vez. Descrição Narrativa: Ficarei em casa até que faça sol. Linguagem Algorítmica: Repita Ficarei em casa Até que tempo = sol Agora vou à praia Estrutura de repetição automática (comando for) Permite que a repetição dos comandos contidos nesta estrutura seja repetida um número específico de vezes. Descrição Narrativa: Imprimir na tela os números de 1 a 100. Linguagem Algorítmica: Para NUM = 1 até 100 faça Imprimir NUM Fim-para. Neste exemplo ao iniciar o comando Para, a variável NUM receberá o valor do primeiro número da condição (no caso 1) e será impresso na tela. Quando esse comando se repetir o NUM passará a ter o valor de NUM + 1, ou seja 2, e será impresso novamente na tela. Isso se repetirá até que NUM seja igual a 100. PARADIGMAS DE LINGUAGENS 9 SUBPROGRAMAS Procedimentos Procedimentos (ou sub-rotinas) e funções são módulos hierarquicamente subordinados a um algoritmo, comumente chamado de módulo principal. Da mesma forma um procedimento ou uma função pode conter outras procedimentos e funções aninhadas. A declaração de um procedimento ou função é constituídade um cabeçalho, que a identifica e contém seu nome e uma lista de parâmetros formais, e de um corpo que contém declarações locais e os comandos. Declaração de procedimento: procedimento NOME (lista-de-parâmetros-formais) declarações dos objetos locais ao procedimento comandos do procedimento fim procedimento Chamada de procedimento: NOME (lista-de-parâmetros-atuais) Funções As funções têm a característica de retornar ao algoritmo que as chamou um valor associado ao nome da função. Declaração de função: função tipo NOME (lista-de-parâmetros-formais) declarações dos objetos locais a função comandos da função fim função Chamada da função: NOME (lista-de-parâmetros-atuais) Como esta função irá retornar um valor, este pode ser atribuído a alguma variável, contanto que esta seja de tipo compatível. A ← NOME (lista-de-parâmetros-atuais) Ao terminar a execução dos comandos de uma sub-rotina ou função, o fluxo de controle retorna ao comando seguinte àquele que provocou a chamada. PARADIGMAS DE LINGUAGENS 10 Parâmetros A vinculação entre módulos pode ser feita através da transferência ou passagem de parâmetros, que associam parâmetros atuais com parâmetros formais. Parâmetros Atuais: São os parâmetros passados na chamada do procedimento ou função. Parâmetros Formais: São os parâmetros usados na declaração do procedimento ou função. Métodos de Passagem de Parâmetros Dentre os modos de transferência de parâmetros pode-se destacar a passagem por valor e a passagem por referência. Na passagem de parâmetros por valor, as alterações feitas nos parâmetros formais, dentro do procedimento ou função, não se refletem nos parâmetros atuais. O valor do parâmetro atual é copiado no parâmetro formal, na chamada do procedimento ou função. /* Exemplo em C de passagem de parametro por valor */ #include <stdio.h> float sqr(float num) { num = num * num; return num; } /*----------------------*/ int main() { float num, result; printf("Entre com um numero: \n"); scanf("%f", &num); result = sqr(num); printf("Resultado = %f \n", result); printf("Valor atual de num = %f \n", num); return 0; } Na passagem de parâmetros por referência, a toda alteração feita num parâmetro formal corresponde a mesma alteração feita no seu parâmetro atual associado. /* Exemplo em C de passagem de parametro por referencia */ #include <stdio.h> void troca(int *campoa, int *campob) { int temp; temp = *campoa; *campoa = *campob; *campob = temp; } /*-----------------------------------*/ int main() { int numa, numb; printf("Entre com o numeroa: \n"); scanf("%d", &numa); printf("Entre com o numerob: \n"); scanf("%d", &numb); troca(&numa, &numb); printf("Valor apos a troca de num.a=%d e num.b=%d \n", numa, numb); return 0; } PARADIGMAS DE LINGUAGENS 11 PROGRAMAÇÃO ESTRUTURADA Introdução A programação imperativa é um paradigma que descreve a computação como ações (comandos) e estados (variáveis) de um programa. O nome do paradigma, Imperativo, está ligado ao tempo verbal imperativo, onde o programador diz ao computador: faça isso, depois isso, depois aquilo... Este paradigma de programação se destaca pela simplicidade, uma vez que todo ser humano, ao se programar, o faz imperativamente, baseado na ideia de ações e estados, quase como um programa de computador. Em linguagens puramente imperativas, como Assembly, é muito fácil o programador criar códigos de difícil leitura, pois esse tipo de linguagem possui o que se chama de saltos (jumps) em sua estrutura. Estes saltos funcionam da seguinte forma: o programador define uma marcação (label) no código e depois, a partir de qualquer parte do programa, ele pode executar um desvio de fluxo de execução (salto) para aquela marcação. Pode ser que à primeira vista isso não tenha problema, contudo, na depuração do código, o programador fica em apuros com tantas marcações e saltos, pois isso dificulta o entendimento do fluxo de execução do programa. Neste contexto, surge a programação estruturada, como uma forma de possibilitar que o programador tenha maior controle sobre sobre o fluxo de execução do programa. A Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as subrotinas e as funções. Foi a forma dominante na criação de software entre a programação linear e a programação orientada por objetos. Este paradigma preconiza que todos os programas possíveis podem ser reduzidos a apenas três estruturas: seqüência, decisão e iteração: • Estruturas de sequência: ⇒ Onde uma tarefa é executada após a outra, linearmente. • Estruturas de decisão: ⇒ Onde, a partir de um teste lógico, determinado trecho de código é excutado, ou não. • Estruturas de iteração: ⇒ Onde, a partir de um teste lógico, determinado trecho de código é repetido por um número finito de vezes. No trecho de código Python a seguir, podemos reparar o emprego das três estruturas citadas: 1. print "Tabuada!" 2. a = int(raw_input("Entre com a tabuada que deseja [0-9]: ")) 3. print # Apenas para deixar uma linha em branco. 4. 5. if 0 <= a <= 9: 6. for i in range(10): 7. print "%d x %d = %.2d" % (a, i, a * i) 8. else: 9. print "Valor deve ser entre ZERO e NOVE!" PARADIGMAS DE LINGUAGENS 12 Nas linhas 1, 2 e 3 temos um exemplo de uma estrutura de sequência. Cada linha é executada após a anterior, começando da primeira. Entre as linhas 5 e 9, temos uma estrutura de decisão, exemplificada pelo comando if. Na linha 5 este comando executa um teste lógico. Caso o valor seja verdadeiro, as linhas 6 e 7 serão executadas. Caso contrário, o fluxo se desvia para a linha 8, que executará a linha 9. Nas linhas 6 e 7, temos uma estrutura de iteração. Na linha 6 está declarada a estrutura, que regula quantas vezes a linha 7 será executada. Apesar de ter sido sucedida pela programação orientada por objetos, pode-se dizer que a programação estruturada ainda é marcantemente influente, uma vez que grande parte das pessoas ainda aprendem programação através dela. Linguagens C; Basic; Pascal; Cobol; Vantagens • Os problemas podem ser quebrados em vários subproblemas. • É fácil de entender e a boa legibilidade e a boa compreensão da estrutura deste paradigma motivam os programadores a iniciarem a programação pelo modelo estruturado. Desvantagens • Os dados são separados das funções. • Mudanças na estrutura dos dados acarreta alteração em todas as funções relacionadas. • Gera sistemas difíceis de serem mantidos. PARADIGMAS DE LINGUAGENS 13 PROGRAMAÇÃO ORIENTADA A EVENTOS Conceitos Programação orientada a eventos é um paradigma de programação. Diferente de programas tradicionais que seguem um fluxo de controle padronizado, o controle de fluxo de programas orientados a evento são guiados por indicações externas, chamadas eventos. Sua aplicação é grande no desenvolvimento de sistemas de interface com o usuário. A programação orientada a eventos baseia-se na inexistência de um algoritmo principal que, em uma programação tradicional (imperativa), corresponde a um programa com início e fim. Em um programa orientado a eventos, tudo o que temos são formuláriosque contém vários controles e a cada ação do usuário (a que denominamos evento), o programa responde com a execução de um procedimento. Esse método é bastante flexível e permite um sistema assíncrono. As telas do sistema operacional Windows são um bom exemplo disso: quando clicamos no menu Iniciar da barra de ferramentas do Windows ele nos responde com um menu suspenso. Portanto, podemos clicar em botões, colocar o foco nos campos de digitação, abrir (carregar) formulários / janelas, etc. Apenas com esses exemplos já executamos três eventos: • Clicar • Carregar • Colocar foco Programas orientados a evento geralmente consistem em vários pequenos tratadores, subprogramas que processam os eventos para produzir respostas, e um disparador, que invoca os pequenos tratadores. Uma alternativa consiste em disparar os tratadores por eles próprios, criando um efeito de evento em cascata. Exemplos de linguagens orientadas a eventos: Visual Basic, Object Pascal. Formulário: uma superfície retangular que serve para modelar o fundo de imagem e para receber diversos componentes. Normalmente define uma janela. Componente: um objeto que pode ser anexado a um formulário para acrescentar uma determinada funcionalidade. PARADIGMAS DE LINGUAGENS 14 Exemplo de uma aplicação simples em Visual Basic 6: Criando um formulário com o nome de “Form1” e um com- ponente button com o nome de “Command1” Visualizando o evento “Click” do componente button No procedimento referente ao evento “Click” do componente button, adiciona-se o código que deve ser executado quando o evento ocorrer: Private Sub Command1_Click() MsgBox "Hello, World!" End Sub Quando o programa é executado e o usuário dá um clique No botão “Command1”, a seguinte mensagem é exibida como resultado do código acima. PARADIGMAS DE LINGUAGENS 15 TIPOS ABSTRATOS DE DADOS (TAD) Fundamentalmente, um Tipo Abstrato de Dados - TAD - significa um conjunto de dados e um conjunto de operações que serão efetuadas sobre esses dados. Nao se leva em conta detalhes de implementação. Por exemplo, se criarmos uma variável do tipo fruta, ela poderia assumir os valores pera, maçã, etc., e as operações que poderíamos fazer sobre esta variável seriam comprar, lavar, etc. Uma biblioteca pode ser vista como um tipo abstrato de dados. Ela é composta de: • Funcionários • Usuários • Livros • Estantes • Horário de funcionamento, etc... As operações adequadas a uma biblioteca seriam: • Catalogar livro no acervo • Retirar livro do acervo • Catalogar usuário • Retirar Livro • Devolver livro, etc... Evidentemente modelar uma biblioteca como um tipo abstrato de dados pode ser muito complexo. No entanto ela serve como exemplo de que é possível pensar na sua organização e em operações que possam ser realizadas sobre ela independentemente da sua implementação. Encapsulamento Em vez de ver um programa como uma única entidade grande e monolítica, o encapsulamento permite que você o divida em várias partes menores e independentes. Cada parte possui implementação e realiza seu trabalho independentemente das outras partes. O encapsulamento mantém essa independência, ocultando os detalhes internos, ou seja, a implementação de cada parte, através de uma interface externa. O encapsulamento permite a visualização de uma entidade de software como uma caixa preta. Você sabe o que a caixa preta faz, pois conhece sua interface externa e, simplesmente, envia mensagens para a caixa preta, não se preocupando com o que acontece dentro dela; você apenas se preocupa com o fato de que isso aconteça. PARADIGMAS DE LINGUAGENS 16 Uma interface lista os serviços fornecidos por um componente. A interface é um contrato com o mundo exterior, que define exatamente o que uma entidade externa pode fazer com o objeto. Uma interface é o painel de controle do objeto. Vantagens de encapsular: • Independência, que significa que você pode reutilizar o objeto em qualquer lugar. Quando você encapsular corretamente seus objetos, eles não estarão vinculados a nenhum programa em particular. Para usar o objeto em qualquer lugar, você simplesmente exerce sua interface. • O encapsulamento permite que você torne transparentes as alterações em seu objeto. Desde que você não altere sua interface, todas as alterações permanecerão transparentes para aqueles que estiverem usando o objeto. • Usar um objeto encapsulado não causará efeitos colaterais inesperados com o restante do programa. Como o objeto tem implementação independente, ele não terá nenhuma outra interação com o restante do programa, além de sua interface. As três características do encapsulamento eficaz são: • Abstração Abstração é o processo de simplificar um problema difícil. Quando se 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. A abstração possui duas vantagens. Primeiro, ela permite que você resolva um problema facilmente. Mais importante, a abstração o ajuda a obter reutilização. • Ocultação da implementação Você também precisa ocultar as implementações internas de seus objetos. A ocultação da implementação tem duas vantagens: - Ela protege o seu objeto de seus usuários; - Ela protege os usuários de seu objeto do próprio objeto. • Divisão da responsabilidade Divisão da responsabilidade correta significa que cada objeto deve executar uma função – sua responsabilidade – e executá-la bem. Assim que dois objetos começam a fazer a mesma tarefa, você sabe que não tem uma divisão correta de responsabilidades. Quando aparecer a lógica redundante é preciso refazer o código. O encapsulamento é como o gerente eficiente. Como no mundo real, conhecimento e responsabilidade precisam ser delegados para aqueles que sabem como fazer o trabalho da melhor forma possível. PARADIGMAS DE LINGUAGENS 17 PROGRAMAÇÃO ORIENTADA A OBJETOS A orientação a objetos é um paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. É tida como a melhor estratégia para se eliminar a dificuldade no processo de modelar o mundo real do domínio do problema em um conjunto de componentes de software que seja o mais fiel na sua representação. A análise e projeto orientados a objetos têm como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos. Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina: • O comportamento - definido nos métodos (ou operações); • Os estados possíveis - através dos atributos; • O relacionamento com outros objetos. C♯, VB.NET, Java, Python, Ruby exemplos de linguagens de programação orientadas a objetos. Classe • Classe representa um conjunto de objetos com características semelhantes. • Classe de objetos: descreve umgrupo de objetos com propriedades (atributos) semelhantes, o mesmo comportamento (métodos) e os mesmos relacionamentos com outros objetos. Por exemplo: pessoa, animal, processo (programa) podem ser classes: ⇒ Cada pessoa tem idade, QI, peso. ⇒ Cada animal de idade, raça, peso ⇒ Cada processo tem um dono, prioridade, lista de recursos • Por que a existência de classes? ⇒ Capacidade de generalizar casos semelhantes. ⇒ Definições comuns como nome dos atributos são armazenados uma vez por classe. ⇒ Os métodos ou operações são escritos uma vez por classe, o que possibilita a reutilização do código. Objeto • Um objeto pode ser real ou abstrato, por exemplo: ⇒ Uma nota fiscal. ⇒ Uma organização. ⇒ Uma peça de um motor. ⇒ Um icone na tela. ⇒ Um processo de preenchimento de um pedido de compras. • Todos objetos tem identidade e são distinguíveis: ⇒ Duas maçãs da mesma cor, formato e textura continuam sendo maçãs distintas. ⇒ Dois gêmeos idênticos: mesmo caso PARADIGMAS DE LINGUAGENS 18 • Instância de objeto: quando nos referimos a uma coisa exata, com precisão. Por exemplo: ⇒ Nota fiscal → classe de objeto ⇒ Nota fiscal número 123456 → instância do objeto nota fiscal • Em análise e projeto baseados em objetos podemos definir um objeto como: "É qualquer coisa, real ou abstrata, sobre a qual armazenamos dados e operações (ou métodos) que manipulam os dados". Atributos • É um valor de dado guardado pelos objetos de uma classe. • Cada nome de atributo é único dentro da classe. • Cada atributo possui um valor para cada instância de objeto. Classe e atributos Instâncias de objeto da classe PESSOA Operações e Métodos • Operação é uma função ou transformação que pode ser aplicada a uma classe de objetos. • Todos objetos de uma classe compartilham as mesmas operações. • Exemplo: ⇒ Contratar, demitir, pagar-dividendos → operações da classe "empresa" ⇒ Abrir, fechar, minimizar → operações da classe "janela" (Windows) • Um método é a implementação de uma operação para uma classe. • Métodos especificam a maneira como as operações são codificadas no software. Herança • Na construção de software usando a orientação a objeto: 1. Criam-se classes para atenderem ao caso mais geral - as super-classes. 2. Para tratar casos especiais adicionam-se classes mais específicas - as sub-classes - que herdam da primeira classe. 3. Essas novas classes serão habilitadas a usar todos os métodos e atributos da classe original. • Em outras palavras: "um objeto pertencente a uma sub-classe pode usar um método ou atributo de sua super-classe como se aquele método ou atributo tivesse sido definido através da sub-classe". • Exemplo: super-classe sub-classe avião.Fazer-Curva(Curso); planador.Soltar-Cabo; planador.Fazer-Curva(Curso) avião.Soltar-Cabo; → ERRO!!! classe AVIÃO não tem esse método Mensagem • Uma mensagem é a maneira pela qual um "objeto emissor" dirige para um "objeto alvo" uma solicitação para que o "objeto alvo"aplique um de seus métodos. PESSOA Nome Idade CPF (PESSOA) João 32 00043298738 (PESSOA) Maria 26 93134580019 AVIÃO Método: Fazer-Curva Atributo: Curso PLANADOR Método: Soltar-Cabo Atributo: Se-Conectado
Compartilhar