METODOLOGIA UNIFUNCIONAL DE DESENVOLVIMENTO DE SOFTWARE Akeo Tanabe [email protected] Agenda • A motivação • A metodologia • Exemplos • Conclusão [email protected] © LES/PUC-Rio 2 A Motivação • Desenvolver sem conhecer os requisitos – Flexibilidade no desenvolvimento • Sensação permanente do “já programado” – “desacoplar” função desejada de programa existente • Acesso permanente(“on-line”) a multi-arquivos • Bom conhecimento de utilitários e ferramentas • Analogia com base vetorial da “Álgebra Linear” • Unifuncionais - Funções “ortogonais” – Funções independentes – facilidade de composição [email protected] © LES/PUC-Rio 3 A Metodologia: etapas do desenvolvimento • Escolha do domínio de aplicação – Processamento da Linguagem Natural (PLN) – Língua Portuguesa - Brasil • Construção da base unifuncional – Bases de conhecimento por categoria gramatical • Tecnologia das mini-transformações – Programa como transformador de arquivos – Aplicativo como seqüência de transformações • Composição da aplicação – Arquivo de entrada de um programa = arquivo de saida do programa precedente (estilo do “pipeline” UNIX) – Ordenação das transformações numa seqüência – Execução da aplicação prescrita [email protected] © LES/PUC-Rio 4 Construção da base unifuncional • Bases de conhecimentos por categoria gramatical • Ferramentas utilizadas na plataforma WINDOWS – Linguagem C/C++ e AWK – ULTRAEDIT – editor de textos • Classes de aplicativos unifuncionais básicos – Ordenação alfabética e numérica – Conversor para letras minúsculas – ç e vogais acentuadas – Freqüência das palavras – ordem descrescente das freqüências – Reconhecedores/filtros – Categorizadores gramaticais – Filtro das palavras mais freqüentes [email protected] © LES/PUC-Rio 5 Bases unifuncionais - categoria gramatical • Bases flexionadas (codificadas): – Substantivos,adjetivos – Verbos • Bases invariantes (não flexionadas) – Abreviaturas – Conjunções/preposições/pronomes/interjeições – Advérbios – (incluidos por baixo volume): artigos/numerais – Palavras mais freqüentes • Para cada uma das bases, programas: – ”framework” de reconhecedores/filtros – ”framework” de categorizadores gramaticais – ”framework” de reconhecedores genéricos [email protected] © LES/PUC-Rio 6 Bases unifuncionais • Bases em letras minúsculas – programa conversor de texto em minúsculas • Para PLN – Língua Portuguesa: – construção dos vocabulários – ”SORT” – especial (ç e vogais acentuadas) – filtro das palavras mais freqüentes – reconhecimento das flexões • Substantivos e adjetivos • Verbos • Ferramentas para facilitar desenvolvimento – AWK como gerador de estruturas para programas em C/C++ • Transformador de arquivos – AWK – ferramenta para as mini-transformações • Super utilitário para PLN [email protected] © LES/PUC-Rio 7 Tecnologia das Mini-Transformações • Matéria prima: compartilhamento de arquivos textos • Ferramenta de trabalho: AWK(programa interpretado) • AWK: linguagem ideal para transformações em PLN – ”pattern matching” – “regular expression” – ”customização” do parser – ”character string” como índice de “arrays” – comandos para manipulação de tabela de símbolos • Programas como seqüência de mini-transformações – Domando a complexidade (“dividir para conquistar”) • Agregação de funcionalidade a programas “fechados” – pré e pós processamento de arquivos – integração de aplicativos [email protected] © LES/PUC-Rio 8 Agregar funcionalidade por transformaçao -Programa “SORT” como exemplo • Estratégias: pré e pós processamento e – Transformação dos arquivos de entrada/saida • Funcionalidades do meu “SORT”: – só ordem alfabética crescente(vogais acentuadas e ç) – só ordem numérica crescente (valor numérico do byte) • Exemplo 1: Chave no meio de registro • prefixar chave de ordenação ao registro e ordenar • restaurar registro original após ordenação • Exemplo 2: Ordem numérica decrescente • complementar valor numérico e ordenar • descomplementar valor numérico • Outros exemplos: – ordenação em condições especiais – tratamento do ç e de vogais acentuadas – alinhamento das ordenações pelos diferentes instrumentos [email protected] © LES/PUC-Rio 9 Caso 1: Transformação estilo XSLT - input • • • • • • • • • • • • • • • • • • • • • • • • • • goal_model (Confidentiality)(GM9){ softgoal = (Confidentiality)(S9.1)(and){ softgoal = (Confidentiality[task])(S9.1.1)(and){} softgoal = (Confidentiality[settings])(S9.1.2)(and){} task = (Login)(T9.1.3)(help) {} task = (Logout)(T9.1.4)(help) {} softgref = (Performance[time])(S6.1.1)(and) softgoal = (Confidentiality[events])(S9.1.5)(and){} softgoal = (Confidentiality[category])(S9.1.6)(and){} } goax = (Manage[account])(G9.4)(and){ goax = (Edit[account])(G9.4.1)(and){ task = (Edit[user account])(T9.4.1.1)(or){ task = (Edit[administrator account])(T9.4.1.2)(or){ task = (Edit[e-mail])(T9.4.1.2.1)(and){} } task = (Edit[username])(T9.4.1.3)(and){} task = (Edit[password])(T9.4.1.4)(and){} task = (Edit[full name])(T9.4.1.5)(and){} task = (Reset[password])(T9.4.1.6)(and){} task = (Change[password])(T9.4.1.7)(and){} } goax = (There is always at least one[administrator account])(G9.4.2)(and){} goax = (Manage[access])(G9.4.3)(and){} } crosscutting{ [email protected] © LES/PUC-Rio 10 Caso 1: Transformação estilo XSLT - output • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • <?xml version="1.0" encoding="UTF-8"?> DOCTYPE aspect_oriented_model SYSTEM "d:\Lyrene\Tese\Language_New\DTD\goal_AspectOrientedModel.dtd"> <aspect_oriented_model> <goal_model id="GM9"> <name>Confidentiality</name> <softgoal id="S9.1"> <name>Confidentiality</name> <softgoal id="S9.1.1"><name>Confidentiality[task]</name></softgoal> <softgoal id="S9.1.2"><name>Confidentiality[settings]</name></softgoal> <task id="T9.1.3" decomposition_label="help"><name>Login</name></task> <task id="T9.1.4" decomposition_label="help"><name>Logout</name></task> <softgoal_ref id="S6.1.1"></softgoal_ref> <softgoal id="S9.1.5"><name>Confidentiality[events]</name></softgoal> <softgoal id="S9.1.6"><name>Confidentiality[category]</name></softgoal> </softgoal> <goal id="G9.4"> <name>Manage[account]</name> <goal id="G9.4.1"> <name>Edit[account]</name> <task id="T9.4.1.1" decomposition_label="or"><name>Edit[user account]</name> <task id="T9.4.1.2" decomposition_label="or"><name>Edit[administrator account]</name> <task id="T9.4.1.2.1" decomposition_label="and"><name>Edit[e-mail]</name></task> </task> <task id="T9.4.1.3" decomposition_label="and"><name>Edit[username]</name></task> <task id="T9.4.1.4" decomposition_label="and"><name>Edit[password]</name></task> <task id="T9.4.1.5" decomposition_label="and"><name>Edit[full name]</name></task> <task id="T9.4.1.6" decomposition_label="and"><name>Reset[password]</name></task> <task id="T9.4.1.7" decomposition_label="and"><name>Change[password]</name></task> </task> <goal id="G9.4.2"><name>There is always at least one[administrator account]</name></goal> <goal id="G9.4.3"><name>Manage[access]</name></goal> </goal> [email protected] © LES/PUC-Rio 11 Caso 2: Análise de requisitos <documento do sistema> <termos a pesquisar> <documento do sistema> [geraprog.awk] [xec.awk] <xec.awk> <palloc> [indexRF.awk] <outindex> (getline) [definesegmento.awk] <praver> Localiza palavras nos segmentos [ordenar.exe] <tosee> [delduplicados.awk] in ..\parcerias\miriam (set/2005) [email protected] © LES/PUC-Rio <miruni> (pag. seguinte) 12 Caso 2 : Análise de requisitos <miruni> <arq02> [consolidasegmento.awk] [locfirst.awk] <documento do sistema> <arq03> <arq01> [trazsegmentorelevante.awk] [ordenar.exe] [ordenar.exe] <arq02> <arq05> <arq04> (getline) Palavras no contexto dos segmentos [email protected] © LES/PUC-Rio 13 Caso 2 : Resultados • ************ ==> fornecedor#RF11 Visualizar Viagem Actual • 3.2.10 RF11 Visualizar Viagem Actual • Um produto passa a integrar a Viagem Actual depois de esco ... • A Viagem Actual tem um nome padrão criado pelo sistema que... • Depois de escolher todos os produtos de sua viagem, o clie... • A figura abaixo ilustra o conteúdo da Viagem Actual durant... • • Os produtos aparecem na lista com um resumo das principais... • Para cada item da lista, é possível visualizar mais inform... • As informações sobre produtos são obtidas através de casos... • Note-se que a Viagem Actual só existe durante uma sessão a... • • • ************ ==> pagamento,reserva#RF172 Visualizar Minha ... • 3.2.12 RF172 Visualizar Minha Viagem • Este caso de uso disponibiliza ao cliente uma listagem de... • Cada item da lista possui um status associado (planeada, p... • Apresenta, ainda, um link para o Histórico de Viagens. • Além disso é possível obter +detalhes destas viagens. • [email protected] © LES/PUC-Rio 14 Caso 2: Resultados em negrito • ************ ==> pagamento,reserva#RF17 Visualizar Viagens Futuras • 3.2.17 RF17 Visualizar Viagens Futuras • Uma viagem passa a fazer parte das Viagens Futuras quando o cliente confirma e paga a ==>reserva<==. • A lista de viagens futuras do cliente aparece no caso de uso Visualizar Minha Viagem, com • uma opção para visualização de detalhes sobre cada viagem da lista. Incluem-se nesta lista • as viagens que foram confirmadas pelo cliente mas ainda estão pendentes de alguma confirmação • via Back Office como por exemplo confirmação de ==>pagamento<==, confirmação de voo que • não pôde ser obtida on-line, etc. • Este caso de uso (Visualizar Viagens Futuras) permite que o cliente veja os detalhes de • uma viagem futura. • A visualização de Viagens Futuras é semelhante à visualização da Viagem Actual, ou seja, • para cada viagem é disponibilizada uma lista de produtos com descrição resumida e existe • a possibilidade de visualização da descrição detalhada. • Além disso, as Viagens Futuras possuem as seguintes características: • * Produtos de Viagens Futuras não podem ser excluídos, e uma Viagem Futura não pode ser cancelada on-line. • * Existe um status associado às Viagens Futuras. • * Existe uma opção de visualização de Dados de Pagamento para cada Viagem Futura que, caso • seleccionada, executa o caso de uso Visualizar Dados de Pagamento de Viagem. • * Dependendo do status da viagem, o cliente pode Efectuar Pagamento Complementar, caso • tenha pago apenas 25% da viagem ao confirmar e pagar a ==>reserva<==. • ... ... ... Akeo Tanabe - [email protected] © LES/PUC-Rio 15 Caso 3: Extração de nomes próprios <entrada> <saida> executar [categorizgram.bat] <saida> [seltoclaudia.awk] <arq01> (reuso) [maybenomeproprio.awk] Extração de Nomes Próprios (versão 0) <nomesproprios> [email protected] © LES/PUC-Rio 16 Caso 3: Extração de nomes próprios <nomes.ued> [ordenar.exe] <nombyleng> [genstructnames.awk] <name01> [delduplicados.awk] <name02>(**) <names.h> UEDIT para “#include” in catgramaticalnom es.c [historyparticnom.awk] <name03> [gerabatpartic.awk] Obs1: <xec.bat> <name03> informa partição ausente executar xec.bat NOMES PRÓPRIOS gerar estrutura para programa em “C” Obs2: (**) acrescentar partições ausentes em <name02> in ..\parcerias\claudia <nombyleng> [email protected] © LES/PUC-Rio 17 Caso 3: Extração de nomes próprios <entrada > <arq01> [seltoclaudia.awk] executar [categorizgram.bat] <arq02> [maybenomeproprio.awk] <saida> <arq03> [gsubprep.awk] [gsubprep.awk] <arq01> (pré) [limparprep.awk] (pós) <nomesproprios> Extração de Nomes Próprios (versão 1) Processo para extração de nomes próprios [batchnomes.bat] [email protected] © LES/PUC-Rio 18 Caso 3: Batch para extração nomes próprios rem rem batchnome.bat (%1)=(entrada) (%2)=(saida) rem del arq01 del arq02 del arq03 gawk -f gsubprep.awk %1 >arq00 gawk -f seltoclaudia.awk arq00 >arq01 gawk -f maybenomeproprio.awk arq01 >arq02 gawk -f indexnomeproprio.awk arq02 >arq03 gawk -f smartmontanome.awk arq00 >acum gawk -f limparprep.awk acum >out01 gawk -f deletaprimo.awk out01 >out02 gawk -f deletalast.awk out02 >%2 [email protected] © LES/PUC-Rio 19 Caso 3: Texto com os nomes próprios Herbert von Karajan conducted the Berlin Philharmonic Orchestra for many years Golbery do Couto e Silva, chefe do Gabinete Civil do governo de Ernesto Geisel. O chefe de Gabinete do Ministro da Fazenda, Juscelino Dourado,... Os promotores denunciaram em abril do ano passado o empresário Sérgio Gomes da Silva,o Sombra ex-segurança do prefeito, como o mandante do crime O relator da matéria, ministro Marco Aurélio de Mello, afirmou que o direito ao silêncio é assegurado constitucionalmente a todo aquele que sob a custódia ou não do Estado é convocado para depor e vê-se alvo de investigação [email protected] © LES/PUC-Rio 20 Caso 3: Resultados intermediários <com (gsubprep.awk) original> <com (gsubprep.awk) modificado> ================================================================= 000001#Herbert?********** 000001#Herbert?********** 000003#Karajan?********** 000002#Von:von?********** 000006#Berlin?********** 000003#Karajan?********** 000007#Philharmonic?********** 000006#Berlin?********** 000008#Orchestra?********** 000007#Philharmonic?********** 000012#Golbery?********** 000008#Orchestra?********** 000013#DO:do?PREP 000012#Golbery?********** 000014#Couto?********** 000013#DO:do?PREP 000015#E:e?CONJ 000014#Couto?********** 000016#Silva?NOME:VERB 000015#E:e?CONJ 000018#DO:do?PREP 000016#Silva?NOME:VERB 000021#DO:do?PREP 000018#DO:do?PREP 000023#DE:de?PREP 000021#DO:do?PREP 000024#Ernesto?********** 000023#DE:de?PREP 000025#Geisel?********** 000024#Ernesto?********** 000028#DE:de?PREP 000025#Geisel?********** 000030#DO:do?PREP 000028#DE:de?PREP 000032#DA:da?PREP 000030#DO:do?PREP 000034#Juscelino?********** 000032#DA:da?PREP 000035#Dourado?ADJ:NOME:VERB 000034#Juscelino?********** 000041#DO:do?PREP 000035#Dourado?ADJ:NOME:VERB 000046#Sérgio?********** 000041#DO:do?PREP 000047#Gomes?NOME:VERB 000046#Sérgio?********** 000048#DA:da?PREP 000047#Gomes?NOME:VERB 000049#Silva?NOME:VERB 000048#DA:da?PREP 000053#DO:do?PREP 000049#Silva?NOME:VERB . . . . . . ================================================================= [email protected] © LES/PUC-Rio 21 Caso 3: Resultados <nomes extraídos> ----------------------------Berlin Philharmonic Orchestra Golbery do Couto e Silva Ernesto Geisel Juscelino Dourado Sérgio Gomes da Silva Marco Aurélio de Mello <gsubprep.awk - original> -----------------------------------/#e\?/{gsub(/#e\?/,"#E:e?")} /#de\?/{gsub(/#de\?/,"#DE:de?")} /#da\?/{gsub(/#da\?/,"#DA:da?")} /#das\?/{gsub(/#das\?/,"#DAS:das?")} /#dos\?/{gsub(/#dos\?/,"#DOS:dos?")} /#do\?/{gsub(/#do\?/,"#DO:do?")} {print $0} ======================================================================== <nomes extraídos> -----------------------------Herbert von Karajan Berlin Philharmonic Orchestra Golbery do Couto e Silva Ernesto Geisel Juscelino Dourado Sérgio Gomes da Silva Marco Aurélio de Mello <gsubprep.awk - modificado > ------------------------------------/#e\?/{gsub(/#e\?/,"#E:e?")} /#de\?/{gsub(/#de\?/,"#DE:de?")} /#da\?/{gsub(/#da\?/,"#DA:da?")} /#das\?/{gsub(/#das\?/,"#DAS:das?")} /#dos\?/{gsub(/#dos\?/,"#DOS:dos?")} /#do\?/{gsub(/#do\?/,"#DO:do?")} # para nomes germanicos /#von\?/{gsub(/#von\?/,"#Von:von?")} {print $0} ======================================================================== [email protected] © LES/PUC-Rio 22 Conclusões • Domando a complexidade • Facilidade em agregar funcionalidades – Transformação do programa ou do arquivo • Arquivos temporários são logs (para debug) • Agregar funcionalidades criando novas bases, em nível mais elevado (biblioteca de componentes) • Ferramentas para o domínio da reprodutibilidade do processo / sincronismo bases x programas • Melhoria na qualidade do software • Não sou “Matte Leão”, mas use e abuse [email protected] © LES/PUC-Rio 23