JAVA – Modularização de programas em Java
Olá crianças, desculpem a demora mas meu acesso ao 4learn, em especial para a turma de vocês ainda está brecado (¬¬), então o André me passou o material da próxima aula pra vocês darem uma lida, deveria haver dois exemplos de código fonte , mas ele pediu para não postar, pois ele quer fazer em sala de aula, o mesmo acontece com os exercícios… enfim segue material e uma breve explicação sobre alguns termos da orientação a objetos que eu peguei na internet:
Termos da orientação a Objetos (by Wikipedia)
Classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplo de classe: Os seres humanos.
Subclasse é uma nova classe originada de sua classe pai.
Objeto é uma instância de uma classe. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria.
Atributos são características de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionário: nome, endereço,telefone, CPF,….; Carro: nome, marca, ano, cor, …; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul. O conjunto de valores dos atributos de um determinado objeto é chamado de estado.
Métodos definem as habilidades dos objetos. Bidu é uma instância da classe Cachorro, portanto tem habilidade para latir, implementada através do método deUmLatido. Um método em uma classe é apenas uma definição. A ação só ocorre quando o método é invocado através do objeto, no caso Bidu. Dentro do programa, a utilização de um método deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente, uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser sente, coma e morda.
Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe. Também pode ser direcionada diretamente a uma classe (através de uma invocação a um método estático).
Herança (ou generalização) é o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (métodos) e variáveis possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação “é um”. Um exemplo de herança: Mamífero é super-classe de Humano. Ou seja, um Humano é um mamífero.
Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples “usa um” ou de um acoplamento “parte de”. Por exemplo: Um humano usa um telefone. A tecla “1″ é parte de um telefone.
Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (os botões, o monofone e os sinais de tom).
Agora, segue a matéria da próxima aula…
Modularização de programas em Java (by André Amarante ¬¬)
A modularização é importante porque divide o problema (programa) em partes menores permitindo a reutilização de algumas partes do mesmo programa ou em outros programas. A divisão de um programa em partes menores facilita a manutenção do programa, uma vez que, se for necessário alterar alguma parte do código, isso será feito em uma só parte. Com a modularização, o programa fica mais legível e organizado.
Portanto, um programa pode ser dividido em partes conhecidas como FUNÇÕES e PROCEDIMENTOS.
O procedimento é parecido com a função, ou seja, é uma parte bem delimitada do programa e pode receber valores como parâmetros, mas ele NÃO PODE RETORNAR NENHUM VALOR, enquanto que uma função SEMPRE deve retornar algum valor.
Partindo dessa diferença entre procedimento e função você deve escolher como modularizar o seu programa. É recomendado colocar trechos de código que envolvam cálculos ou algum processamento, onde sempre se chegue a um único resultado dentro de funções, já que função, sempre deve retornar um único valor. Exemplo: soma de dois números, cálculo da área do retângulo, verificar se um determinado valor existe num vetor,etc.
Os demais trechos de código, nos quais não se acha um único valor, devem ser colocados dentro de procedimentos.
Exemplo: escrever na tela um resultado ou frase, etc.
Um programa pode ser modularizado com procedimento e funções juntos. Vamos demonstrar isso utilizando o exemplo abaixo:
EXEMPLO DE PROGRAMA E M SALA DE AULA (vai ter um código aqui)
Vamos analisar linha a linha:
Linha 1: Essa instrução serve para informar ao compilador o “caminho”, diretório ou pacote (package) onde algumas class usadas no programa se encontram.
Linha 2: declaração da class Calcula.
Linha 3: declaração do método main. Observe que algumas instruções do programa estão dentro do método main (linha 5 a linha 9) e que existe um outro método nessa classe cujo nome é soma e que contem outras instruções. Portanto, nessas classes existem dois métodos: main e soma. Qual deles será chamado automaticamente quando esse programa for executado? O método main. Ele é o método que é chamado primeiramente, mesmo que existam outros métodos na classe.
Linha 4: Início do método main {.
Linha 5: declaração de três variáveis de memória do int.
Linha 6: entrada de dados do primeiro número e armazenamento na variável n1.
Linha 7: entrada de dados do segundo número e armazenamento na variável n2;
Linha 8: ATENÇÃO para essa instrução. Nela está sendo chamada, invocada a função soma. Chamamos uma função pelo próprio nome dela. Após o nome, deve vir abre e fecha parênteses ( ). Se a função estiver esperando valores (veja na linha 12, a função está esperando dois valores do tipo int) eles devem ser passados para a função e isso deve ser feito dentro dos parênteses. Isso se chama passagem de parâmetros. É o que está sendo feito nessa linha, logo depois da chamada da função é abertos parênteses e dois valores separados por vírgula, são passados para a função soma. São os valores que foram digitados e armazenados nas variáveis n1 e n2. Vamos supor que o usuário do programa digitou o valor 2 (armazenado em n1) e o valor 3 (armazenado em n2), então são esses os valores que serão passados para a função soma e armazenados RESPECTIVAMENTE nas variáveis locais n1 e n2 da função soma. Como é uma função que está sendo chamada e uma função SEMPRE retorna um valor, ela NUNCA deve ser chamada isolada numa linha de programa e sim, precedida de uma instrução de atribuição como nessa linha, onde o resultado da chamada da função está sendo armazenado na variável resultado.
Linha 9: instrução de saída de dados. O conteúdo da variável resultado é impresso na caixa de diálogo.
Linha 10: instrução de fi m do método main }
Linha 11: declaração da função soma. Java não usa a palavra function para declarar uma função. Toda função começa com a palavra function seguido do tipo de dado que está sendo retornado mais o nome da função. Como essa função soma dois dados inteiros, o tipo de dado do resultado da soma também é inteiro, por isso, logo depois de function vem o tipo int, seguid o do nome da função. A função soma, espera receber dois valores ou parâmetros. Quando uma função recebe parâmetros, eles devem ser recebidos, armazenados em variáveis de memória declaradas dentro dos parênteses. Nesse caso, a função soma recebe dois parâmetros ou valores. O primeiro será armazenado dentro da variável local n1 e o segundo dentro da variável local n2. Deve-se repetir o tipo de cada variável declarada dentro dos parênteses.
As variáveis declaradas dentro de um método, seja ele função ou procedimentos, são chamadas variáveis LOCAIS, ou seja, elas só podem ser acessadas dentro do próprio método onde foram declaradas. As variáveis n1 e n2 do método main são diferentes das variáveis n1 e n2 da função soma. Qualquer variável declarada dentro do método main não pode ser usada pela função soma e vice-versa.
Linha 13: nessa linha as variáveis n1 e n2 são somas e o resultado da soma é retornado para a linha dentro do método main que chamou a função soma, no caso, linha 8. Esse valor retornado será armazenado na variável resultado. Uma função sempre deve retornar UM E SOMENTE UM valor. Para retornar um valor use a palavra return.
Linha 14: fim da função }.
Linha 15: fim da classe }. Todos os métodos de um programa sejam eles procedimentos e funções, devem estar dentro de uma classe, ou seja, devem estar implementados antes do fim da classe.
Onde podemos implementar um procedimento nesse mesmo programa? Você já observou que um procedimento é um bloco de programa parecido com uma função, mas ele não retorna nenhum valor.
Então, vamos pensar. No programa acima, qual a parte que pode ser modularizada em um procedimento?
A saída de dados, ou seja, a linha 9.
Vamos refazer o código anterior, agora com um procedimento.
EXEMPLO DE PROGRAMA E M SALA DE AULA (vai ter um código aqui)
Vamos analisar algumas linhas que mudaram nesse programa:
Nessa nova versão do programa, o procedimento chamado imprime está sendo chamado na linha 9. Ao invés de programar a instrução de saída de dados para mostrar na tela a palavra “Resultado” seguido do conteúdo da variável de memória resultado, é chamado o procedimento imprime e passado para ele dois valores ou parâmetros: a palavra “Resultado” (note que a palavra está entre “” porque é um valor literal do tipo String) e o variável resultado (onde está armazenado o resultado da soma).
Esses dois parâmetros são recebidos pelo procedimento imprime na linha 17 e armazenados respectivamente na variável local do tipo String legenda e na variável local do tipo int chamada valor.
Na linha 18: está o símbolo de início do procedimento {.
Na linha 19: está a instrução de saída de dados JOptionPane.showMessageDialog (null, legenda + valor) que mostrará na tela o conteúdo da variável legenda seguido do conteúdo da variável valor.
Qual o conteúdo da variável legenda?
A palavra “Resultado” que será passada como parâmetro para o procedimento imprime e armazenada na variável local do tipo String, chamada legenda.
Qual o conteúdo da variável valor?
O valor armazenado na variável resultado no método main() que será passado como parâmetro para o procedimento imprime e armazenado na variável local do tipo int chamada valor. Não sabemos qual valor será. Isso dependerá na entrada de dados do usuário do programa, mas sabemos que será o resultado da soma de dois valores.
Na linha 20: está o símbolo de fi m do procedimento }.
OBSERVE o cabeçalho da definição do procedimento na linha 17. Qual a diferença para o cabeçalho da definição da função na linha 12? Não é necessário olhar os parâmetros!
A diferença é que, como uma função SEMPRE deve retornar um valor, o tipo do valor retornado deve estar especificado no cabeçalho da função. Veja na linha 12, o tipo do valor retornado pela função soma é int, pois os dois valores somados (n1 e n2) também são int. O tipo de retorno da função deve estar antes do nome da função.
Como o procedimento NUNCA retorna um valor, a palavra void deve ser especificada no lugar do tipo, ou seja, antes do nome do procedimento.
Relembrando: Como identificar em um código Java o que é função e o que é procedimento?
Olhe o cabeçalho de definição de ambos. A função deve sempre ter um tipo de retorno e o procedimento sempre deve ter a palavra void que indica que nenhum valor será retornado.
Fim…

