tipos abstratos de dados e encapsulamento

42
Tipos Abstratos de Dados (TAD) e Encapsulamento Tipos Abstratos de Dados (TAD) e Encapsulamento Cap´ ıtulo 11 (Livro do Sebesta) Helio Henrique L. C. Monte-Alto Disciplina: Paradigma de Programa¸c˜ ao Imperativa e Orientada a Objetos 2012

Upload: helio-henrique-monte-alto

Post on 05-Dec-2014

2.714 views

Category:

Documents


0 download

DESCRIPTION

Baseado no capítulo 11 do livro: "Sebesta R. W. Concepts of Programming Languages. 8th Edition"

TRANSCRIPT

Page 1: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos Abstratos de Dados (TAD) eEncapsulamento

Capıtulo 11 (Livro do Sebesta)

Helio Henrique L. C. Monte-AltoDisciplina: Paradigma de Programacao Imperativa e Orientada

a Objetos

2012

Page 2: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Topicos

1 Conceito de abstracaoTipos de abstracao

2 Introducao a abstracao de dadosTipos de dados definidos pelo usuarioTAD definidos pelo usuario - Exemplo

3 Questoes de projeto4 Exemplos de linguagens

AdaC++JavaRuby

5 Tipos abstratos de dados parametrizadosTAD parametrizados - Exemplos

6 Construcoes de encapsulamentoExemplos de construcoes de encapsulamento

7 Encapsulamento de nomesNamespaces do C++Pacotes do JavaModulos do Ruby

Page 3: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Conceito de abstracao

Conceito de abstracao

Definicao

Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.

Objetivo

A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido

Page 4: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Conceito de abstracao

Conceito de abstracao

Definicao

Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.

Objetivo

A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido

Page 5: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Conceito de abstracao

Conceito de abstracao

Definicao

Abstracao e uma visao ou representacao de uma entidade queinclui apenas os atributos mais significantes.

Objetivo

A abstracao em linguagens de programacao (LP) e uma arma paralidar com a complexidade, tornando um programa grande e/oucomplicado mais facil de ser implementado e mantido

Page 6: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Conceito de abstracao

Tipos de abstracao

Tipos de abstracao em LP

Abstracao de processos

Subprogramas (funcoes, procedimentos, metodos)

Esconde detalhes da implementacao

Permite reuso

Ex: sortInt(list)

Abstracao de dados

Tipos de dados abstratos (structs, classes)

Encapsulamento

Instancia: objeto

Ex: listas, fila, pilha, registros, arvores, ponto flutuante

Page 7: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

Tipos de dados definidos pelo usuario

Tipos de dados definidos pelo usuario

Caracterısticas

TADs sao unidades sintaticas que definem um tipo tal que:

A interface (ou especificacao) do tipo nao depende da realrepresentacao dos dados ou da implementacao das operacoessobre o tipo;

A representacao real e oculta do programa que a utiliza.

Vantagens

Ocultacao de informacao

Maior confiabilidade

Baixo acoplamento com os clientes do tipo

Page 8: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

Tipos de dados definidos pelo usuario

Tipos de dados definidos pelo usuario

Page 9: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

Tipos de dados definidos pelo usuario

Tipos de dados definidos pelo usuario

Page 10: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

TAD definidos pelo usuario - Exemplo

Tipos de dados definidos pelo usuario - Exemplo

Operacoes (interface) sobre uma estrutura de pilha:

create(stack)

destroy(stack)

empty(stack)

push(stack, element)

pop(stack)

top(stack)

Page 11: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

TAD definidos pelo usuario - Exemplo

Tipos de dados definidos pelo usuario - Exemplo

Exemplo de codigo do cliente:...

create(stk1);

push(stk1, color1);

push(stk1, color2);

if(! empty(stk1))

temp = top(stk1);

...

Questao: Vamos supor que a implementacao original dessa pilhautilizasse lista estatica. O que devemos fazer se precisarmosmodificar a estrutura de dados para lista ligada? A mudancaafetara o codigo cliente?

R: NAO, pois a interface nao precisa ser modificada, apenas aimplementacao.

Page 12: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Introducao a abstracao de dados

TAD definidos pelo usuario - Exemplo

Tipos de dados definidos pelo usuario - Exemplo

Exemplo de codigo do cliente:...

create(stk1);

push(stk1, color1);

push(stk1, color2);

if(! empty(stk1))

temp = top(stk1);

...

Questao: Vamos supor que a implementacao original dessa pilhautilizasse lista estatica. O que devemos fazer se precisarmosmodificar a estrutura de dados para lista ligada? A mudancaafetara o codigo cliente?R: NAO, pois a interface nao precisa ser modificada, apenas aimplementacao.

Page 13: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Questoes de projeto

Questoes de projeto

Unidade sintatica para definicao dos tipos e subprogramas

Operacoes embutidas comuns

atribuicaocomparacoesiteradoresacessoresconstrutoresdestruidores

Tipos abstratos parametrizados

Controle de acesso

Page 14: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Ada

Ada

Encapsulamento

Construcoes chamadas packages, divididas em duas partes, quetambem sao packages:

specification package

body package

Page 15: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Ada

Ada - Exemplo

Especificacao para pilha:

package Stack Pack i s−− As en t i d a d e s v i s i v e i s , ou i n t e r f a c e p u b l i c atype Stack Type i s l i m i t e d p r i v a t e ;Max Size : c o n s t a n t := 1 0 0 ;f u n c t i o n Empty ( Stk : i n Stack Type ) r e t u r n Boolean ;procedure Push ( Stk : i n out Stack Type ; Element : i n

I n t e g e r ) ;procedure Pop ( Stk : i n out Stack Type ) ;f u n c t i o n Top ( Stk : i n Stack Type ) r e t u r n I n t e g e r ;−− A pa r t e o c u l t a dos c l i e n t e sp r i v a t e

type L i s t T y p e i s a r r a y ( 1 . . Max Size ) o f I n t e g e r ;type Stack Type i sr e c o r d

L i s t : L i s t T y p e ;Topsub : I n t e g e r range 0 . . Max Size := 0 ;

end r e c o r d ;end Stack Pack ;

Page 16: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Ada

Ada - Exemplo

Trecho da implementacao (body):

with Ada . Text IO ; use Ada . Text IO ;package body Stack Pack i s

f u n c t i o n Empty ( Stk : i n Stack Type ) r e t u r n Boolean i sbeg inr e t u r n Stk . Topsum = 0 ;end Empty ;

procedure Push ( Stk : i n out Stack Type ; Element : i nI n t e g e r ) i sbeg ini f Stk . Topsum >= Max Size then

P u t L i n e ( ”ERROR − Stack o v e r f l o w ” ) ;e l s e

Stk . Topsub := Stk . Topsub + 1 ;Stk . L i s t ( Topsub ) := Element ;

end i f ;end Push ;

Page 17: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Ada

Ada - Exemplo

Exemplo de uso:

with Stack Pack , Ada . Text IO ;use Stack Pack , Ada . Text IO ;procedure U s e S t a c k s i s

Topone : I n t e g e r ;Stack : Stack Type ; −− Cr i a um ob j e t o do t i p o

Stack Typebeg inPush ( Stack , 42) ;Push ( Stack , 17) ;Topone := Top ( Stack ) ;Pop ( Stack ) ;. . .end U s e S t a c k s ;

Page 18: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

C++

C++

Suporte a programacao orientada a objetos.

Duas construcoes para suporte a tipos abstratos de dados:

struct: define apenas dadosclass: define dados (membros de dados) e operacoes sobreos dados (funcoes-membro)

Page 19: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

C++

C++ - Encapsulamento

Encapsulamento

Duas categorias de membros de dados e funcoes-membro:

Membros da classeMembros da instancia

Alocacao da instancia de uma classe

EstaticaDinamica na pilhaDinamica na heap

Duas maneiras de definir uma funcao membro:

Definicao completa na classe (chamada inlined)Somente o cabecalho

Page 20: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

C++

C++ - Ocultacao de Informacao

Ocultacao de informacao

Clausulas (controle de acesso):

privatepublicprotected

Todos os membros de dados devem ser privados para garantira ocultacao de informacao

Apenas metodos devem ser publicos. O conjunto dos metodospublicos constitui a interface da classe.

Construtores e destruidores

Page 21: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Java

Java

Bastante similar ao C++

Principais diferencas:

Todos os TAD sao classesTodos objetos alocados na heapMetodos so podem ser definidos dentro da classeSem metodo destruidor (coletor de lixo)

Page 22: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Exemplos de linguagens

Ruby

Ruby

Classes similares a Java e C++

Classes dinamicas

Membros podem ser adicionados e removidos em tempo deexecucaoMaior flexibilidade, porem menor legibilidade

Tudo e objeto!

Page 23: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

Tipos abstratos de dados parametrizados

E se precisarmos criar pilhas para diferentes tipos de dados? Qualparece a solucao mais atraente?

1 Senta e chora.

2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)

3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.

TAD parametrizados

Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.

Page 24: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

Tipos abstratos de dados parametrizados

E se precisarmos criar pilhas para diferentes tipos de dados? Qualparece a solucao mais atraente?

1 Senta e chora.

2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)

3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.

TAD parametrizados

Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.

Page 25: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

Tipos abstratos de dados parametrizados

E se precisarmos criar pilhas para diferentes tipos de dados? Qualparece a solucao mais atraente?

1 Senta e chora.

2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)

3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.

TAD parametrizados

Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.

Page 26: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

Tipos abstratos de dados parametrizados

E se precisarmos criar pilhas para diferentes tipos de dados? Qualparece a solucao mais atraente?

1 Senta e chora.

2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)

3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.

TAD parametrizados

Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.

Page 27: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

Tipos abstratos de dados parametrizados

E se precisarmos criar pilhas para diferentes tipos de dados? Qualparece a solucao mais atraente?

1 Senta e chora.

2 Implementar uma pilha para cada tipo de dado (Ex:IntegerStack, StringStack, FloatStack, etc.)

3 Criar uma unica implementacao de pilha que aceita qualquertipo de dado.

TAD parametrizados

Obviamente, a alternativa correta e a (3). TAD parametrizados euma questao de projeto propria de linguagens estaticamentetipadas.

Page 28: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

TAD parametrizados - Exemplos

C++ e Ada

Ada

Adiciona-se: generic type T is private, antes dadeclaracao da package

Para cada instancia (ex: Float, Integer), o compilador cria umcodigo correspondente

C++

Adiciona-se: template <class T>, antes da declaracao daclass

Similarmente ao Ada, varias instancias do codigo da classe saocriadas em tempo de compilacao para cada tipo utilizado.

Page 29: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

TAD parametrizados - Exemplos

Java

Tipos genericos mais comuns: colecoes (LinkedList, ArrayList,etc.)

Antes do Java 5.0: colecoes aceitavam qualquer tipo (classeObject), e nao era possıvel definir o tipo dos elementos.

Problema: necessidade excessiva de casts (coercao).

//∗ C r i a r um A r r a y L i s tA r r a y L i s t myArray = new A r r a y L i s t ( ) ;//∗ C r i a r um e lementomyArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;//∗ Pegar p r im e i r o ob j e t o da l i s t aI n t e g e r myInt = ( I n t e g e r ) myArray . g e t ( 0 ) ;

Page 30: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

TAD parametrizados - Exemplos

Java

Java 5.0 e mais recentes:

A r r a y L i s t <I n t e g e r > myArray = new A r r a y L i s t <I n t e g e r >() ;myArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;I n t e g e r myInt = myArray . g e t ( 0 ) ; //∗ <−−−− nao p r e c i s a

dar c a s t !

Classes coringa (wildcard):

Exemplo: Collection<?> e o supertipo de todas de todos ostipos de colecao em Java. Dessa forma:

v o i d p r i n t C o l l e c t i o n ( C o l l e c t i o n <?> c ) {f o r ( Object e : c ) {

System . out . p r i n t l n ( e ) ;}

c . add ( new Object ( ) ) //∗ <−−− Er ro ! POR QUE?}

Page 31: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Tipos abstratos de dados parametrizados

TAD parametrizados - Exemplos

Java

Java 5.0 e mais recentes:

A r r a y L i s t <I n t e g e r > myArray = new A r r a y L i s t <I n t e g e r >() ;myArray . add ( 0 , new I n t e g e r ( 4 7 ) ) ;I n t e g e r myInt = myArray . g e t ( 0 ) ; //∗ <−−−− nao p r e c i s a

dar c a s t !

Classes coringa (wildcard):

Exemplo: Collection<?> e o supertipo de todas de todos ostipos de colecao em Java. Dessa forma:

v o i d p r i n t C o l l e c t i o n ( C o l l e c t i o n <?> c ) {f o r ( Object e : c ) {

System . out . p r i n t l n ( e ) ;}

c . add ( new Object ( ) ) //∗ <−−− Er ro ! POR QUE?}

Page 32: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Construcoes de encapsulamento

Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;

Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;

⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;

Solucao: organizar programas em colecoes logicamenterelacionadas.

Page 33: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Construcoes de encapsulamento

Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;

Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;

⇑ Tamanho do programa

=⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;

Solucao: organizar programas em colecoes logicamenterelacionadas.

Page 34: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Construcoes de encapsulamento

Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;

Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;

⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento

+⇑ Tempo de recompilacao;

Solucao: organizar programas em colecoes logicamenterelacionadas.

Page 35: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Construcoes de encapsulamento

Tipos abstratos de dados sao encapsulamentos mınimos, paraapenas um tipo;

Construcoes de encapsulamento proveem encapsulamento paramultiplos tipos;

⇑ Tamanho do programa =⇒ ⇑ Dificuldade de gerenciamento +⇑ Tempo de recompilacao;

Solucao: organizar programas em colecoes logicamenterelacionadas.

Page 36: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Exemplos de construcoes de encapsulamento

C/C++

Headers (cabecalhos)

Mantem prototipos das funcoes, tipos e classes

Codigo do cliente e compilado junto com a especificacao(header), nao com a implementacao.

Permite que a implementacao seja compilada separadamentedo codigo cliente.

Page 37: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Exemplos de construcoes de encapsulamento

C++

Funcoes e classes amigas

Exemplo: multiplicacao de vetor com matriz:

c l a s s M a t r i x ; //∗∗ Dec l a r acao da c l a s s ec l a s s V e c t o r {

f r i e n d V e c t o r m u l t i p l y ( const M a t r i x &, const V e c t o r&) ;

. . .} ;c l a s s M a t r i x { //∗∗ De f i n i c a o da c l a s s e

f r i e n d V e c t o r m u l t i p l y ( const M a t r i x &, const V e c t o r&) ;

. . .} ;//∗∗ A f u n que usa os o b j e t o s Vecto r e Matr i xV e c t o r m u l t i p l y ( const M a t r i x& ml , const V e c t o r& v l ) {

. . .}

Classes tambem podem ser amigas de outras classes

Page 38: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Construcoes de encapsulamento

Exemplos de construcoes de encapsulamento

C++

TAREFA!

1 Classes amigas violam o princıpio do encapsulamento? Se sim,o quao grave e essa violacao?

2 Qual a melhor maneira de implementar o exemplo acima emuma linguagem sem classes e funcoes amigas (como Java,Python, etc.) sem quebrar o encapsulamento?

Page 39: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Encapsulamento de nomes

Encapsulamento de nomes

Problema: Varios desenvolvedores escrevendo um sistema grande.

Unidades logicas devem ser independentes, porem capazes detrabalhar juntas

Como evitar que sejam criadas variaveis, metodos e classes com omesmo nome acidentalmente?

O problema acentua-se com a utilizacao de varias bibliotecas.Como garantir que nao havera nomes repetidos?

Page 40: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Encapsulamento de nomes

Namespaces do C++

Namespaces do C++

//∗∗ s t a c k . hnamespace mystack {

// D e c l a r a es da p i l h a}

//∗∗ main . cpp v e r s i o n 1. . .mystack : : s t a c k s t k ;s t k . push ( 2 ) ;

//∗∗ main . cpp v e r s i o n 2u s i n g mystack : : s t a c k ;s t a c k s t k ;

//∗∗ main . cpp v e r s i o n 3u s i n g namespace mystack ;s t a c k s t k ;

Page 41: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Encapsulamento de nomes

Pacotes do Java

Pacotes do Java

Classes em um pacote sao parcialmente amigas

Definicao: package br.uem.din.example.stack;

Uso sem importacao: new

br.uem.din.example.stack.GenericStack();

Importando apenas GenericStack: import

br.uem.din.example.stack.GenericStack;

Importando todas classes do pacote: import

br.uem.din.example.stack.*;

Page 42: Tipos Abstratos de Dados e Encapsulamento

Tipos Abstratos de Dados (TAD) e Encapsulamento

Encapsulamento de nomes

Modulos do Ruby

Modulos do Ruby

Colecao de metodos e constantes;

#Modulomodule MyStuff

PI = 3.114159265def MyStuff . mymethod1 ( p1 ). . .enddef MyStuff . mymethod2 ( p2 ). . .end

end

#Uso :r e q u i r e ’ myStuffMod ’. . .MyStuff . mymethod1 ( x ). . .