Evolução do Design através de Testes e o TDD
|
|
- Manoel Ramalho Nunes
- 8 Há anos
- Visualizações:
Transcrição
1 c a p a Lucas Souza (lucas.souza@caelum.com.br): é bacharel em Engenharia da Computação pela Universidade de Ribeirão Preto, possui a certificação SCJP e trabalha com Java há 4 anos. Atualmente é desenvolvedor e instrutor pela Caelum. Entusiasta de metodologias ágeis e editor-chefe do InfoQ Brasil. Paulo Silveira (paulo.silveira@caelum.com.br): é bacharel e mestre em Ciência da Computação pela USP, trabalha com Java há 10 anos, sendo 6 anos com consultoria, desenvolvimento e treinamento na Caelum. Evolução do Design através de Testes e o TDD Como os testes de unidade impactam diretamente no design da sua aplicação Os testes de unidade já são obrigatórios em muitas empresas e ganham cada vez mais importância no mercado. Ainda é considerado por muitos apenas como uma forma de demonstrar a corretude do seu sistema, mas os testes de unidade vão muito além: são uma forma de validar o design de sua aplicação, garantindo a possibilidade de evoluir, mudar e refatorar o seu código. Veremos, através de um exemplo, como os testes, aliados ao Test Driven Development, possuem o potencial de manter seu design com um baixo acoplamento. Testes de unidade têm se tornado cada vez mais imprescindíveis no atual mercado de desenvolvimento de software. Além de ser uma maneira de diminuirmos a possível quantidade de problemas que o software pode ter, a principal característica dos testes de unidade sem dúvida é aumentar a qualidade do código, diminuindo o acoplamento e obtendo assim um software de fácil manutenção e extensão. Devido a sua existência, a equipe se sente tranquila para efetuar refatorações, manutenções ou até mesmo fazer a adição de novas funcionalidades. Porém obter um código com baixo acoplamento e que seja de fácil manutenção não é uma tarefa trivial de ser alcançada. O que ocorre, muitas vezes, é que ao desenvolver alguma funcionalidade, tomamos decisões que podem tornar o código difícil de ser testado. O Test Driven Development (TDD) é uma técnica de desenvolvimento que pode ser utilizada para evitar esse tipo de problema. O TDD nos questiona frequentemente sobre questões como o Princípio da Responsabilidade Única (SRP) e Não Se Repita (DRY), e esses questionamentos surgem quando sentimos alguma dificuldade para criar o teste. Utilizando TDD o design das classes emerge de forma poderosa (pela facilidade de extensão) e simples (pela fácil manutenabilidade). TDD não substituirá seus princípios e decisões sobre o design ou mesmo seus diagramas UML, a ideia é validar e melhorar suas decisões de design. TDD é uma técnica que ajuda na criação e evolução do design, mas não é a única maneira de fazê-lo. Nosso objetivo aqui é demonstrar na prática como o TDD vai acelerar essa evolução de design. 32
2 Exemplo: enviando um ao cadastrar um novo usuário Para nossa demonstração, considere que em um sistema precisamos que, ao adicionar um novo usuário, um seja enviado dando boas-vindas a esse cliente. Em um pensamento rápido, podemos criar um método estático envia dentro de uma classe EnviadorDe . Invocaremos esse método de dentro do nosso NovoUsuarioController, que será responsável por adicionar o novo usuário no banco de dados e enviar o de boas-vindas, como nas Listagens 1 e 2. Para isso, considere que também temos uma classe DaoFactory, responsável por retornar as classes do sistema responsáveis pela persistência de dados. Listagem 1. Classe NovoUsuarioController. EnviadorDe .envia (usuario.get ()); Listagem 2. Classe EnviadorDe . import org.apache.commons.mail. exception; import org.apache.commons.mail.simple ; public class EnviadorDe { public static void envia (string para) { try { Simple = new Simple (); .sethostname( smtp.server.com ); .addto(para).setfrom( lucas.souza@caelum.com.br, Lucas Souza ).setsubject( Confirmação de cadastro ).setmsg( Seja bem-vindo ).send(); catch ( Exception e) { e.printstacktrace(); É um código que parece funcionar, mas será que possui um bom design? Está desacoplado o suficiente? Para garantir o funcionamento desse método de adição de novo usuário, será criado um teste de unidade, que verifica se o foi enviado corretamente. A Listagem 3 mostra como podemos preparar o teste de unidade. Listagem 3. Cenário do teste de unidade da classe NovoUsuarioController. Com o usuário e o controller criados, estaríamos prontos para fazer as asserções e assim garantir que o método adiciona() está funcionando como esperado. Mas como verificar se um está sendo enviado para o usuário? Se mantivermos o teste com o código assim, um de verdade será disparado para esse cliente cada vez que o executarmos! Uma alternativa seria, antes de iniciar os testes, levantar um servidor SMTP que apenas simulasse o envio do . Poderíamos até fazer isso via Java no setup do teste, programaticamente, ao usar um servidor como o Apache James. Porém, com isso, começamos a nos complicar com um teste de unidade que deveria ser bastante simples. Dessa forma, ele estaria se tornando um teste de integração. O problema neste caso é que não temos como verificar de uma maneira fácil se o foi enviado, afinal, dentro do método adiciona() mantemos um acoplamento muito forte com a classe EnviadorDe . Isso ocorre devido a ela ser uma dependência que não podemos mudar com facilidade. Outra maneira um tanto complicada de evitar que o método de envio de fosse realmente invocado (para não enviar o e apenas testá-lo) seria, através de um classloader customizado e manipulação de bytecode, os quais trocariam a implementação desse método. Alguns frameworks de mock (se não sabe o que é mock, aguarde que será explicado mais a frente) possibilitam isso, mas esse é um forte indício de alto acoplamento. Para testar esse método de uma forma mais elegante, em vez de usar essas opções apresentadas, será necessário refatorar o nosso controller: em vez de procurarmos o que queremos, vamos inverter isso e receber a dependência no construtor. Isso é, vamos aplicar o princípio de inversão de controle através da injeção de dependências, como na Listagem 4. Para essa mudança ser possível, o método envia () da classe EnviadorDe apresentada na Listagem 2 precisará deixar de ser estático. Será que agora podemos testar facilmente nossa classe? NovoUsuarioController novousuario = new NovoUsuarioController(); // que verificações faço aqui? Listagem 4. Removendo acoplamento com EnviadorDe . private EnviadorDe enviadorde ; public NovoUsuarioController(EnviadorDe enviadorde ) { this.enviadorde = enviadorde ; enviadorde .envia (usuario.get ()); 33
3 Utilizando Mocks Uma solução eficaz para o teste dessa nova versão da classe é o uso de mock objects, que nos permite isolar os testes das classes de um sistema de forma simples. Como muitos já conhecem, um mock object é um objeto falso criado com base em uma estrutura definida, que pode simular comportamentos de dependências e verificar a corretude na interação da classe testada com a mesma. No caso do exemplo, a classe NovoUsuarioController depende diretamente da classe EnviadorDe para cumprir suas responsabilidades. Ao invés de utilizarmos a classe EnviadorDe , usaremos outra, que finge fazer o que essa dependência deveria fazer, porém é mais simples e fácil de ser usada no ambiente de testes, por termos controle sobre ela. O código atual da classe NovoUsuarioController já está com um design bem melhor, que nos possibilita injetar um mock no lugar da dependência. Para fazer isso, precisaríamos estender a classe EnviadorDe e reescrever o método envia (), de tal forma que ele apenas fingisse enviar um . Essa invocação do método também seria registrada para depois ser usada na asserção do teste. Sendo assim, essa nova classe-filha seria utilizada para os testes. Apesar dessa solução funcionar, podemos usar algo mais elegante para evoluir o design da aplicação. Devemos refatorar: agora a classe NovoUsuarioController passará a receber como dependência (Listagem 6) uma referência para alguém que implemente uma nova interface chamada Enviador (Listagem 5) que possui um único método envia () declarado (o que pode ser feito através de uma IDE como o Eclipse, que oferece a refatoração automatizada Extract Interface ). Agora, durante o teste (Listagem 8), passaríamos um objeto especial, da classe Enviador Dummy, que implementa a interface Enviador e simula um envio de (Listagem 7). Esse dummy é um mock menos inteligente, já que não verifica e nem realiza nenhuma operação. No teste, basta fazer uma asserção para verificar se o destinatário do que foi utilizado dentro do mock é igual ao do usuário que está sendo cadastrado. Listagem 5. Interface Enviador. public interface Enviador { void envia (string para); Listagem 6. Troca da dependência da classe Enviador para a interface Enviador. private Enviador enviadorde ; public NovoUsuarioController(Enviador enviadorde ) { this.enviadorde = enviadorde ; enviadorde .envia (usuario.get ()); Listagem 7. Criação do EnviadorDe Dummy. public class EnviadorDe Dummy implements Enviador { private String enviadopara; public void envia (string para) { // simulação de envio de this.enviadopara = para; public String getenviadopara() { return this.enviadopara; Listagem 8. Teste usando um mock object. EnviadorDe Dummy mock = new EnviadorDe Dummy(); NovoUsuario novousuario = new NovoUsuario(mock); Assert.assertEquals(usuario.get (), mock.getenviadopara()); Apesar de ter sido fácil criar o mock para a interface Enviador como um objeto bobo (dummy object), muitas vezes a dependência pode ter métodos que são difíceis de serem simulados, pois retornam outros objetos, por exemplo. Outra dificuldade que podemos enfrentar é quando a unidade que estamos testando possui muitas dependências, o que acarretaria na criação de mocks para cada uma delas. Ao enfrentarmos estas situações uma boa opção seria a utilização de ferramentas que criam em tempo de execução objetos mockados para serem utilizados e nos testes de unidade. Criação automatizada de mocks Um dos frameworks que vem se destacando no mercado é o Mockito ( por ser simples e de fácil entendimento, considerado uma evolução em relação às outras alternativas. Utilizaremos ele para mockar nossa dependências, mas, como visto na edição 31 da Mundoj, o Jmock é uma outra excelente opção Para utilizarmos o mockito, basta fazer o download no site (ver referências) e colocar o mockito-all-x.x.x.jar no classpath da aplicação. O código de teste com o uso do Mockito está apresentado na Listagem
4 Listagem 9. Mock de dependências com mockito. Criar mocks utilizando frameworks do tipo Mockito torna-se uma tarefa muito simples e que pode nos levar a acreditar que nosso design está simples e extensível. Porém, na maioria das vezes, isso indica um cenário em que o código está muito acoplado e ruim, um sinal de que a unidade que estamos testando talvez esteja fazendo mais do que deveria por ter muitas dependências. No caso de encontrar esse tipo de problema, o melhor a se fazer é refatorar essa classe de forma a diminuir suas dependências, separando as responsabilidades e testando cada uma das novas classes individualmente. Enviador mock = Mockito.mock(Enviador.class); NovoUsuarioController novousuario = new NovoUsuarioController(mock); Mockito.verify(mock).envia (usuario.get ()); E se usássemos TDD? Como sabemos, Test-Driven Development é o nome dado a prática de criar os testes antes mesmo de escrevermos o código que queremos que seja testado. Muitos citam que sua grande vantagem é que dessa forma não teremos código que não possua teste, mas essa realmente não é a única vantagem. O primeiro passo para utilizar o Mockito é pedir para que ele crie através do seu método principal, o método mock(), um objeto mockado a partir de uma interface ou classe. Em nossos testes precisamos de um mock da interface Enviador, que é obtida invocando Mockito.mock(Enviador.class). Uma das principais características do Mockito é que quando criamos algum mock não precisamos definir antecipadamente quais métodos serão invocados nele, como seria feito se utilizásemos um stub. Em seguida, basta passarmos a dependência para a classe NovoUsuarioController e depois da execução do método fazemos a verificação para saber quais métodos do mock foram chamados no método adiciona(), comprovando que o método realmente invoca a funcionalidade para envio de quando o cadastro é finalizado. Isso é feito utilizando o método verify() da classe Mockito. No teste da Listagem 9 verificamos se o método envia () foi invocado recebendo como parâmetro a propriedade do objeto Usuario que está sendo cadastrado. O Mockito pode ajudar em muitas tarefas durante o desenvolvimento de testes de unidade. Considere que o cenário de teste em que método envia- () deve retornar uma exceção quando o de destino indicado for inválido. Um teste utilizando Mockito que verifica esse comportamento está representado na Listagem 10. No exemplo, o comportamento esperado para a classe NovoUsuarioController seria enviar uma exceção do tipo IllegalArgumentException Listagem 10. Teste mais avançado utilizando mockito. (expected = IllegalArgumentException.class) public void retornaexcecaoquando forinvalido() { usuario.set ( lucas.souza#caelum.com.br ); usuario.setusuario( lucas.souza ); usuario.setsenha( ); Enviador mock = Mockito.mock(Enviador.class); Mockito.doThrow(new IllegalArgumentException()).when(mock).envia (usuario.get ()); NovoUsuarioController novousuario = new NovoUsuarioController(mock); A vantagem de fazer os testes primeiro é que não precisaríamos repensar todo o design da nossa aplicação como exemplificado no exemplo deste artigo. Se tivéssemos guiado nosso desenvolvimento a partir dos testes, terminaríamos com um design mais simples, abstrações mais bem definidas e códigos mais reutilizáveis. E por consequência ganharíamos a confiança no código implementado a partir dos próprios testes. No artigo, para obter um design elegante e simples, várias vezes tivemos que refatorar o código e o teste. Utilizando TDD também faríamos refatorações, que é uma ótima prática, mas com certeza chegaríamos no design ideal bem mais facilmente do que fazendo os testes depois. Por que esse design melhorado já apareceria desde cedo? Vamos ilustrar isso escrevendo o teste para a classe NovoUsuarioController, considerando que ainda não implementamos nem essa classe, nem o enviador de . A Listagem 11 esboça o início dessa situação. Listagem 11. Mock de dependências com mockito. NovoUsuarioController novousuario = new NovoUsuarioController(); // aqui preciso testar se o foi enviado. Como? Escrevendo o teste dessa Listagem 11, logo perceberíamos duas coisas: precisamos criar a classe NovoUsuarioController e necessitamos que ela tenha um método que adiciona um usuário. Isso já mostra como o teste guia também a criação de como a classe interage com seus clientes. Depois disso, como verificar se o foi enviado? De alguma forma precisamos de um objeto (um mock?) que vá dizer se foi tentado enviar um para o paulo.silveira@caelum.com.br. Esse objeto de alguma forma tem de estar relacionado com o NovoUsuarioController. Para fazer isso, passaremos esse objeto via construtor (poderia ser de outra forma, 35
5 como usando um método setter) para o controller. A fim de tornar mais fácil o processo de criar um mock para esse objeto, será criada uma interface para abstrair seu comportamento. Dado esse raciocínio, cairíamos diretamente num código muito semelhante ao da Listagem 9. Outra prova de como o TDD auxilia no design é que dificilmente teríamos usado o DaoFactory com métodos estáticos, pois perceberíamos que seria complicado conseguir simular essa parte na hora de criar um teste que verificasse se o DAO foi acionado ao adicionar um novo usuário. Normalmente percebe-se que é importante tornar o código mais desacoplado, por exemplo, recebendo no construtor o UsuarioDAO. Ou talvez outra solução, como recebê-lo através de um setter ou ainda utilizando uma busca em um registro. Porém, a injeção via construtor acaba sendo uma alternativa muito popular e demonstra vantagens em relação a outras abordagens de inversão de controle, já que isso impede que o objeto seja instanciado e fique num estado inconsistente, sem ter suas dependências preparadas. São por esses motivos que algumas pessoas chegam até a se referir ao TDD como Test-Driven Design. TDD e injeção de dependências Injeção de dependências é uma maneira de diminuir acoplamento, na qual a classe recebe suas dependências externamente, através de métodos ou construtores, ao invés de criá-las de forma interna. Evitar que classes busquem suas dependências torna possível construirmos testes de unidade que foquem apenas no comportamento da classe que está sendo testada, ou seja, qualquer mudança que ocorra em alguma dependência da classe testada não deveria impactar no teste. Com TDD alcançamos isso de maneira mais fácil, porque quando vamos escrever os testes percebemos a necessidade de torná-los de fato um teste de unidade. Por exemplo, no caso do teste da adição de um novo usuário perceberíamos prematuramente que o envio de não deveria ser um envio real que utiliza um SMTP de verdade. No exemplo de teste apresentado, a classe NovoUsuarioController deve ser independente do comportamento da classe EnviadorDe . Isso nos levaria a perceber a necessidade de desacoplar o código através da injeção da dependência. Considerações finais O teste de unidade já se provou essencial, mas sabemos como é difícil criar esses testes se o código já está pronto: ele pode estar (e provavelmente está) muito acoplado, sendo difícil evitar que os testes de unidade se tornem de integração. Muitos desistem de criar testes por essa dificuldade inicial, ao tentar criar testes para código já existente. O uso do TDD, além de trazer o benefício de garantir que você vai ter uma boa cobertura de testes e só vai escrever o que realmente é necessário, implica em um design mais desacoplado. Isso pode ser explicado por um motivo muito simples: sem design desacoplado, criar um teste de unidade é bastante difícil. Logo, o TDD de certa maneira o força a ir em direção a inversão de controle, muitas vezes através de injeção de dependências, de uma maneira clara e natural. Referências Independentemente se usamos algum framework de injeção de dependências (Spring, Guice, Pico etc.) no ambiente de produção, nos testes é importante utilizarmos essa práticaa para que os objetos mockados possam substituir as dependências, isolando assim a unidade que estamos testando. 36
O CONCEITO DE TDD NO DESENVOLVIMENTO DE SOFTWARE
O CONCEITO DE TDD NO DESENVOLVIMENTO DE SOFTWARE Renan Leme Nazário, Ricardo Rufino Universidade Paranaense (Unipar) Paranavaí PR - Brasil renazariorln@gmail.com, ricardo@unipar.br Resumo. Este artigo
Leia maisOrientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
Leia maisMOCKITO - - Alexandre Gazola (alexandregazola@gmail.com / Twitter: @alexandregazola)
cinto de utilidades mocks_ CRIAÇÃO DE MOCKS COM MOCKITO No último artigo desta coluna, falamos de uma forma geral sobre diversas ferramentas para suporte a testes automatizados. Dentre as ferramentas mencionadas,
Leia maisPrototype, um Design Patterns de Criação
Prototype, um Design Patterns de Criação José Anízio Pantoja Maia Este artigo tem como finalidade compreender o funcionamento do padrão de projeto prototype, serão abordados os participantes que compõe
Leia maisAnálise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 1 Prof. Cristóvão Cunha Objetivos de aprendizagem
Leia maisTESTES AUTOMATIZADOS COM JUNITE MOCKITO
TESTES AUTOMATIZADOS COM JUNITE MOCKITO Jaime William Dias 12, Dener Barranco 1, Douglas Delapria 1 1 Universidade Paranaense (Unipar) 2 Universidade Estadual de Maringá (UEM) Paranavaí PR Brasil dener_barranco@hotmail.com,
Leia maisImplementando uma Classe e Criando Objetos a partir dela
Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 04 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 2 Prof. Cristóvão Cunha Implementando uma Classe
Leia maisDESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES
DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES Alexandre Egleilton Araújo, Jaime Willian Dias Universidade Paranaense (Unipar) Paranavaí PR Brasil araujo.ale01@gmail.com, jaime@unipar.br Resumo.
Leia mais3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio
32 3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio Este capítulo apresenta o framework orientado a aspectos para monitoramento e análise de processos de negócio
Leia maisFixture-Factory. Criando objetos para seus testes. Como criar objetos através de templates para serem utilizados como massa de dados em seus testes.
fixture-factory_ Fixture-Factory Criando objetos para seus testes Como criar objetos através de templates para serem utilizados como massa de dados em seus testes. Começamos testando métodos simples, mas
Leia maisOCOMON PRIMEIROS PASSOS
OCOMON PRIMEIROS PASSOS O OCOMON ainda não possui um arquivo de Help para atender a todas questões relacionadas ao sistema. Esse arquivo serve apenas para dar as principais instruções para que você tenha
Leia maisSistema de Controle de Solicitação de Desenvolvimento
Sistema de Controle de Solicitação de Desenvolvimento Introdução O presente documento descreverá de forma objetiva as principais operações para abertura e consulta de uma solicitação ao Setor de Desenvolvimento
Leia maisEntendendo como funciona o NAT
Entendendo como funciona o NAT Vamos inicialmente entender exatamente qual a função do NAT e em que situações ele é indicado. O NAT surgiu como uma alternativa real para o problema de falta de endereços
Leia mais5. Métodos ágeis de desenvolvimento de software
Engenharia de Software 5. Métodos ágeis de desenvolvimento de software Nuno Miguel Gil Fonseca nuno.fonseca@estgoh.ipc.pt Desenvolver e entregar software o mais rapidamente possível é hoje em dia um dos
Leia maisDemoiselle Report Guide. Demoiselle Report. Marlon Carvalho. <marlon.carvalho@gmail.com> Rodrigo Hjort. <rodrigo.hjort@gmail.com> Robson Ximenes
Demoiselle Report Guide Demoiselle Report Marlon Carvalho Rodrigo Hjort Robson Ximenes Demoiselle Report... v 1. Configuração
Leia maisParte I. Demoiselle Mail
Parte I. Demoiselle Mail Para o envio e recebimento de e-s em aplicativos Java, a solução mais natural é usar a API JavaMail [http:// www.oracle.com/technetwork/java/java/index.html]. Ela provê um framework
Leia maisNOKIA. Em destaque LEE FEINBERG
Em destaque NOKIA LEE FEINBERG A Nokia é líder mundial no fornecimento de telefones celulares, redes de telecomunicações e serviços relacionados para clientes. Como Gerente Sênior de Planejamento de Decisões
Leia maisLazarus pelo SVN Linux/Windows
Lazarus pelo SVN Linux/Windows Sei que não faltam artigos sobre como obter e compilar o Lazarus e o FPC pelo SVN, mas sei também que nunca é de mais divulgar um pouco mais e talvez escrever algo diferente.
Leia mais2 Diagrama de Caso de Uso
Unified Modeling Language (UML) Universidade Federal do Maranhão UFMA Pós Graduação de Engenharia de Eletricidade Grupo de Computação Assunto: Diagrama de Caso de Uso (Use Case) Autoria:Aristófanes Corrêa
Leia mais3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).
Permissões de compartilhamento e NTFS - Parte 2 Criando e compartilhando uma pasta - Prática Autor: Júlio Battisti - Site: www.juliobattisti.com.br Neste tópico vamos criar e compartilhar uma pasta chamada
Leia maisMÓDULO 9 METODOLOGIAS DE DESENVOLVIMENTO DE SISTEMAS
MÓDULO 9 METODOLOGIAS DE DESENVOLVIMENTO DE SISTEMAS O termo metodologia não possui uma definição amplamente aceita, sendo entendido na maioria das vezes como um conjunto de passos e procedimentos que
Leia mais22 DICAS para REDUZIR O TMA DO CALL CENTER. em Clínicas de Imagem
para REDUZIR O TMA DO CALL CENTER em Clínicas de Imagem Objetivo Um atendimento eficiente e personalizado é um dos principais fatores que o cliente leva em consideração ao iniciar um processo de fidelização
Leia mais1. Quem somos nós? A AGI Soluções nasceu em Belo Horizonte (BH), com a simples missão de entregar serviços de TI de forma rápida e com alta qualidade.
1. Quem somos nós? A AGI Soluções nasceu em Belo Horizonte (BH), com a simples missão de entregar serviços de TI de forma rápida e com alta qualidade. Todos nós da AGI Soluções trabalhamos durante anos
Leia maisEngenharia de Software III
Engenharia de Software III Casos de uso http://dl.dropbox.com/u/3025380/es3/aula6.pdf (flavio.ceci@unisul.br) 09/09/2010 O que são casos de uso? Um caso de uso procura documentar as ações necessárias,
Leia mais10 DICAS DE TECNOLOGIA PARA AUMENTAR SUA PRODUTIVIDADE NO TRABALHO
10 DICAS DE TECNOLOGIA PARA AUMENTAR SUA PRODUTIVIDADE NO TRABALHO UMA DAS GRANDES FUNÇÕES DA TECNOLOGIA É A DE FACILITAR A VIDA DO HOMEM, SEJA NA VIDA PESSOAL OU CORPORATIVA. ATRAVÉS DELA, ELE CONSEGUE
Leia maiswww.marketingdigitalexpress.com.br - Versão 1.0 Página 1
www.marketingdigitalexpress.com.br - Versão 1.0 Página 1 Remarketing é um recurso utilizado para direcionar anúncios personalizados para as pessoas que visitaram uma determinada página do seu site ou clicaram
Leia maisATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS
ATRIBUTOS PRIVADOS Podemos usar o modificador private, para tornar um atributo privado, obtendo um controle centralizado Definimos métodos para implementar todas as lógicas que utilizam ou modificam o
Leia maisUma Publicação Grupo IPub. Guia. redes sociais para clínica de estética. Guia de redes sociais para clínica de estética
Uma Publicação Grupo IPub Guia redes sociais para clínica de estética Guia de redes sociais para clínica de estética Conteúdo 1. Introdução 2. A força das redes sociais para clínica de estética 3. As redes
Leia maisGerenciamento de Contatos
Gerenciamento de Contatos O objetivo deste módulo é ajudar a gerenciar todos os contatos da empresa. Além dos dados mais importantes, o módulo permite cadastrar anotações e relacionar as tarefas e eventos
Leia maisTrilha Agile TDD e 20 coisas que você precisa saber
Trilha Agile TDD e 20 coisas que você precisa saber Camilo Lopes Quem sou eu?! Trabalha com desenvolvimento de software desde 2003. Atualmente Desenvolvedor de Software na ADP Labs, escritor do livro "Guia
Leia maisVVS Sistemas (21)3405-9500
Índice Assunto Página Apresentação... 2 Funcionamento do Módulo... 3 Instalação do Módulo... 4 Configurações no C-Plus NF-e... 9 Acessando os arquivos... 11 Apresentação Apresentamos o módulo C-Plus NF-e
Leia maisProgramação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.
Herança Técnico em Informática, M.Sc. Herança 2 Herança Reutilização de código Exemplo Banco: Um banco oferece diversos serviços que podem ser contratados individualmente pelos clientes. Quando um serviço
Leia maisProcesso de Controle das Reposições da loja
Processo de Controle das Reposições da loja Getway 2015 Processo de Reposição de Mercadorias Manual Processo de Reposição de Mercadorias. O processo de reposição de mercadorias para o Profit foi definido
Leia maisTUTORIAL PRÁTICO SOBRE Git. Versão 1.1
TUTORIAL PRÁTICO SOBRE Git por Djalma Oliveira Versão 1.1 "Git é um sistema de controle de revisão distribuida, rápido e escalável" (tradução rápida do manual). Basicamente é
Leia maisProgramação Orientada a Objetos. Prof. Diemesleno Souza Carvalho diemesleno@iftm.edu.br http://www.diemesleno.com.br
Programação Orientada a Objetos Prof. Diemesleno Souza Carvalho diemesleno@iftm.edu.br http://www.diemesleno.com.br Programação Orientada a Objetos Na aula passada, vimos: Encapsulamento Programação Orientada
Leia maisUNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação
SOFT DISCIPLINA: Engenharia de Software AULA NÚMERO: 10 DATA: / / PROFESSOR: Andrey APRESENTAÇÃO O objetivo desta aula é apresentar e discutir os conceitos de coesão e acoplamento. DESENVOLVIMENTO Projetar
Leia maisGuia Site Empresarial
Guia Site Empresarial Índice 1 - Fazer Fatura... 2 1.1 - Fazer uma nova fatura por valores de crédito... 2 1.2 - Fazer fatura alterando limites dos cartões... 6 1.3 - Fazer fatura repetindo última solicitação
Leia mais5 Mecanismo de seleção de componentes
Mecanismo de seleção de componentes 50 5 Mecanismo de seleção de componentes O Kaluana Original, apresentado em detalhes no capítulo 3 deste trabalho, é um middleware que facilita a construção de aplicações
Leia maisAULA 4 VISÃO BÁSICA DE CLASSES EM PHP
AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.
Leia maisRicardo Roberto de Lima UNIPÊ 2008.1 APS-I. Históricos e Modelagem Orientada a Objetos
Históricos e Modelagem Orientada a Objetos Histórico Diversas metodologias e métodos surgiram para apoiar OO. Evolução a partir de linguagens C++ e SmallTalk. Anos 80 Anos 80-90: diversidade de autores.
Leia maisMicrosoft Access XP Módulo Um
Microsoft Access XP Módulo Um Neste primeiro módulo de aula do curso completo de Access XP vamos nos dedicar ao estudo de alguns termos relacionados com banco de dados e as principais novidades do novo
Leia maisANDROID APPLICATION PROJECT
Criando um programa Abrindo o programa Eclipse, clique na opção [FILE], depois em [NEW], selecione a opção [PROJECT], uma janela de opção do tipo de projeto irá se abrir, escolha [ANDROID] logo depois
Leia maisCOMO FUNCIONA NOSSA CONSULTORIA DE MARKETING DIGITAL ESPECIALIZADA EM VENDAS ONLINE
www.agenciaatos.com.br COMO FUNCIONA NOSSA CONSULTORIA DE MARKETING DIGITAL ESPECIALIZADA EM VENDAS ONLINE APLICAÇÃO DA CONSULTORIA EM VENDAS ONLINE É assim que os resultados são gerados. No entanto, é
Leia maisedirectory Plataforma ios / Android
edirectory Plataforma ios / Android Levando seu site ao próximo nível Conheça o novo aplicativo do edirectory. E seja bem vindo a revolução em aplicativos para Diretórios Online. Mobile Completamente reestruturado
Leia maisDocumentação. Programa de Evolução Contínua Versão 1.72
Documentação Programa de Evolução Contínua Versão 1.72 Sumário Resumo das Novidades... 3 Configuração das Novidades... 5 Exibição de variações nas listagens... 5 Novo Sistema de Lista de Desejos... 7 Resumo
Leia maisLOGGING DE EVENTOS COM LOG4J
LOGGING DE EVENTOS COM LOG4J por Luiz Gustavo Stábile de Souza O que é logging? Fazer o logging de uma aplicação é uma das possíveis maneiras de debugá-la, registrando em algum meio (arquivo, enviando
Leia maisOmega Tecnologia Manual Omega Hosting
Omega Tecnologia Manual Omega Hosting 1 2 Índice Sobre o Omega Hosting... 3 1 Primeiro Acesso... 4 2 Tela Inicial...5 2.1 Área de menu... 5 2.2 Área de navegação... 7 3 Itens do painel de Controle... 8
Leia maisACOMPANHAMENTO GERENCIAL SANKHYA
MANUAL DE VISITA DE ACOMPANHAMENTO GERENCIAL SANKHYA Material exclusivo para uso interno. O QUE LEVA UMA EMPRESA OU GERENTE A INVESTIR EM UM ERP? Implantar um ERP exige tempo, dinheiro e envolve diversos
Leia maisManual Sistema de Autorização Online GW
Sistema de Autorização Online GW Sumário Introdução...3 Acesso ao sistema...4 Logar no sistema...4 Autorizando uma nova consulta...5 Autorizando exames e/ou procedimentos...9 Cancelamento de guias autorizadas...15
Leia maisInstalando o WordPress em localhost
Instalando o WordPress em localhost WordPress sem Mistério LEE ARAUJO htto://wordpresssemmisterio.com.br Sumário Instalando o WordPress em Localhost... 2 O Servidor web... 3 Iniciando o servidor... 6 Criação
Leia maisABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE
ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE Amarildo Aparecido Ferreira Junior 1, Ricardo Ribeiro Rufino 1 ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil aapfjr@gmail.com
Leia maisAtualizaça o do Maker
Atualizaça o do Maker Prezados Clientes, Nós da Playlist Software Solutions empresa líder de mercado no desenvolvimento de software para automação de rádios - primamos pela qualidade de nossos produtos,
Leia maisARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.
Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto
Leia maisApresentação. Nossa sugestão é que você experimente e não tenha medo de clicar!!!
Apresentação Este manual é uma orientação para os participantes de cursos no ambiente Moodle do INSTITUTO PRISMA. Tem como objetivo orientar sobre as ações básicas de acesso e utilização do ambiente virtual
Leia maisUniversidade Federal Rural de Pernambuco. Bacharelado em Sistemas de Informação. Disciplina: Análise e Projeto de Sistemas de Informação
Universidade Federal Rural de Pernambuco Bacharelado em Sistemas de Informação Disciplina: Análise e Projeto de Sistemas de Informação Docente: Rodrigo Aluna: Thays Melo de Moraes Diagramas do Projeto
Leia maisProgramação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes
Pág 50 Programação Orientada a Objetos - 3º semestre AULA 08 Prof. André Moraes 10 CORREÇÃO DE QUESTÕES DE AVALIAÇÃO 1 PARTE I - AVALIAÇÃO TEÓRICA 11 RESPONDA AS QUESTÕES ABAIXO: A) Qual a diferença entre
Leia maisCRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO
CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO Antes de criarmos um novo Banco de Dados quero fazer um pequeno parênteses sobre segurança. Você deve ter notado que sempre
Leia maisGerenciador de Congressos de Iniciação Científica Manual de Instruções
Pág. 1 Autores Gerência de Redes e Sistemas Versão Data 1. Apresentação Este é um produto desenvolvido pela equipe da Gerência de Redes e Sistemas da FARN, atualmente estruturada com o
Leia maisO papel do CRM no sucesso comercial
O papel do CRM no sucesso comercial Escrito por Gustavo Paulillo Você sabia que o relacionamento com clientes pode ajudar sua empresa a ter mais sucesso nas vendas? Ter uma equipe de vendas eficaz é o
Leia maisO Novo Portal Etilux também foi criado para ser um facilitador para nossa Força de Vendas, abrangendo as seguintes características:
INTRODUÇÃO: O Novo Portal Etilux também foi criado para ser um facilitador para nossa Força de Vendas, abrangendo as seguintes características: Ser uma alternativa para substituição dos volumosos e pesados
Leia maisGuia de Fatores de Qualidade de OO e Java
Qualiti Software Processes Guia de Fatores de Qualidade de OO e Java Versã o 1.0 Este documento só pode ser utilizado para fins educacionais, no Centro de Informática da Universidade Federal de Pernambuco.
Leia maisAPLICATIVO WEB PARA O SETOR DE EXTENSÃO IFC VIDEIRA
APLICATIVO WEB PARA O SETOR DE EXTENSÃO IFC VIDEIRA Autores: Claudiléia Gaio BANDT; Tiago HEINECK; Patrick KOCHAN; Leila Lisiane ROSSI; Angela Maria Crotti da ROSA Identificação autores: Aluna do Curso
Leia maisProcessos Técnicos - Aulas 4 e 5
Processos Técnicos - Aulas 4 e 5 Trabalho / PEM Tema: Frameworks Públicos Grupo: equipe do TCC Entrega: versão digital, 1ª semana de Abril (de 31/03 a 04/04), no e-mail do professor (rodrigues.yuri@yahoo.com.br)
Leia maisGUIA INTEGRA SERVICES E STATUS MONITOR
GUIA INTEGRA SERVICES E STATUS MONITOR 1 - Integra Services Atenção: o Integra Services está disponível a partir da versão 2.0 do software Urano Integra. O Integra Services é um aplicativo que faz parte
Leia mais3 Dicas MATADORAS Para Escrever Emails Que VENDEM Imóveis
3 Dicas MATADORAS Para Escrever Emails Que VENDEM Imóveis O que é um e- mail bem sucedido? É aquele e- mail que você recebe o contato, envia o e- mail para o cliente e ele te responde. Nós não estamos
Leia maisMicrosoft Access: Criar relações para um novo banco de dados. Vitor Valerio de Souza Campos
Microsoft Access: Criar relações para um novo banco de Vitor Valerio de Souza Campos Conteúdo do curso Visão geral: relações são essenciais Lição: inclui oito seções Tarefas práticas sugeridas Teste Cartão
Leia mais3.5. Cuidado com o modelo anêmico
3.5. Cuidado com o modelo anêmico public Periodo adiaumasemana() { Calendar novofim = (Calendar) this.fim.clone(); novofim.add(calendar.day_of_month, 7); return new Periodo(inicio, novofim); E, com uma
Leia mais1 Natuur Online Cadastre-se Nome, Login E-mail Cadastrar.
1 Essa é a tela de acesso do Natuur Online, clique aqui para acessar o site e siga o passo-apasso abaixo. Se esse é o seu primeiro acesso, clique em Cadastre-se. 2 - Preencha os dados solicitados com Nome,
Leia maishttp://aurelio.net/vim/vim-basico.txt Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho
vi http://aurelio.net/vim/vim-basico.txt Entrar neste site/arquivo e estudar esse aplicativo Administração de Redes de Computadores Resumo de Serviços em Rede Linux Controlador de Domínio Servidor DNS
Leia maisGrécia Um Framework para gerenciamento de eventos científicos acadêmicos utilizando componentes
Grécia Um Framework para gerenciamento de eventos científicos acadêmicos utilizando componentes Resumo Este trabalho apresenta uma infra-estrutura para gerenciamento de eventos científicos acadêmicos na
Leia maisManual Administrador - Mídia System
Manual Administrador - Mídia System Logo após cadastrarmos sua Empresa em nosso sistema, será enviado um e-mail confirmando as informações de acesso do Administrador do sistema. Obs: Caso não tenha recebido
Leia maisApesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma:
1 Introdução A utilização de frameworks como base para a construção de aplicativos tem sido adotada pelos desenvolvedores com três objetivos básicos. Primeiramente para adotar um padrão de projeto que
Leia maisArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02
ArpPrintServer Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 1 Sumário INTRODUÇÃO... 3 CARACTERÍSTICAS PRINCIPAIS DO SISTEMA... 3 REQUISITOS DE SISTEMA... 4 INSTALAÇÃO
Leia maisIntrodução a Java. Hélder Nunes
Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais
Leia maisNa tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".
Servidor WEB Desenvolvedores de sites que querem aprender ou testar ASP, ou mesmo profissionais que precisam desenvolver páginas ASP ou ASP.Net, não precisam necessariamente ter um servidor na web com
Leia maisComo incluir artigos:
Como incluir artigos: O WordPress é uma ferramenta muito flexível, com muitas variações e ajustes que podem torná-lo algo muito simples e também muito sofisticado conforme os recursos que são configurados
Leia maisPROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br
PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando
Leia maisManual de Utilizador. Disciplina de Projecto de Sistemas Industriais. Escola Superior de Tecnologia. Instituto Politécnico de Castelo Branco
Escola Superior de Tecnologia Instituto Politécnico de Castelo Branco Departamento de Informática Curso de Engenharia Informática Disciplina de Projecto de Sistemas Industriais Ano Lectivo de 2005/2006
Leia maisTUTORIAL: MANTENDO O BANCO DE DADOS DE SEU SITE DENTRO DO DOMÍNIO DA USP USANDO O SSH!
UNIVERSIDADE DE SÃO PAULO (USP) ESCOLA DE ARTES, CIÊNCIAS E HUMANIDADES (EACH) TUTORIAL: MANTENDO O BANCO DE DADOS DE SEU SITE DENTRO DO DOMÍNIO DA USP USANDO O SSH! Autoria e revisão por: PET Sistemas
Leia maisSe acontecer algum problema no teste da conta tente configurar da seguinte maneira:
1) Cria-se o e-mail na task 2) Cria-se o e-mail no Gmail seguindo manual abaixo (ir também dentro do painel do Gmail em conta e habilitar acesso ao aplicativo) 3) Configura o outlook a. Nome: nome usuário
Leia maisPROGRAMANDO EM C# ORIENTADO A OBJETOS
PROGRAMANDO EM C# ORIENTADO A OBJETOS AGENDA MÓDULO 2 Domínio e Aplicação Objetos, Atributos e Métodos Classes em C# Criando Objetos em C# Referências em C# Manipulando Atributos Valores Padrão Exercícios
Leia mais4 O Workflow e a Máquina de Regras
4 O Workflow e a Máquina de Regras O objetivo do workflow e da máquina de regras é definir um conjunto de passos e regras configuráveis. Ao longo de sua execução, um usuário consegue simplificar o seu
Leia maisIntrodução... 2. Contratando o produto Link2NFe... 2. Assistente de configuração de emissor... 3. Configurações Avançadas do Emissor...
0 Conteúdo Introdução... 2 Contratando o produto Link2NFe.... 2 Assistente de configuração de emissor.... 3 Configurações Avançadas do Emissor... 5 Conhecendo o Gerenciador de Recursos da Link2business....
Leia maisConstrutor de sites SoftPixel GUIA RÁPIDO - 1 -
GUIA RÁPIDO - 1 - Sumário Introdução...3 Por que utilizar o Construtor de Sites?...3 Vantagens do Construtor de Sites...3 Conceitos básicos...3 Configuração básica do site...5 Definindo o layout/template
Leia maisSISTEMA DE MANUTENÇÃO E SUPORTE DE INFORMÁTICA SMSI TUTORIAL
SISTEMA DE MANUTENÇÃO E SUPORTE DE INFORMÁTICA SMSI TUTORIAL Pequeno tutorial para ajudá-lo a conhecer e trabalhar com o sistema SMSI. Quaisquer dúvidas e/ou sugestões que porventura possam advir após
Leia maisComo melhorar a Qualidade de Software através s de testes e nua. Cláudio Antônio de Araújo 22/11/2008
Como melhorar a Qualidade de Software através s de testes e integração contínua. nua. Cláudio Antônio de Araújo 22/11/2008 Objetivos Fornecer uma visão geral da área de testes de software, com ênfase em
Leia maisSETIS- III Seminário de Tecnologia Inovação e Sustentabilidade 4 e 5 de novembro de 2014.
A importância da comunicação no gerenciamento de projetos de softwares: reflexões teóricas Lucas Krüger lucas_kruger-@hotmail.com Resumo: Esse artigo objetiva estudar a comunicação entre cliente e desenvolvedor
Leia maisUtilizando a ferramenta de criação de aulas
http://portaldoprofessor.mec.gov.br/ 04 Roteiro Utilizando a ferramenta de criação de aulas Ministério da Educação Utilizando a ferramenta de criação de aulas Para criar uma sugestão de aula é necessário
Leia maisDocumento de Análise e Projeto VideoSystem
Documento de Análise e Projeto VideoSystem Versão Data Versão Descrição Autor 20/10/2009 1.0 21/10/2009 1.0 05/11/2009 1.1 Definição inicial do documento de análise e projeto Revisão do documento
Leia maisMANUAL TISS Versão 3.02.00
MANUAL TISS Versão 3.02.00 1 INTRODUÇÃO Esse manual tem como objetivo oferecer todas as informações na nova ferramenta SAP que será utilizada pelo prestador Mediplan, a mesma será responsável para atender
Leia maisPasso-a-Passo para Criação de Conta no site Griaule e Download do Programa SDK e da Licença Fingerprint SDK 2009
1 Importante: Passo-a-Passo para Criação de Conta no site Griaule e Download do Programa SDK e da Licença Fingerprint SDK 2009 É importante salientar que a Licença SDK não trabalha sozinha. Para que que
Leia maisUNIVERSIDADE FEDERAL DE GOIÁS CERCOMP (CENTRO DE RECURSOS COMPUTACIONAIS) TUTORIAL DE USO DO WEBMAIL - UFG
UNIVERSIDADE FEDERAL DE GOIÁS CERCOMP (CENTRO DE RECURSOS COMPUTACIONAIS) TUTORIAL DE USO DO WEBMAIL - UFG Página 1 de 26 Sumário Introdução...3 Layout do Webmail...4 Zimbra: Nível Intermediário...5 Fazer
Leia maisApresentação do Treinamento
Apresentação do Treinamento COBIT 5 Foundation 1 O COBIT 5 fornece um framework completo que ajuda as organizações a alcançar seus objetivos para a Governança e Gestão da TI Empresarial. Em outras palavras,
Leia maisCurso - Padrões de Projeto Módulo 2: Padrões de Criação
Curso - Padrões de Projeto Módulo 2: Padrões de Criação Vítor E. Silva Souza vitorsouza@gmail.com http://www.javablogs.com.br/page/engenho http://esjug.dev.java.net Sobre o Instrutor Formação: Java: Graduação
Leia maisTutoriais de apoio para a migração do e-mail @pmmc.com.br para @se-pmmc.com.br Atualização: 30/04/2014
Tutoriais de apoio para a migração do e-mail @pmmc.com.br para @se-pmmc.com.br Atualização: 30/04/2014 Sumário Introdução... 3 1. Redirecionando e-mails novos... 4 2. Fazendo backup e encaminhando e-mails
Leia maisCOMO COMEÇAR 2016 se organizando?
COMO COMEÇAR 2016 se organizando? Como começar 2016 se organizando? Conheça estratégias simples para iniciar o novo ano com o pé direito Você sabia que, de acordo com o Sebrae, os principais motivos que
Leia maisManual do Google agenda. criação e compartilhamento de agendas
Manual do Google agenda criação e compartilhamento de agendas 1 O que é o Google Agenda? Google Agenda é um serviço de agenda on line gratuito do Google, onde você pode anotar compromissos e tarefas, organizando
Leia maisSUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2
SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2 1.1 Introdução... 2 1.2 Estrutura do IP... 3 1.3 Tipos de IP... 3 1.4 Classes de IP... 4 1.5 Máscara de Sub-Rede... 6 1.6 Atribuindo um IP ao computador... 7 2
Leia maisDesvios de redações efetuadas por alunos do Ensino Médio
Desvios de redações efetuadas por alunos do Ensino Médio 1. Substitua as palavras destacadas e copie as frases, tornando os fragmentos abaixo mais elegantes, além de mais próximos à língua padrão e à proposta
Leia mais