• Nenhum resultado encontrado

CLASSES E POO

No documento INTRODUÇÃO AO SOFTWARE MATLAB (páginas 50-55)

Como vimos, no MATLAB cada dado pertence a uma classe (em analogia ao tipo da programação em C). Por exemplo, existe a classe numérica, a classe char, a classe função de transferência, ente outras. Como veremos adiante, a classe é um molde para um objeto.

A Programação Orientada ao Objeto (POO) é conceitualmente diferente da programação estruturada (embora o código estruturado seja utilizado na POO). Enquanto, na solução de um problema típico utilizando uma linguagem estruturada pensamos primeiramente no código (na sequência de comandos para alcançar um objetivo - utilizando pseudocódigo, fluxogramas e etc), na POO fundamentalmente pensa-se no objeto que será modelado, suas características, suas ações e interações com outros objetos.

Um objeto basicamente pode ser qualquer coisa, desde uma matriz até uma pessoa ou um capacitor, por exemplo. E a POO trata de criar um modelo desse elemento. Esse modelo ou molde (classe) é desenvolvida de maneira que as características e ações que o objeto realiza sejam independentes da implementação onde ele está inserido. Essa característica é chamada de encapsulamento, e é muito importante na POO. Pense no encapsulamento como a definição de uma sub-rotina (função), porém mais complexa, pois além de realizar ações e tarefas, o objeto retém informação em suas características e não desaparece após a execução (o que ocorre com as variáveis de função, por exemplo).

Devido ao fato da classe ser encapsulada, o programador geralmente desenvolve barreiras para evitar a manipulação de dados importantes. Isso torna o código menos sujeito a falhas. Além disso, o encapsulamento permite que a classe seja utilizada em qualquer programa - uma vez que é independente, poupando muito tempo. Vale lembrar que na atualidade, os softwares complexos lançam mão da orientação ao objeto, pois como veremos, para aplicações gráficas, trata-se de uma abordagem mais sistemática e simples.

O molde para o objeto é o que o programador escreve. A partir desse molde, chamado de classe, são criados (instanciados) vários objetos. O molde define um conjunto de objetos que possuem a mesmas características e são capazes de desempenhar as mesmas ações. Por exemplo, um capacitor eletrolítico e um capacitor cerâmico podem ser descritos por um mesmo conjunto de características. Um ser humano (classe) também pode ser descrito com várias características, porém, o ser humano Nikola Tesla (objeto criado da classe humano) possui características distintas do ser humano Thomas Edison.

2 AULA 13 – GERENCIAMENTO DE DADOS

Veremos agora as partes básicas que compõe um objeto (e são definidas pela classe).

Basicamente, uma classe define as características dos objetos (no MATLAB as características são chamadas de propriedades, em outros cursos e linguagens são chamados de atributos), e ações que esse objeto pode fazer ou que são feitas no objeto (essas ações são chamadas de métodos).

As propriedades são análogas as variáveis, enquanto os métodos são muito similares a funções. Os métodos podem possuir três naturezas básicas. Eles podem fazer com que as propriedades dos objetos sejam atualizadas; Podem solicitar informações (valores das propriedades do objeto); E podem solicitar que o objeto realize uma operação. A natureza do método em nada implica em sua sintaxe, como veremos. A diferença citada acima é penas conceitual/funcional.

A POO permite que as propriedades e os métodos sejam invisíveis ou protegidos do meio exterior ao objeto. Em outras palavras, não é possível acessar o valor externamente ao objeto. Assim, definem-se métodos que permitem acesso às propriedades daquele objeto, com isso, o desenvolvedor da classe pode estabelecer um controle rígido ao acesso da propriedade ou do método. Isso adiciona segurança e robustez ao código. As propriedades, no MATLAB, podem ser privadas (private) ou públicas (public). Propriedades privadas só podem ser diretamente manipuladas dentro de métodos da classe. Já propriedades públicas podem ser manipuladas diretamente também fora da classe (embora não se aconselhe, em implementações sérias), a utilização de propriedades públicas.

Além disso, uma classe usualmente deve definir um construtor para o objeto. Um construtor é uma função que irá gerencial a inicialização do objeto (inicializando propriedades e fazendo quaisquer outras ações necessárias). O construtor da classe é um método que possui o mesmo nome da classe (observe os exemplos logo adiante).

Para mais informações sobre a teoria da OO, uma leitura fácil é Fundamentos da Linguagem Orientada a Objeto com UML, de Page-Jones, disponível aos montes na biblioteca.

D

ESENVOLVENDO UMA CLASSE SIMPLES

A estrutura básica de uma classe no MATLAB é apresentada abaixo.

classdef nome_da_classe

%NOME_DA_CLASSE Explicação simples % Informação detalhada properties %Propriedades end methods %métodos end end

Os métodos são implementados como funções do MATLAB (utilizando a mesma sintaxe que os arquivos .m que contém funções).

Vamos partir de um exemplo simples. Deseja-se criar uma classe para objetos que modelem indutores. Indutores possuem algumas propriedades comuns, como indutância e resistência do enrolamento. Essas duas variáveis estariam dispostas no campo propriedades da classe. Portanto, podemos iniciar a construção da classe indutor.

classdef indutor

%INDUTOR Classe Indutor

% Trás informações e operações com indutores

properties

indutancia %armazena o valor da indutância

rse %armazena resistência série equivalente

end methods %métodos end end

Nesta classe, apenas propriedades estão presentes. Nem mesmo o construtor da classe foi definido. É possível, no entanto, já criar um objeto dessa classe. Salve a classe em um arquivo .m no diretório corrente e execute na linha de comando:

l1 = indutor; whos

Perceba que a variável criada é da classe indutor. Essa variável é um objeto. É possível acessar as propriedades do objeto l1 diretamente (sem utilizar propriedades), pois não foi definida nenhuma restrição ao acesso dessas propriedades. Escreva na tela:

l1.indutancia = 1e-3; l1.rse = 1;

4 AULA 13 – GERENCIAMENTO DE DADOS

Observe que o acesso dos elementos que compõe o objeto l1 é realizado utilizando um ponto, como ocorria com estruturas no C.

Para definir um construtor, basta definir um método com o nome da classe. Estude o exemplo e preste muita atenção na explicação.

classdef indutor

%INDUTOR Classe Indutor

% Trás informações e operações com indutores

properties

indutancia %armazena o valor da indutância

rse %armasena resistência série equivalente

end

methods

function ind = indutor(v_indut, v_rse) %construtor

ind.indutancia = v_indut; ind.rse = v_rse;

end

%o método retorna ind (que será um obj da classe indutor...)

end

end

Perceba que não é mais possível criar um indutor escrevendo l1 = indutor na janela de comandos. Agora é necessário utilizar a sintaxe especificada pelo construtor da classe, i.e.:

l1 = indutor(10e-3,20) whos

É muito importante salientar que o construtor é um método da classe, e deve ter o mesmo nome da classe.

Pode-se fazer um método que realiza uma ação para um dado objeto. A ação, por exemplo, seria imprimir na tela o valor da indutância e o valor da resistência. Veja e estude o exemplo abaixo, em que o método proposto é escrito.

classdef indutor

%INDUTOR Classe Indutor

% Trás informações e operações com indutores

properties

indutancia %armazena o valor da indutância

rse %armazena resistência série equivalente

end

methods

function ind = indutor(v_indut, v_rse) %construtor

ind.indutancia = v_indut; ind.rse = v_rse;

end

function [] = imprime(ind) %objeto sempre é passado como

%argumento

fprintf('L = %f H e R = %f Ohms', ind.indutancia, ind.rse);

end

end

No desenvolvimento de um método, este deve receber em sua lista de parâmetros uma variável que será utilizada no código para acessar o objeto em questão. No caso, a variável ind cumpre este papel. Execute, pois, as linhas abaixo:

l1 = indutor(13.23e-3, 13.2);

l1.imprime() %pode ser somente l1.imprime

Perceba que o método é executado como se ind fosse l1. Essa sintaxe é um pouco complicada de se processar em um primeiro momento. Pense que a expressão é análoga a imprime(l1), onde l1 seria passado como argumento. Porém, essa sintaxe parece mais amistosa e faz mais sentido, uma vez que invocamos um método para o objeto l1. Esta diferença estabelece um padrão de como propriedades e métodos são acessados ou utilizados, e adiante (com sorte) veremos que estabelece hierarquia.

Diferentemente de outras linguagens, as propriedades podem ter tipos de acesso (privado ou público) dependendo se estou atribuindo (set) ou obtendo (get) o valor da propriedade.

Observe o exemplo:

classdef indutor

%INDUTOR Classe Indutor

% Trás informações e operações com indutores

properties (SetAccess = public, GetAccess = public) indutancia %armazena o valor da indutância

rse %armazena resistência série equivalente

end methods %métodos end end

Perceba a modificação na linha em que as propriedades são definidas. Aqui é possível modificar restringir o acesso público, alterando SetAccess e GetAccess para private. Faça isso e veja o que ocorre quando se tenta modificar o valor das propriedades. Uma vez definidas como privadas, pode-se definir métodos de acesso (get) e métodos modificadores (set) dessas propriedades. Esses métodos são amplamente utilizados, e existirão na enorme maioria das classes em várias linguagens, e possuem no MATLAB uma sintaxe específica que será abordada na próxima aula.

E

XERCÍCIOS

Exercício 1 Desenvolva um método que calcula e retorna a frequência de corte do indutor (da função I/V), dada pela equação: fc = ( R / (2πL) )

Exercício 2 Desenvolva uma classe análoga para modelar um capacitor. A classe deverá conter como propriedades a capacitância, a resistência série equivalente e o tipo do capacitor. Desenvolva um construtor para classe, além de um método que, dado uma tensão, retorne a quantidade de carga armazenada no capacitor.

1

AULA 14 – ATRIBUTOS e MECANISMO DE HERANÇA

No documento INTRODUÇÃO AO SOFTWARE MATLAB (páginas 50-55)