Programação Orientada a Objetos no C#.NET usando Padrões de Projeto MARCELO SANTOS DAIBERT E MARCO ANTÔNIO PEREIRA ARAÚJO

Tamanho: px
Começar a partir da página:

Download "Programação Orientada a Objetos no C#.NET usando Padrões de Projeto MARCELO SANTOS DAIBERT E MARCO ANTÔNIO PEREIRA ARAÚJO"

Transcrição

1 POO Programação Orientada a Objetos no C#.NET usando Padrões de Projeto MARCELO SANTOS DAIBERT E MARCO ANTÔNIO PEREIRA ARAÚJO Marcelo Santos Daibert (marcelo@daibert.net) é professor do Curso de Bacharelado em Ciência da Computação da FAGOC - Faculdade Governador Ozanam Coelho na graduação e pósgraduação (especialização), Mestrando e Especialista em Ciência da Computação pela Universidade Federal de Viçosa e Bacharel em Sistemas de Informação pela Faculdade Metodista Granbery. Gerente técnico da Optical Soluções em Informática. Marco Antônio Pereira Araújo (maraujo@granbery.edu.br) é professor do Curso de Bacharelado em Sistemas de Informação da Faculdade Metodista Granbery, Doutorando e Mestre em Engenharia de Sistemas e Computação pela COPPE/UFRJ, Especialista em Métodos Estatísticos Computacionais e Bacharel em Informática pela UFJF, Analista de Sistemas da Prefeitura de Juiz de Fora. Este artigo discute Orientação a Objetos; Padrões de Projeto; Mapeamento Objeto-Relacional; Criação de classes; Programação em camadas; Persistência de objetos. Este artigo usa as seguintes tecnologias Visual Studio 2008, C#, SQL Server Com o passar dos anos foi possível observar uma profunda evolução na utilização de computadores. Hoje graças a esta evolução, juntamente com fenômenos como a globalização, é possível estar em sincronia com as notícias de todas as partes do mundo. Nunca se utilizou tanto quanto atualmente recursos computacionais, firmando assim esta tecnologia como necessária para a vida moderna atual. Neste sentido, várias evoluções foram necessárias para se alcançar o atual patamar e novas outras evoluções se fazem necessárias para alcançar novos patamares que se reservam no futuro. Na área da engenharia de software não foi diferente. O desenvolvimento de software se amadureceu e ainda deve amadurecer com o passar dos anos. Para autores da área, fatores chaves para que houvesse mudanças e evolução no desenvolvimento de software nos últimos anos são:

2 mudanças na economia, interface com o usuário, operações em rede, tempo de disponibilização para o mercado (time to market - TTM), problemas com o modelo em cascata, tecnologia de objetos (OO Orientação a Objetos) e computação em desktops. A qualidade de software passou a ser um tema muito discutido. O foco para a qualidade dos sistemas desenvolvidos dentro de uma organização ganhou papel principal entre as discussões dos engenheiros. Assim, várias são as abordagens de desenvolvimento que buscam garantir esta qualidade. Neste contexto, o C# é uma linguagem de programação que une o poder e a flexibilidade da linguagem C/C++ com a produtividade de linguagens e ambientes de desenvolvimento rápido (RAD - Rapid Application Development). Quando aplicadas técnicas da programação orientada a objetos, com padrões de desenvolvimento de software, a linguagem se mostra uma poderosa ferramenta para desenvolvimento de software, com suporte as mais novas tecnologias do mercado. Este artigo tem o objetivo de abordar de forma prática o desenvolvimento de uma aplicação, usando a linguagem C# do Visual Studio.NET 2008, utilizando os recursos da Programação Orientada a Objetos (POO), do.net, contextualizando a utilização de alguns padrões de projeto, em especial o padrão DAO (Data Access Object) para persistência e manipulação dos objetos da aplicação. Para armazenar os dados da aplicação desenvolvida é utilizado o banco de dados MS- SQL Server Toda a aplicação é desenvolvida com o conceito de programação em camadas, também discutido no artigo. Um dos desafios no desenvolvimento de aplicações orientadas a objetos é a persistência de objetos. Os bancos de dados puramente orientados a objetos são de fato os mais adequados para a persistência, mas a indisponibilidade atual desses, seja devido ao custo, diversidade e principalmente amadurecimento, faz com que seja necessária uma busca por alternativas para a realização dessa tarefa. Uma das soluções encontradas para o problema é a utilização de camadas de persistência para a manipulação dos objetos utilizando bancos de dados relacionais. Essa abordagem vem sendo amplamente utilizada no mercado, principalmente para o desenvolvimento de sistemas de médio a grande porte. Basicamente une a rapidez e o amadurecimento das bases de dados relacionais com os benefícios da programação orientada a objetos (POO). A função principal de uma camada de persistência é portal transparentemente os objetos de uma aplicação para a base de dados relacional de forma genérica. Para isso, são utilizas principalmente técnicas de mapeamento objeto-relacional com o intuito de mapear as classes e associações para tabelas e relacionamentos. A utilização de uma camada de persistência, embora pareça trivial inicialmente, se mostra complexa na prática, uma vez que são várias as configurações que devem ser feitas para que a camada funcione corretamente, além de outros fatores que dificultam sua utilização. A edição 34 da revista.net Magazine, antes chamada de MSDN Magazine, foi dedicada a esta abordagem, onde o estudo de caso apresentou a utilização de um framework de persistência chamado nhibernate. Utilizando esse mesmo raciocínio, outra solução, a abordada neste artigo, apresenta o mesmo estudo de caso apresentado na edição 34, mas com uma diferença: A própria aplicação faz o mapeamento objeto-relacional e a conexão com o banco de dados. Para isso, é apresentado o padrão de projeto DAO, que se apresenta como outra camada do sistema, com a responsabilidade de conectar no banco de dados, persistir e manipular os objetos da aplicação. Padrões de Projeto (Design Patterns): são soluções elegantes e reutilizáveis para problemas recorrentes do processo de desenvolvimento de software Orientado a Objetos. Estudo de Caso Como já apresentado, o estudo de caso deste artigo é o mesmo apresentado na edição 34 desta revista, mas com a diferença de utilizar outra abordagem na persistência de objetos. O estudo de

3 caso apresenta um fragmento de um sistema maior, representado aqui pela relação entre funcionários e departamentos de uma empresa, através das classes Departamento, Funcionario e FuncionarioHorista. A classe Funcionario é abstrata, servindo para a definição dos elementos comuns às suas subclasses através da herança. Todos os funcionários devem estar lotados em um Departamento, que pode ter vários funcionários. A Figura 1 representa o diagrama de classes do nosso sistema. Funcionario codigo : String nome : String cpf : String calcularsalario : float() FuncionarioHorista numdiastrabalhados : int numhorasdiatrabalhado : int valorhora : int 0..* 1 Departamento codigo : String Descricao : String Figura 1. Diagrama de Classes do estudo de caso. Através desse estudo de caso, são abordados temas como classes, objetos, métodos, atributos, persistência de objetos, herança, polimorfismo, herança, diálogos, associações e programação em camadas MVC (Model-View-Controller), além de temas pertinentes ao ambiente de desenvolvimento, como utilização de componentes, classes e controles disponibilizados pelo Visual Studio 2008 e o framework.net. O estudo de caso propõe o desenvolvimento em camadas, utilizando o padrão de projeto estrutura MVC, composto por três camadas fundamentais. Esta abordagem busca, entre outras coisas, o desacoplamento de funções da aplicação, facilitando assim o desenvolvimento e garantindo maior manutenibilidade da aplicação. Além das três camadas do MVC, é ainda apresentada uma outra camada, a responsável pela persistência dos dados. Esta camada, aqui chamada de camada de persistência tem a responsabilidade de comunicar com o banco de dados e de persistir e manipular os objetos neste banco. A Figura 2, representa as camadas do estudo de caso e como é feita a comunicação entre elas. Classes de Interface com usuário (View) Modelo MVC Classes de Controle (Controller) Classes de Negócio (Model) Camada de Persistência (Classes DAO) Banco de Dados SQL

4 Figura 2. Camadas do Estudo de caso. No contexto do estudo de caso, o View é representado pelas classes de interface com o usuário. Estas se comunicam com os controladores de das classes de domínio. As classes controladoras (Controller) têm a finalidade de ser um elo entre o Model e o View, ou seja, entre as classes de domínio da aplicação e a interface, garantindo assim o desacoplamento. Já o Model é representado pelas classes de domínio, e que neste estudo de caso são as classes Funcionario, FuncionarioHorista e Departamento. O Model faz acesso às classes de persistência DAO para persistir e manipular os seus objetos. E esta, por sua vez, faz acesso ao banco de dados e efetivamente faz a tarefa de persistir e manipular os objetos. Classes do Modelo, Propriedades e Métodos Para iniciar o desenvolvimento do estudo de caso, foi criado um projeto no Visual Studio chamado Empresa. Este projeto será divido em cinco namespaces, como pode ser visualizado na Figura 3. O namespace View, para armazenar as classes de interface, o Controller, para as classes controladoras, o Model, para as classes de domínio, o Persistence para as classes DAO de acesso ao banco de dados e por fim, o namespace Resources, para armazenar as imagens utilizadas nas interfaces. Figura 3. Namespaces do projeto do estudo de caso. As listagens 1, 2 e 3 apresentam o código-fonte de definição das classes Funcionario, FuncionarioHorista e Departamento, respectivamente, do estudo de caso proposto, todas dispostas no namespace Model e com os nomes: Funcionario.cs, FuncionarioHorista.cs e Departamento.cs. Listagem 1. Definição da Classe Funcionario 1. using System; 2. using System.Collections.Generic; 3. using System.Collections; 4. using System.Text; 5. using Empresa.Persistence; namespace Empresa.Model{ 8. public abstract class Funcionario{ 9. public Funcionario(String pnome, String pcpf){ 10. this.nome = pnome; 11. this.cpf = pcpf; 12. this.departamento = new Departamento(); 13. } 14. public Funcionario(){ 15. } private String codigo;

5 18. private String nome; 19. private String cpf; 20. private Departamento departamento; public String Codigo{ 23. get { return this.codigo; } 24. set { this.codigo = value; } 25. } 26. public String Nome{ 27. get { return this.nome; } 28. set { this.nome = value; } 29. } 30. public String CPF{ 31. get { return this.cpf; } 32. set { this.cpf = value; } 33. } 34. public Departamento Departamento{ 35. get { return this.departamento; } 36. set { this.departamento = value; } 37. } 38. public abstract float calcularsalario(); 39. public abstract Boolean Persistir(); 40. public abstract Boolean Atualizar(); 41. public static Funcionario RecuperaObjeto(String pid){ 42. Funcionario objfuncionario = FuncionarioDAO.recuperaObjeto(pID); 43. return objfuncionario; 44. } 45. public static IList RecuperaObjetos(){ 46. IList listfuncionarios = FuncionarioDAO.recuperaObjetos(); 47. return listfuncionarios; 48. } 49. public static IList RecuperaObjetosPorDepartamento(String poid){ 50. IList listfuncionarios = FuncionarioDAO.recuperaObjetosPorDepartamento(pOID); 51. return listfuncionarios; 52. } 53. public static Boolean Excluir(String pid){ 54. return FuncionarioDAO.excluir(pID); 55. } 56. } 57. } Na Listagem 1, a linha 8 exibe a assinatura da classe abstrata Funcionario. Ela é abstrata por não instanciar objetos, tendo por objetivo definir os elementos comuns às suas subclasses. Entre as linhas 17 e 20 são apresentados os atributos codigo, nome, cpf e departamento da classe. Todos com visibilidade privada, sendo acessados pelas propriedades definidas entre as linhas 22 e 37. As propriedades, nesse caso, agem como métodos gets e sets, mantendo, portanto, o encapsulamento da classe. Nota: Encapsulamento é a prática de limitar o acesso às informações de um objeto, fazendo com que somente os seus métodos tenham acesso aos dados e à manipulação dos atributos. O encapsulamento disponibiliza o objeto com toda sua funcionalidade sem a necessidade de saber internamente o funcionamento, aumentando assim a manutenibilidade do sistema. Das linhas 9 a 15 são apresentados os métodos construtores da classe, onde temos dois: um com passagem de parâmetros dos atributos na sua construção e outro sobrecarregando o anterior sem parâmetros, usado para instanciar um objeto sem informações para seus atributos. O método sobrecarregado (overload) é definido quando a assinatura do mesmo, difere do anterior na passagem de parâmetros. Uma classe pode ter quantos métodos sobrecarregados forem necessários. Na linha 38 é exibido a assinatura do método abstrato calcularsalario. Ele é abstrato, pois é redefinido nas subclasses, de acordo com a necessidade específica de implementação. A isso é dado

6 o nome de polimorfismo, que é a capacidade de um método de mesma assinatura comportar-se de maneira diferente, em uma mesma hierarquia. Exemplificando o uso, o método calcularsalario possui a mesma assinatura em toda a hierarquia, no entanto, ele se comporta de maneira diferente na subclasse FuncionaoHorista, uma vez que o algoritmo para calcular salário é diferente nessa subclasse. O fato do método ser definido como abstrato (abstract) em sua assinatura, obriga suas subclasses a implementá-lo. Entre as linhas 39 e 55 são definidos os métodos responsáveis pela persistência e manipulação dos objetos do tipo Funcionario. Observe que todos esses métodos fazem acesso às classes DAO, que é importado para a classe pela linha 5 (using Empresa.Persistence). Como já apresentado, as classes DAO são as responsáveis pela conexão com o banco de dados e pela persistência e manipulação dos objetos. De acordo com a programação em camadas, estes métodos serão chamados pelos controladores da classe para finalmente, a classe fazer as chamadas para as classes DAO como apresentado acima. Observe que são definidos algum métodos com o modificador static, como por exemplo, na linha 45. Este indica que o método é um método de classe e não é necessário instanciar objeto para que o mesmo seja invocado. Nota: Método de Classe é um método que não há a necessidade se instanciar um objeto da classe para poder acessá-lo. Diferentemente do método de instância, que como o próprio nome diz, é necessário a instanciação do objeto para sua invocação. Listagem 2. Definição da Classe FuncionarioHorista 1. using System; 2. using System.Collections.Generic; 3. using System.Collections; 4. using System.Text; 5. using Empresa.Persistence; namespace Empresa.Model{ 8. class FuncionarioHorista : Funcionario{ 9. public FuncionarioHorista(String pnome, String pcpf, int pvalorhora, int pnumdiastrabalhado, int pnumhorastrabalhada) 10. : base(pnome, pcpf){ 11. this.valorhora = pvalorhora; 12. this.numhorasdiatrabalhado = pnumhorastrabalhada; 13. this.numdiastrabalhados = pnumdiastrabalhado; 14. } 15. public FuncionarioHorista(){ 16. } private int numdiastrabalhados; 19. private int numhorasdiatrabalhado; 20. private int valorhora; public int NumDiasTrabalhados{ 23. get { return this.numdiastrabalhados; } 24. set { this.numdiastrabalhados = value; } 25. } 26. public int NumHorasDiaTrabalhado{ 27. get { return this.numhorasdiatrabalhado; } 28. set { this.numhorasdiatrabalhado = value; } 29. } 30. public int ValorHora{ 31. get { return this.valorhora; } 32. set { this.valorhora = value; } 33. } public override float calcularsalario(){ 36. return this.valorhora * this.numhorasdiatrabalhado * this.numdiastrabalhados; 37. }

7 38. public override Boolean Persistir(){ 39. FuncionarioHoristaDAO objfunhoristadao = new FuncionarioHoristaDAO(); 40. if (objfunhoristadao.persistir(this)){ 41. return true; 42. }else{ 43. return false; 44. } 45. } 46. public override Boolean Atualizar(){ 47. FuncionarioHoristaDAO objfunhoristadao = new FuncionarioHoristaDAO(); 48. if (objfunhoristadao.atualizar(this)) 49. { 50. return true; 51. } 52. else 53. { 54. return false; 55. } 56. } 57. } 58. } Já na Listagem 2, é definida a classe FuncionarioHorista, com seus atributos, propriedades e métodos. Importante observar nas linhas 8 e 16, no método construtor da classe, a utilização da palavra reservada base. Essa é utilizada para invocar o método construtor do pai, passando os parâmetros referentes à super classe. Deve sempre suceder a assinatura do método separado por dois pontos. Lembrando que a ordem dos parâmetros deve ser a mesma da assinatura, assim como em qualquer chamada de método. A linha 35 apresenta a definição do método calcularsalario. Como esse método remete ao método abstrato do pai, o mesmo deve ser definido como override. Esse sim com implementação em sua definição. Listagem 3. Definição da Classe Departamento 1. using System; 2. using System.Collections.Generic; 3. using System.Collections; 4. using System.Text; 5. using System.Windows.Forms; 6. using Empresa.Persistence; namespace Empresa.Model{ 9. public class Departamento{ 10. public Departamento(){ 11. } private String codigo; 14. private String descricao; public String Codigo{ 17. get { return this.codigo; } 18. set { this.codigo = value; } 19. } 20. public String Descricao{ 21. get { return this.descricao; } 22. set { this.descricao = value; } 23. } 24. public Boolean Persistir(){ 25. DepartamentoDAO objdepartamentodao = new DepartamentoDAO(); 26. if (objdepartamentodao.persistir(this)){ 27. return true; 28. }else{ 29. return false; 30. } 31. } 32. public Boolean Atualizar(){

8 33. DepartamentoDAO objdepartamentodao = new DepartamentoDAO(); 34. if (objdepartamentodao.atualizar(this)){ 35. return true; 36. } 37. else{ 38. return false; 39. } 40. } 41. public static Departamento RecuperaObjeto(String pid){ 42. Departamento objdepartamento = DepartamentoDAO.recuperaObjeto(pID); 43. return objdepartamento; 44. } 45. public static IList RecuperaObjetos(){ 46. IList listdepartamentos = DepartamentoDAO.recuperaObjetos(); 47. return listdepartamentos; 48. } 49. public static Boolean Excluir(String pid){ 50. return DepartamentoDAO.excluir(pID); 51. } 52. } 53. } Por fim, na Listagem 3 é apresentada a classe Departamento, com seus atributos, propriedades e métodos. Na linha 10 é exibido o método construtor do objeto. Entre as linhas 13 e 23 são exibidos os atributos e propriedades da classe. Nas classes apresentadas nas listagens anteriores são definidos os métodos Persistir (persiste um objeto), Atualizar (atualiza um objeto já persistido), RecuperaObjeto (recupera um único objeto especificado), RecuperaObjetos (recupera todos os objetos da classe referenciada) e Excluir (exclui um objeto especificado). Esses são os métodos responsáveis pela persistência e manipulação dos objetos no sistema. Observe que todos fazem acesso às classes DAO, do namespace Persistence. A classe Funcionario possui ainda o método RecuperaObjetosPorDepartamento. Este método recupera todos os funcionários de um determinado departamento especificado. Classes de Interface e Controladores Dentro do namespace View estão dispostas as classes com as interfaces, como visualizado na Figura 4. São definidas as seguintes interfaces: frmprincipal (a interface principal do sistema, apresentada na Figura 5), frmsplashscreen (com a interface de inicialização da aplicação), frmsobre (interface sobre do sistema), frmlistartemplate (define um template para reutilização de interfaces, baseando-se no conceito de herança de interfaces), frmlistarfuncionario (herda de frmlistartemplate e apresenta a interface de visualização de todos os funcionários), frmlistardepartamento (também herda de frmlistartemplate e apresenta a interface de visualização de todos os departamentos), frmnovofuncionariotemplate (define o template para a interface de novos funcionários), frmnovofuncionariohorista (interface para criar um novo funcionário horista), frmnovodepartamento (interface para criar um novo departamento no sistema), e por fim a interface frmfuncionariosdepartamento (lista todos os funcionários de um determinado departamento).

9 Figura 4. Classes de Interface. Figura 5. Interface Principal do Sistema - frmprincipal. As classes de interface definem as interfaces da aplicação (View). Estas, por sua vez, fazem acesso às classes controladoras (Controller), que então fazem acesso às classes do modelo (Model), já definidas. E as classes do modelo fazem acesso às classes de persistência DAO (Persistence DAO). As classes controladoras são definidas dentro do namespace Controller. As Listagens 4 e 5 apresentam respectivamente os controladores cntrfuncionario e cntrfuncionariohorista. Todos possuem a mesma funcionalidade: elo de ligação entre o model e o view. A estrutura também é muito semelhante em todas essas classes. Elas basicamente possuem um atributo do tipo da classe que gerenciam, menos para a cntrfuncionario, já que esta gerencia uma classe abstrata. Os métodos também possuem a mesma estrutura e todos fazem acesso ao modelo. Basicamente existe o método Salvar, responsável por persistir ou atualizar um objeto, o método RecuperaObjeto, para recuperar um determinado objeto, o RecuperaObjetos, para recuperar todos os objetos da classe persistidos e o método Excluir, responsável por excluir um determinado objeto. Listagem 4. Definição da Classe cntrfuncionario 1. using System; 2. using System.Collections.Generic; 3. using System.Collections; 4. using System.Text; 5. using Empresa.Model; 6. using Empresa.Persistence; namespace Empresa.Controller{

10 9. class cntrfuncionario{ 10. public cntrfuncionario(){ 11. } 12. public static ArrayList RecuperaObjetos(){ 13. ArrayList vetenviafuncionarios = new ArrayList(); 14. IList listfuncionarios = Funcionario.RecuperaObjetos(); 15. for (int i = 0; i < listfuncionarios.count; i++) 16. { 17. Funcionario objbuffer = (Funcionario)listFuncionarios[i]; 18. String[] vbuffer = new String[4]; 19. vbuffer[0] = objbuffer.codigo; 20. vbuffer[1] = objbuffer.nome; 21. vbuffer[3] = objbuffer.departamento.descricao; 22. if (objbuffer is FuncionarioHorista) 23. { 24. vbuffer[2] = "Horista"; 25. } 26. vetenviafuncionarios.add(vbuffer); 27. } 28. return vetenviafuncionarios; 29. } 30. public static ArrayList RecuperaObjetosPorDepartamento(String poid){ 31. ArrayList vetenviafuncionarios = new ArrayList(); 32. IList listfuncionarios = Funcionario.RecuperaObjetosPorDepartamento(pOID); 33. for (int i = 0; i < listfuncionarios.count; i++) 34. { 35. Funcionario objbuffer = (Funcionario)listFuncionarios[i]; 36. String[] vbuffer = new String[3]; 37. vbuffer[0] = objbuffer.codigo; 38. vbuffer[1] = objbuffer.nome; 39. vbuffer[2] = Convert.ToString(objBuffer.calcularSalario()); 40. vetenviafuncionarios.add(vbuffer); 41. } 42. return vetenviafuncionarios; 43. } 44. public static Boolean Excluir(String pid){ 45. return Funcionario.Excluir(pID); 46. } 47. public static int ContabilizaFuncionariosPorDepartamento(String piddepartamento){ 48. return FuncionarioDAO.ContabilizaFuncionariosPorDepartamento(pIDDepartamento); 49. } 50. } 51. } Na Listagem 4, a classe cntrfuncionario apresenta três métodos estáticos, responsáveis pela manipulação genérica de objetos de toda a hierarquia da classe Funcionario. O primeiro é o RecuperaObjetos responsável por retornar à interface, um vetor aninhado com todos os objetos do tipo Funcionario da base de dados. Para isso, é invocado o RecuperaObjetos da classe Funcionario, que retorna uma coleção de objetos. Com essa coleção, é então montado o vetor com os dados de cada funcionário, que será retornado à interface. O método RecuperaObjetosPorDepartamento faz ação semelhante ao RecuperaObjetos, mas filtrando os funcionários por um determinado departamento. Para isso, o método recebe por parâmetro o OID (Object Identification Atributo identificador) do departamento. Desta forma, o método invoca então o método da classe Funcionario RecuperaObjetosPorDepartamento. Já o método Excluir se responsabiliza em receber como parâmetro uma string representando o OID do objeto que a interface deseja excluir e aciona o Excluir da classe Funcionario. Listagem 5. Definição da Classe cntrfuncionariohorista 1. using System; 2. using System.Collections.Generic; 3. using System.Collections;

11 4. using System.Text; 5. using Empresa.Model; namespace Empresa.Controller{ 8. class cntrfuncionariohorista{ 9. private FuncionarioHorista objfuncionariohorista; 10. public cntrfuncionariohorista(){ 11. } 12. public Boolean Salvar(ArrayList plista){ 13. if (plista[0] == null){ 14. //Criar um Novo 15. this.objfuncionariohorista = new FuncionarioHorista(); 16. this.objfuncionariohorista.codigo = System.Guid.NewGuid().ToString(); 17. this.objfuncionariohorista.nome = Convert.ToString(pLista[1]); 18. this.objfuncionariohorista.cpf = Convert.ToString(pLista[2]); 19. this.objfuncionariohorista.departamento = Departamento.RecuperaObjeto(Convert.ToString(pLista[3])); 20. this.objfuncionariohorista.numdiastrabalhados = Convert.ToInt16(pLista[4]); 21. this.objfuncionariohorista.numhorasdiatrabalhado = Convert.ToInt16(pLista[5]); 22. this.objfuncionariohorista.valorhora = Convert.ToInt16(pLista[6]); 23. if (objfuncionariohorista.persistir()){ 24. return true; 25. } 26. else{ 27. return false; 28. } 29. } 30. else{ 31. //Atualização 32. this.objfuncionariohorista = (FuncionarioHorista)Funcionario.RecuperaObjeto(pLista[0].ToString()); 33. this.objfuncionariohorista.nome = Convert.ToString(pLista[1]); 34. this.objfuncionariohorista.cpf = Convert.ToString(pLista[2]); 35. this.objfuncionariohorista.departamento = Departamento.RecuperaObjeto(Convert.ToString(pLista[3])); 36. this.objfuncionariohorista.numdiastrabalhados = Convert.ToInt32(pLista[4]); 37. this.objfuncionariohorista.numhorasdiatrabalhado = Convert.ToInt32(pLista[5]); 38. this.objfuncionariohorista.valorhora = Convert.ToInt32(pLista[6]); 39. if (objfuncionariohorista.atualizar()){ 40. return true; 41. } 42. else{ 43. return false; 44. } 45. } 46. } 47. public ArrayList RecuperaObjeto(String poid){ 48. ArrayList vetenvia = new ArrayList(); 49. this.objfuncionariohorista = (FuncionarioHorista)Funcionario.RecuperaObjeto(pOID); 50. vetenvia.add(this.objfuncionariohorista.codigo); 51. vetenvia.add(this.objfuncionariohorista.nome); 52. vetenvia.add(this.objfuncionariohorista.cpf); 53. vetenvia.add(this.objfuncionariohorista.departamento.codigo); 54. vetenvia.add(this.objfuncionariohorista.numdiastrabalhados); 55. vetenvia.add(this.objfuncionariohorista.numhorasdiatrabalhado); 56. vetenvia.add(this.objfuncionariohorista.valorhora); 57. return vetenvia; 58. } 59. } 60. } Na Listagem 5 é apresentada a classe cntrfuncionariohorista. O primeiro método apresentado é o Salvar, que é invocado pela interface quando o usuário aciona essa opção no formulário. Ele recebe como parâmetro um ArrayList com os dados do FuncionarioHorista. É de

12 responsabilidade da interface, pegar os dados digitados pelo usuário no formulário e montar esse vetor. O método então verifica se é uma operação de atualização ou de criação. Caso seja de atualização é invocado o Atualizar (linha 39) do objeto. Para o outro caso, é acionado o método Persistir (linha 23). No caso de criação de um novo funcionário, é atribuído ao código do objeto, um novo OID, usando a estratégia do GUID (linha 16). O segundo método apresentado é o RecuperaObjeto, que recebe como parâmetro uma string, representando o OID do objeto que a interface deseja recuperar. O método então invoca o RecuperaObjeto da classe FuncionarioHorista e monta um vetor com os seus dados e o devolve para a interface. A interface então pode tratar da forma que lhe for conveniente. A classe controladora do Departamento, a cntrdepartamento possui definição semelhante as já apresentadas e por isso não esta sendo definida. Nota: O código-fonte completo da aplicação esta disponível para download. Mapeamento Objeto-Relacional e Banco de Dados O mapeamento objeto-relacional é uma abordagem que permite a construção de sistemas utilizando o paradigma Orientado a Objetos com a persistência desses objetos em bancos de dados relacionais. Utilizando-se de técnicas e estratégias específicas, é possível mapear classes com seus atributos e associações para o modelo relacional. Utiliza-se uma abstração bastante intuitiva no sentido de que uma classe pode ser mapeada para uma tabela no banco de dados relacional e atributos da classe para campos da tabela. Porém, algumas diferenças entre os dois modelos, como o OID, tipos de dados, herança e associações, demandam um estudo mais detalhado das estratégias de mapeamento. Para o estudo de caso, a construção da base de dados seguiu esse raciocínio. A classe Departamento foi mapeada para a tabela Departamento, com seus atributos sendo os campos da tabela e a hierarquia Funcionario e FuncionarioHorista sendo mapeada para as tabelas Funcionario e FuncionarioHorista, cada uma com os seus respectivos atributos sendo os campos das tabelas Para estabelecer a hierarquia, a chave primária da tabela FuncionarioHorista é a mesma chave primária da tabela Funcionario, estabelecendo assim uma relação de chave primária estrangeira. Existem outras duas possíveis alternativas para se mapear uma hierarquia: criar uma única tabela, com todos os atributos como campos da tabela, com um campo adicional chamado tipo, que representa a classe que instanciou cada objeto ou criar uma nova tabela para cada classe concreta, contendo os seus atributos, mais os atributos da classe abstrata. Assim, a Listagem 6 apresenta o script para criação do banco, resultante do mapeamento objeto-relacional realizado com as classes do estudo de caso. A base de dados utilizada para o estudo de caso é o SQL SERVER 2005 Express Edition. No entanto, qualquer outra base seria suportada nesta arquitetura. Listagem 6. Script para criação das tabelas no banco de dados CREATE TABLE Departamento( ID varchar(38) NOT NULL PRIMARY KEY, Descricao varchar(50) NOT NULL, ) CREATE TABLE Funcionario( ID varchar(38) NOT NULL PRIMARY KEY, Nome varchar(50) NOT NULL, CPF varchar(14) NOT NULL, DepartamentoOID varchar(38) NOT NULL, ) CREATE TABLE FuncionarioHorista( ID varchar(38) NOT NULL PRIMARY KEY, NumDiasTrabalhados int NOT NULL,

13 NumHorasDiaTrabalhado int NOT NULL, ValorHora int NOT NULL, ) ALTER TABLE Funcionario ADD CONSTRAINT fk_dptooid FOREIGN KEY(DepartamentoOID) REFERENCES Departamento(ID) ALTER TABLE FuncionarioHorista ADD CONSTRAINT fk_dptooid FOREIGN KEY(ID) REFERENCES Funcionario(ID) Classes de Persistência e Manipulação de Objetos Conforme já apresentado, o namespace Persistence constitui uma importante parte da aplicação. A parte que é responsável pela persistência e manipulação dos objetos no banco de dados relacional. Neste são definidas as classes que representam um padrão de projeto chamado DAO Data Access Object que, basicamente, define o encapsulamento do acesso aos dados por meio de classes especificamente construídas para essa tarefa. Assim, para cada classe persistente do modelo existe uma classe DAO correspondente. No entanto, antes de se utilizar os métodos das classes DAO, é necessário se conectar e autenticar no banco de dados e configurar o catálogo correspondente no SQL SERVER que possui a estrutura de tabelas já apresentadas. Para isso, dentro do namespace Persistence, foi criada uma classe com o nome FabricaConexao, com objetivo de centralizar a conexão com a base de dados em um único lugar e certificando que ela será feita somente uma única vez ao carregar a aplicação. Essa classe é a implementação de um padrão de projeto criacional chamado Singleton, que garante que uma classe possua apenas uma única instância fornecendo um ponto global de acesso para a mesma, através de atributos e definições estáticas (static). Com isso é disponibilizado à classe um ponto global e único de conexão à base de dados, necessário para a persistência e manipulação dos objetos de forma eficaz e eficiente. A Listagem 7 apresenta a definição dessa classe (crie um arquivo CS - FabricaConexao.cs - semelhante aos exemplos anteriores dentro do namespace Persistence). Listagem 7. Definição da Classe FabricaConexao 1. using System; 2. using System.Collections.Generic; 3. using System.Text; 4. using System.Data.SqlClient; namespace Empresa.Persistence{ 7. public class FabricaConexao{ 8. private String stringconnection = "Data Source=NOTEBK-DAIBERT\\SQLEXPRESS; Initial Catalog=Empresa;Integrated Security=SSPI;MultipleActiveResultSets=True"; 9. private static SqlConnection objconexao = null; public FabricaConexao(){ 12. objconexao = new SqlConnection(); 13. objconexao.connectionstring = stringconnection; 14. objconexao.open(); 15. } 16. public static SqlConnection getconexao(){ 17. if (objconexao == null){ 18. new FabricaConexao(); 19. } 20. return objconexao; 21. } 22. public static void fecharconexao(){ 23. objconexao.close(); 24. } 25. } 26. } A Listagem 7, define a classe FabricaConexao. Esta classe faz uso, para este caso de uso, da classe SqlConnection, disponibilizada em System.Data.SqlClient (linha 4). Ela possui dois atributos: stringconnection, que armazena em uma string a string de conexão para o banco de dados,

14 configurando o servidor, o catálogo, forma de autenticação, e o atributos objconexao, este do tipo SqlConnection que é o responsável por realizar a conexão com o banco de dados com os dados definidos na stringconnection. Entre as linhas 11 e 15 é definido o método construtor da classe. Este instancia um objeto SqlConnection no atributo objconexao, configura a string de conexão e aciona o método Open. Este se conecta no banco de dados e mantém um ponteiro na base de dados autenticada para que aplicação faça uso. Entre as linhas 16 e 21, é definido o método getconexao. Este disponibiliza o objconexao à aplicação. Observe que este método verifica se o objconexao é null. Se for, ele invoca o método construtor que por sua vez, como definido, irá instanciar objconexao. Desta forma, garante-se que esta instancia é única em toda a aplicação. Toda solicitação de conexão ao banco de dados é centralizada nesta classe a sempre feita através deste método getconexao. Por fim, na linha 22, é definido o método fecharconexao. Este tem como objetivo fechar a conexão com o banco de dados, utilizada somente quando a aplicação se finaliza no estudo de caso. Com isso, é possível analisar as definições das classes DAO. Como já apresentado, cada classe do modelo (Funcionario, FuncionarioHorista e Departamento) possui o seu DAO correspondente. Desta forma, tem-se: FuncionarioDAO, FuncionarioHoristaDAO e DepartamentoDAO. Todos definidos de forma autônoma, cada um em uma classe dentro do namespace Persistence. As Listagens 8 e 9 definem as classes FuncionarioDAO e FuncionarioHoristaDAO respectivamente. Observe que as classes DAO recebem as chamadas das classes do modelo (classes de domínio) e são as únicas da aplicação que acessam o banco de dados, respeitando assim o que fora definido referente à programação em camadas. Diferentemente como observado quando se é utilizado um framework de persistência, como o nhibernate, nesta abordagem, as classes DAO manipulam os objetos com SQL diretamente em seus métodos. Novamente, para fins do estudo de caso, é omitida a classe DAO correspondente ao Departamento, pois esta possui definição muito semelhante às apresentadas. Listagem 8. Definição da Classe FuncionarioDAO 1. using System; 2. using System.Collections; 3. using System.Text; 4. using System.Data.SqlClient; 5. using Empresa.Model; 6. using Empresa.Controller; namespace Empresa.Persistence{ 9. class FuncionarioDAO{ 10. public FuncionarioDAO(){ 11. } 12. public static Funcionario recuperaobjeto(string pid){ 13. SqlConnection objconexao = FabricaConexao.getConexao(); 14. String strquery = "SELECT ID, Nome, CPF, DepartamentoOID FROM Funcionario WHERE ID = '"+pid+"'"; 15. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 16. cntrdepartamento objcontrollerdepartamento = new cntrdepartamento(); 17. SqlDataReader objleitor2; 18. Funcionario objfuncionario = null; 19. FuncionarioHorista objfuncionariohorista; 20. try{ 21. objcommand.executenonquery(); 22. SqlDataReader objleitor = objcommand.executereader(); 23. while (objleitor.read()){ 24. //Verificar Tipo do Funcionário e Recuperar o Restante do Funcionário 25. //Tentar em Todos os Filhos, até encontrar a Chave Primária Estrangeira Igual 26. strquery = "SELECT ID, NumDiasTrabalhados, NumHorasDiaTrabalhado, ValorHora FROM FuncionarioHorista WHERE ID = '" + objleitor[0] + "'"; 27. objcommand = new SqlCommand(strQuery, objconexao); 28. objcommand.executenonquery(); 29. objleitor2 = objcommand.executereader();

15 30. while (objleitor2.read()){ 31. objfuncionariohorista = new FuncionarioHorista(); 32. objfuncionariohorista.numdiastrabalhados = Convert.ToInt32(objLeitor2[1]); 33. objfuncionariohorista.numhorasdiatrabalhado = Convert.ToInt32(objLeitor2[2]); 34. objfuncionariohorista.valorhora = Convert.ToInt32(objLeitor2[3]); 35. objfuncionariohorista.codigo = Convert.ToString(objLeitor[0]); 36. objfuncionariohorista.nome = Convert.ToString(objLeitor[1]); 37. objfuncionariohorista.cpf = Convert.ToString(objLeitor[2]); 38. objfuncionariohorista.departamento = objcontrollerdepartamento.recuperaobjetoobjeto(convert.tostring(objleitor[3])); 39. objfuncionario = (Funcionario)objFuncionarioHorista; 40. } 41. //Fim Tentativas de Descobrir Tipo Funcionário 42. } 43. objleitor.close(); 44. return objfuncionario; 45. }catch (SqlException err){ 46. String strerro = "Erro: " + err.tostring(); 47. Console.Write(strErro); 48. return objfuncionario; 49. } 50. } 51. public static IList recuperaobjetospordepartamento(string poid){ 52. IList listfuncionarios = new ArrayList(); 53. SqlConnection objconexao = FabricaConexao.getConexao(); 54. String strquery = "SELECT ID, Nome, CPF, DepartamentoOID FROM Funcionario WHERE DepartamentoOID = '"+poid+"'"; 55. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 56. cntrdepartamento objcontrollerdepartamento = new cntrdepartamento(); 57. SqlDataReader objleitor2; 58. try{ 59. objcommand.executenonquery(); 60. SqlDataReader objleitor = objcommand.executereader(); 61. while (objleitor.read()){ 62. //Verificar Tipo do Funcionário e Recuperar o Restante do Funcionário 63. //Tentar em Todos os Filhos, até encontrar a Chave Primária Estrangeira Igual 64. strquery = "SELECT ID, NumDiasTrabalhados, NumHorasDiaTrabalhado, ValorHora FROM FuncionarioHorista WHERE ID = '" + objleitor[0] + "'"; 65. objcommand = new SqlCommand(strQuery, objconexao); 66. objcommand.executenonquery(); 67. objleitor2 = objcommand.executereader(); 68. while (objleitor2.read()){ 69. FuncionarioHorista objfuncionario = new FuncionarioHorista(); 70. objfuncionario.numdiastrabalhados = Convert.ToInt32(objLeitor2[1]); 71. objfuncionario.numhorasdiatrabalhado = Convert.ToInt32(objLeitor2[2]); 72. objfuncionario.valorhora = Convert.ToInt32(objLeitor2[3]); 73. objfuncionario.codigo = Convert.ToString(objLeitor[0]); 74. objfuncionario.nome = Convert.ToString(objLeitor[1]); 75. objfuncionario.cpf = Convert.ToString(objLeitor[2]); 76. objfuncionario.departamento = objcontrollerdepartamento.recuperaobjetoobjeto(convert.tostring(objleitor[3])); 77. listfuncionarios.add(objfuncionario); 78. } 79. //Fim Tentativas de Descobrir Tipo Funcionário 80. } 81. objleitor.close(); 82. return listfuncionarios; 83. }catch (SqlException err){ 84. String strerro = "Erro: " + err.tostring(); 85. Console.Write(strErro);

16 86. return listfuncionarios; 87. } 88. } 89. public static IList recuperaobjetos(){ 90. IList listfuncionarios = new ArrayList(); 91. SqlConnection objconexao = FabricaConexao.getConexao(); 92. String strquery = "SELECT ID, Nome, CPF, DepartamentoOID FROM Funcionario"; 93. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 94. cntrdepartamento objcontrollerdepartamento = new cntrdepartamento(); 95. SqlDataReader objleitor2; 96. try{ 97. objcommand.executenonquery(); 98. SqlDataReader objleitor = objcommand.executereader(); 99. while (objleitor.read()) { 100. //Verificar Tipo do Funcionário e Recuperar o Restante do Funcionário 101. //Tentar em Todos os Filhos, até encontrar a Chave Primária Estrangeira Igual 102. strquery = "SELECT ID, NumDiasTrabalhados, NumHorasDiaTrabalhado, ValorHora FROM FuncionarioHorista WHERE ID = '"+objleitor[0]+"'"; 103. objcommand = new SqlCommand(strQuery, objconexao); 104. objcommand.executenonquery(); 105. objleitor2 = objcommand.executereader(); 106. while (objleitor2.read()){ 107. FuncionarioHorista objfuncionario = new FuncionarioHorista(); 108. objfuncionario.numdiastrabalhados = Convert.ToInt32(objLeitor2[1]); 109. objfuncionario.numhorasdiatrabalhado = Convert.ToInt32(objLeitor2[2]); 110. objfuncionario.valorhora = Convert.ToInt32(objLeitor2[3]); 111. objfuncionario.codigo = Convert.ToString(objLeitor[0]); 112. objfuncionario.nome = Convert.ToString(objLeitor[1]); 113. objfuncionario.cpf = Convert.ToString(objLeitor[2]); 114. objfuncionario.departamento = objcontrollerdepartamento.recuperaobjetoobjeto(convert.tostring(objleitor[3])); 115. listfuncionarios.add(objfuncionario); 116. } 117. //Fim Tentativas de Descobrir Tipo Funcionário 118. } 119. objleitor.close(); 120. return listfuncionarios; 121. } 122. catch (SqlException err){ 123. String strerro = "Erro: " + err.tostring(); 124. Console.Write(strErro); 125. return listfuncionarios; 126. } 127. } 128. public static Boolean excluir(string pid){ 129. SqlConnection objconexao = FabricaConexao.getConexao(); 130. //Criar query para deletar o funcionario associado. Criar query para todos os tipos String strquery = "DELETE FROM Funcionario WHERE ID = '" + pid + "'"; 132. strquery = strquery + "; DELETE FROM FuncionarioHorista WHERE ID = '"+ pid +"'"; 133. //Caso tivesse mais tipos, adicionar a query para todos os tipos, por exemplo FuncionarioDiarista caso existisse: 134. //strquery = strquery + "; DELETE FROM FuncionarioDiarista WHERE ID = '" + pid + "'"; 135. //Desta forma todo tipo de funcionário seria deletado, sem que seja necessário descobrir o seu tipo específico. A query não retorna erro quando não encontra o objeto na clausula WHERE 136. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 137. try{ 138. objcommand.executenonquery(); 139. return true; 140. }catch (SqlException err){ 141. String strerro = "Erro: " + err.tostring();

17 142. Console.Write(strErro); 143. return false; 144. } 145. } 146. public static int ContabilizaFuncionariosPorDepartamento(String piddepartamento) { 147. SqlConnection objconexao = FabricaConexao.getConexao(); 148. String strquery = "SELECT COUNT(*) FROM Funcionario WHERE DepartamentoOID = '"+piddepartamento+"'"; 149. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 150. int vretorno = 0; 151. try{ 152. objcommand.executenonquery(); 153. SqlDataReader objleitor = objcommand.executereader(); 154. while (objleitor.read()) 155. { 156. vretorno = Convert.ToInt32(objLeitor[0]); 157. } 158. return vretorno; 159. }catch (SqlException err){ 160. String strerro = "Erro: " + err.tostring(); 161. Console.Write(strErro); 162. return vretorno; 163. } 164. } 165. } 166. } Em toda a estrutura DAO, existem basicamente os seguintes métodos: recuperaobjeto (recupera um objeto em específico da classe referenciada), recuperaobjetos (recupera todos os objetos da classe referenciada), persistir (persiste um objeto no banco de dados), atualizar (atualiza um objeto em específico com novas informações) e excluir (excluir um objeto especifico). Outros métodos são definidos, mas as chamadas operações CRUD (CREATE, RETRIEVE, UPDATE e DELETE) são feitas por estes apresentados. O CRUD representa todas as operações básicas necessárias para a persistência e manipulação de objetos em uma base de dados relacional. A Listagem 8 inicia importando as bibliotecas e os namespaces que fará uso. Isso ocorre entre as linhas 1 e 6. Da linha 12 até a 50 é definido o método recuperaobjeto. Este método recebe por parâmetro o atributo identificador de um Funcionário que ao final do método é recuperado da base de dados e disponibilizado à aplicação. Na linha 13 é feito a solicitação à classe FabricaConexao pelo objeto de conexão. Com este, é possível estabelecer consultar no banco de dados configurado. Na linha 14, é definida uma variável chamada strquery. Esta variável armazena a consulta SQL que será enviada para o banco de dados. Observe que neste caso esta sendo feito um SELECT, solicitando os campos ID, Nome, CPF, DepartamentoOID da tabela Funcionario que tenha o ID passado por parâmetro. Após, na linha 15, é instanciado um objeto do tipo SqlCommand, responsável por executar a consulta na base de dados, configurada pela conexão recebida pelo FabricaConexao. Entre as linhas 23 e 44, é feito um esforço para recuperar as informações da base de dados e então popular um objeto, que é então retornado como retorno do método. Na linha 38, é solicitado ao controlador de Departamento que recupere o objeto Departamento associado ao Funcionário, já que todo funcionário deve estar alocado em um departamento. O método RecuperaObjetoObjeto, da classe cntrdepartamento é um método de classe que retorna um objeto Departamento de acordo com o parâmetro passado. A partir da linha 23 o método busca identificar o tipo do funcionário para recuperar todas as informações e que seja instanciado um objeto de forma correta da hierarquia. Entre as linhas 89 e 127 é definido o método recuperaobjetos. Este recupera todos os objetos da base de dados. O seu funcionamento é semelhante ao recuperaobjeto, mas com uma diferença: não é retornado um objeto, mas sim uma lista de objetos todos os persistidos na base de dados. O tipo de retorno do método é IList, que é a interface da classe Collections. O que permite a utilização da classe ArrayList, como definido na linha 90. Já entre as linhas 128 e 145 é apresentado o método

18 excluir. Este recebe o atributo identificador do funcionário como parâmetro e o excluir da base de dados, retornando verdadeiro em caso de sucesso e falso em caso de insucesso. Nas linhas 146 à 164 é definido o método ContabilizaFuncionariosPorDepartamento. Este método faz uma contagem no banco de dados de quantos funcionários existem em um determinado departamento. Por fim, entre as linhas 51 e 88 é apresentado o método recuperaobjetospordepartamento. Este responsável por recuperar uma lista de funcionários de um determinado departamento. Para isso é feita uma consulta restritiva no campo DepartamentoOID, como pode ser observado na linha 54. Listagem 9. Definição da Classe FuncionarioHoristaDAO 1. using System; 2. using System.Collections.Generic; 3. using System.Text; 4. using Empresa.Model; 5. using System.Data.SqlClient; namespace Empresa.Persistence{ 8. class FuncionarioHoristaDAO{ 9. public FuncionarioHoristaDAO(){ 10. } 11. public Boolean persistir(funcionariohorista pfunhorista){ 12. SqlConnection objconexao = FabricaConexao.getConexao(); 13. String strquery = "INSERT INTO Funcionario VALUES('" + pfunhorista.codigo + "','" + pfunhorista.nome + "','"+ pfunhorista.cpf +"','"+pfunhorista.departamento.codigo+"')"; 14. strquery = strquery + "; INSERT INTO FuncionarioHorista VALUES ('"+pfunhorista.codigo+"','"+pfunhorista.numdiastrabalhados+"','"+pfunhorista.numhorasdia Trabalhado+"','"+pFunHorista.ValorHora+"')"; 15. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 16. try{ 17. objcommand.executenonquery(); 18. return true; 19. }catch (SqlException err){ 20. String strerro = "Erro: " + err.tostring(); 21. Console.Write(strErro); 22. return false; 23. } 24. } 25. public Boolean atualizar(funcionariohorista pfunhorista){ 26. SqlConnection objconexao = FabricaConexao.getConexao(); 27. String strquery = "UPDATE Funcionario SET Nome = '" + pfunhorista.nome + "', CPF = '"+pfunhorista.cpf+"', DepartamentoOID = '"+pfunhorista.departamento.codigo+"' WHERE ID = '" + pfunhorista.codigo + "'"; 28. strquery = strquery + "UPDATE FuncionarioHorista SET NumDiasTrabalhados = '"+pfunhorista.numdiastrabalhados+"', NumHorasDiaTrabalhado = '"+pfunhorista.numhorasdiatrabalhado+"', ValorHora = '"+pfunhorista.valorhora+"' WHERE ID = '"+pfunhorista.codigo+"'"; 28. SqlCommand objcommand = new SqlCommand(strQuery, objconexao); 30. try{ 31. objcommand.executenonquery(); 32. return true; 33. }catch (SqlException err){ 34. String strerro = "Erro: " + err.tostring(); 35. Console.Write(strErro); 36. return false; 37. } 38. } 39. } 40. } A classe FuncionarioHoristaDAO esta sendo apresentada pela Listagem 9. Em estrutura semelhante à classe FuncionarioDAO, esta apresenta dois métodos: persistir e atualizar. O persistir é responsável por salvar um objeto FuncionarioHorista no banco de dados e o atualizar por atualizá-lo. Em cada um dos métodos são definidos um SQL referente a cada operação. Em ambos os casos, é retornado verdadeiro em caso de sucesso e falso em caso de insucesso.

19 Buscando exemplificar o funcionamento da arquitetura do sistema proposto, é apresentado de forma detalhada a funcionalidade Cadastrar Funcionário Horista. A Figura 6 exibe o diagrama de seqüência, com o objetivo de nortear os passos realizados para esse cenário. Figura 6. Diagrama de Seqüência para a Funcionalidade Cadastrar Funcionário Horista Nota: O código-fonte completo da aplicação está disponível para download. O caso de uso inicia, quando o usuário acessa a interface e aciona a opção Adicionar Novo Funcionário Horista. Esse por sua vez acessa o controlador da classe Departamento (cntrdepartamento) para alimentar o ComboBox com todos os departamentos, invocando o RecuperaObjetos. Esse, por sua vez, aciona o RecuperaObjetos da classe Departamento, que acessa o método recuperaobjetos da classe DepartamentoDAO para recuperar os departamentos da base de dados. Com o ComboBox montado, é exibido o formulário de criação de um novo funcionário como exemplificado na Figura 7. Figura 7. Interface do formulário de um novo funcionário horista O usuário informa então os dados do novo funcionário e aciona o Salvar. Nesse ponto, o formulário (frmnovofuncionariohorista) monta um vetor (vetenvia) com os dados do funcionário e passa como parâmetro ao Salvar do controlador da classe FuncionarioHorista (cntrfuncionariohorista).

20 Esse, por sua vez, instancia um novo objeto do tipo FuncionarioHorista, e atribui os valores do vetor ao objeto. Com o objeto montado, é invocado o seu método Persistir. Este faz o acesso à classe FuncionarioHoristaDAO, que inicialmente resgata da classe FabricaConexao uma nova seção de conexão com o banco de dados (getconexao) e gera o SQL para inserir as novas informações na base de dados. Este então executa o SQL na base de dados persistindo o objeto. Caso todas as operações tenham sido realizadas com sucesso, é retornado true para todos os métodos até a interface. Caso tenha ocorrido algum erro, é retornado false para a interface que se responsabiliza em emitir uma mensagem de erro ao usuário. Somente a interface tem acesso ao usuário nessa abordagem, portanto, somente ela pode enviar notificações de erros ou de sucesso. Após, uma consulta ao banco de dados pode verificar a persistência dos objetos. Conclusão Este artigo teve como objetivo abordar de forma prática a utilização do paradigma Orientado a Objetos no contexto do desenvolvimento de software no ambiente do Visual Studio na linguagem C#.NET e de técnicas aliadas, como mapeamento objeto relacional e utilização de padrões de desenvolvimento. Foi possível observar na prática como realizar de forma simples a persistência e manipulação de objetos utilizando um banco de dados relacional, apoiado por padrões de desenvolvimento, como o padrão de projeto DAO (Data Access Object), que encapsula todo o contexto de conexão e comunicação com o banco de dados. Atualmente, essa abordagem tem uma grande aceitação, uma vez que os bancos de dados Orientados a Objetos ainda não são o padrão de mercado, tornando possível a união entre os conceitos da Orientação a Objetos, com o desempenho, maturidade e confiabilidade dos bancos de dados relacionais.

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015 Manipulação de Banco de Dados com Java Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015 Acesso a um SGBD Em sistemas mais simples o uso de arquivos pode ser usado mas para aplicações

Leia mais

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

Conteúdo. Disciplina: INF 02810 Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo Universidade Federal do Espírito Santo Centro Tecnológico Departamento de Informática Disciplina: INF 02810 Prof.: (monalessa@inf.ufes.br) Conteúdo 1. Introdução 2. Processo de Software 3. Gerência de

Leia mais

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária Cascavel Novembro de 2009 Pedro Patitucci Finamore Daniel Bordignon Cassanelli Marco Antonio da Rosa DIAGRAMAS DE CLASSE E SEQUÊNCIA

Leia mais

Orientação a Objetos

Orientaçã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 mais

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Uso do SQLite no Android Professor: Danilo Giacobo OBJETIVOS DA AULA Aprender a persistir dados utilizando o banco de dados SQLite. Conhecer e utilizar a classe SQLiteOpenHelper.

Leia mais

Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br

Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br Programação com acesso a BD Prof.: Clayton Maciel Costa clayton.maciel@ifrn.edu.br 1 Modelos de Dados, Esquemas e Instâncias 2 Modelos de Dados, Esquemas e Instâncias Modelo de dados: Conjunto de conceitos

Leia mais

Profº. Enrique Pimentel Leite de Oliveira

Profº. Enrique Pimentel Leite de Oliveira Profº. Enrique Pimentel Leite de Oliveira O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam

Leia mais

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS Campus Cachoeiro de Itapemirim Curso Técnico em Informática Disciplina: Análise e Projeto de Sistemas Professor: Rafael Vargas Mesquita Este exercício deve ser manuscrito e entregue na próxima aula; Valor

Leia mais

Persistência de Dados

Persistência de Dados Persistência de s Universidade do Estado de Santa Catarina - Udesc Centro de Ciências Tecnológicas - CCT Departamento de Ciência da Computação Tecnologia de Sistemas de Informação Estrutura de s II - DAD

Leia mais

Noções de. Microsoft SQL Server. Microsoft SQL Server

Noções de. Microsoft SQL Server. Microsoft SQL Server Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados

Leia mais

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda. SQL comando SELECT Uma das tarefas mais requisitadas em qualquer banco de dados é obter uma listagem de registros armazenados. Estas tarefas são executadas pelo comando SELECT Sintaxe: SELECT [DISTINCT]

Leia mais

Introdução a Java. Hélder Nunes

Introduçã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 mais

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL. Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2012 Edição 7 Listando e Gravando Listando itens em ComboBox e gravando os dados no

Leia mais

Persistência e Banco de Dados em Jogos Digitais

Persistência e Banco de Dados em Jogos Digitais Persistência e Banco de Dados em Jogos Digitais Prof. Marcos Francisco Pereira da Silva Especialista em Engenharia de Software Jogos Digitais - Computação Gráfica 1 Agenda Vantagens de usar a abordagem

Leia mais

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões Prof. MSc. Hugo Souza Se você precisar manter informações sobre seus usuários enquanto eles navegam pelo seu site, ou até quando eles saem

Leia mais

Engenharia de Software III

Engenharia 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 mais

RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE Elio Lovisi Filho 1 Ronney Moreira de Castro 2 RESUMO

RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE Elio Lovisi Filho 1 Ronney Moreira de Castro 2 RESUMO Revista Eletrônica da Faculdade Metodista Granbery http://re.granbery.edu.br - ISSN 1981 0377 Curso de Sistemas de Informação - N. 10, JAN/JUN 2011 RELACIONAMENTOS ENTRE OS OBJETOS NO FRAMEWORK HIBERNATE

Leia mais

Persistência de Classe e Auto- Relacionamento em Tabelas de Banco de Dados

Persistência de Classe e Auto- Relacionamento em Tabelas de Banco de Dados UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Persistência de Classe e Auto- Relacionamento em Tabelas de Banco de Dados 1) Introdução! Em algumas situações, pode ser necessário

Leia mais

Tópicos em Engenharia de Computação

Tópicos em Engenharia de Computação Tópicos em Engenharia de Computação Introdução / Revisão UML e POO (JAVA) Prof. Ivan Prof. Zagari UML Linguagem Unificada. Não é metodologia, processo ou método. Versão atual 2.0 3 categorias de Diagramas

Leia mais

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

AULA 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 mais

4 O Workflow e a Máquina de Regras

4 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 mais

Construindo Aplicações com ASP.NET MVC 2.0 Aula 03 Luiz Alberto Ferreira Gomes. Ciência da Computação da PUC Minas

Construindo Aplicações com ASP.NET MVC 2.0 Aula 03 Luiz Alberto Ferreira Gomes. Ciência da Computação da PUC Minas Construindo Aplicações com ASP.NET MVC 2.0 Aula 03 Luiz Alberto Ferreira Gomes Ciência da Computação da PUC Minas 2 Camada responsável por armazenar em um repositório de dados e reconstituir objetos de

Leia mais

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme.

sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme. sobre rogério gonçalves gerente de projetos > digitale agência digital rogerio@digitale.com.br h7p://www.digitale.com.br h7p://leveme.la/rogerio definição - é uma forma de programar e organizar um sistema

Leia mais

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

DESENVOLVENDO 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 mais

Desenvolvimento de Aplicações para Internet Aula 8

Desenvolvimento de Aplicações para Internet Aula 8 Desenvolvimento de Aplicações para Internet Aula 8 Celso Olivete Júnior olivete@fct.unesp.br na aula passada Orientação a Objetos Classes Objetos Construtores Destrutores 2 na aula passada Construtores

Leia mais

Apesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma:

Apesar 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 mais

2 Diagrama de Caso de Uso

2 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 mais

Persistência em Software Orientado a Objetos:

Persistência em Software Orientado a Objetos: Persistência em Software Orientado a Objetos: Abordagens Utilizando Frameworks OpenSource Marcelo Santos Daibert Orientador: Marco Antônio Pereira Araújo Co-Orientadora: Alessandreia Marta de Oliveira

Leia mais

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br ROTEIRO 1. Conceitos de Orientação a Objetos Introdução O paradigma da POO Classes

Leia mais

Manipulação de Dados em PHP (Visualizar, Inserir, Atualizar e Excluir) Parte 2

Manipulação de Dados em PHP (Visualizar, Inserir, Atualizar e Excluir) Parte 2 Desenvolvimento Web III Manipulação de Dados em PHP (Visualizar, Inserir, Atualizar e Excluir) Parte 2 Prof. Mauro Lopes 1-31 21 Objetivos Nesta aula iremos trabalhar a manipulação de banco de dados através

Leia mais

LINGUAGEM DE BANCO DE DADOS

LINGUAGEM DE BANCO DE DADOS LINGUAGEM DE BANCO DE DADOS Gabriela Trevisan Bacharel em Sistemas de Informação Universidade Federal do Rio Grande Pós-Graduanda Formação Pedagógica de Professores (FAQI) Conceito de BD Um banco de dados

Leia mais

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5. Desenvolvendo aplicações em camadas com PHP 5. Talvez a primeira vista você ache estranha a palavra Camada em programação, mas o que vem a ser Camada? Segundo o dicionário: Camada 1 - Qualquer matéria

Leia mais

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate Tiago Peres Souza 1, Jaime Willian Dias 1,2 ¹Universidade paranaense (Unipar) Paranavaí PR Brasil tiagop_ti@hotmail.com 2 Universidade

Leia mais

Prototype, um Design Patterns de Criação

Prototype, 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 mais

Capítulo 04: Persistência com SQLite

Capítulo 04: Persistência com SQLite Capítulo 04: Persistência com SQLite Instrutor Programador desde 2000 Aluno de doutorado Mestre em informática pelo ICOMP/UFAM Especialista em aplicações WEB FUCAPI marcio.palheta@gmail.com sites.google.com/site/marcio

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares professor.fabrizzio@gmail.com Aula 10 Persistência de Dados

Leia mais

Usando PostgreSQL na Regra de Negócio de um ERP. Fabiano Machado Dias Eduardo Wolak

Usando PostgreSQL na Regra de Negócio de um ERP. Fabiano Machado Dias Eduardo Wolak Usando PostgreSQL na Regra de Negócio de um ERP Fabiano Machado Dias Eduardo Wolak Regra de negócio? São todas as regras existentes num sistema de informação, que ditam seu comportamento, suas restrições

Leia mais

Universidade 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 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 mais

Conceitos de Banco de Dados

Conceitos de Banco de Dados Conceitos de Banco de Dados Autor: Luiz Antonio Junior 1 INTRODUÇÃO Objetivos Introduzir conceitos básicos de Modelo de dados Introduzir conceitos básicos de Banco de dados Capacitar o aluno a construir

Leia mais

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos Objetivos: Criar restrições para atributos, chaves primárias e estrangeiras; Explorar consultas SQL com uso de

Leia mais

Módulo 5 JPATransaction Camadas Turma Turma TurmaBC .business @BusinessController TurmaBC TurmaBC TurmaBC

Módulo 5 JPATransaction Camadas Turma Turma TurmaBC .business @BusinessController TurmaBC TurmaBC TurmaBC Módulo 5 No módulo anterior adaptamos nosso projeto para persistir as informações no banco de dados utilizando as facilidades da extensão demoiselle-jpa. Experimentamos o controle transacional do Framework

Leia mais

UML Aspectos de projetos em Diagramas de classes

UML Aspectos de projetos em Diagramas de classes UML Aspectos de projetos em Diagramas de classes Após ser definido o contexto da aplicação a ser gerada. Devemos pensar em detalhar o Diagrama de Classes com informações visando uma implementação Orientada

Leia mais

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

ATRIBUTOS 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 mais

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet Faculdade Pitágoras Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL A linguagem SQL é responsável por garantir um bom nível

Leia mais

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL Faculdade Pitágoras Curso Superior de Tecnologia: Banco de Dados Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL A linguagem SQL é responsável por garantir um bom nível de independência do

Leia mais

Oficina. Praça das Três Caixas d Água Porto Velho - RO

Oficina. Praça das Três Caixas d Água Porto Velho - RO Oficina Praça das Três Caixas d Água Porto Velho - RO Oficina Ministrante: Marcel Leite Rios Apresentação Pessoal Marcel Leite Rios Prof. de Informática IFRO Graduado: Sistemas de Informação - ULBRA MBA

Leia mais

SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl

SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE. Aluno: Roberto Reinert Orientador: Everaldo A. Grahl SISTEMA DE WORKFLOW PARA MODELAGEM E EXECUÇÃO DE PROCESSOS DE SOFTWARE Aluno: Roberto Reinert Orientador: Everaldo A. Grahl Roteiro de apresentação Introdução Objetivos Fundamentação Teórica Workflow Processo

Leia mais

Projeto de Banco de Dados: Empresa X

Projeto de Banco de Dados: Empresa X Projeto de Banco de Dados: Empresa X Modelo de negócio: Empresa X Competências: Analisar e aplicar o resultado da modelagem de dados; Habilidades: Implementar as estruturas modeladas usando banco de dados;

Leia mais

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ARRAYS. 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 mais

Especificação do 3º Trabalho

Especificação do 3º Trabalho Especificação do 3º Trabalho I. Introdução O objetivo deste trabalho é abordar a prática da programação orientada a objetos usando a linguagem Java envolvendo os conceitos de classe, objeto, associação,

Leia mais

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC Arquitetura de Aplicações JSP/Web Padrão Arquitetural MVC Arquitetura de Aplicações JSP/Web Ao projetar uma aplicação Web, é importante considerála como sendo formada por três componentes lógicos: camada

Leia mais

PHP INTEGRAÇÃO COM MYSQL PARTE 1

PHP INTEGRAÇÃO COM MYSQL PARTE 1 INTRODUÇÃO PHP INTEGRAÇÃO COM MYSQL PARTE 1 Leonardo Pereira leonardo@estudandoti.com.br Facebook: leongamerti http://www.estudandoti.com.br Informações que precisam ser manipuladas com mais segurança

Leia mais

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

ABORDAGEM 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 mais

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser

Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser A1Criando um módulo de negócio Capítulo 27 Aplicação dividida em módulos - Introdução Como já foi muito bem detalhado no Capítulo IV, o jcompany Developer Suite pode ser compreendido como uma solução de

Leia mais

AJAX no GASweb. Mas e afinal, para que usamos o AJAX?

AJAX no GASweb. Mas e afinal, para que usamos o AJAX? Nível - Avançado AJAX no GASweb Por: Pablo Hadler AJAX (Asynchronous Javascript and XML) foi criado com o princípio de ser uma maneira rápida e otimizada de podermos fazer requisições Web, sendo esta totalmente

Leia mais

Análise de Ponto de Função

Análise de Ponto de Função Complemento para o Curso Análise de Ponto de Função FUNÇÕES DO TIPO DADO O termo Arquivo não significa um arquivo do sistema operacional, como é comum na área de processamento de dados. Se refere a um

Leia mais

AULA 8 CRIANDO UMA CLASSE EM PHP INTERAGINDO COM BANCO DE DADOS - COM RELACIONAMENTO ENTRE TABELAS

AULA 8 CRIANDO UMA CLASSE EM PHP INTERAGINDO COM BANCO DE DADOS - COM RELACIONAMENTO ENTRE TABELAS AULA 8 CRIANDO UMA CLASSE EM PHP INTERAGINDO COM BANCO DE DADOS - COM RELACIONAMENTO ENTRE TABELAS Na grande maioria dos sistemas, faz-se necessário utilizar informações que estão armazenadas em uma determinada

Leia mais

Roteiro. Arquitetura. Tipos de Arquitetura. Questionário. Centralizado Descentralizado Hibrido

Roteiro. Arquitetura. Tipos de Arquitetura. Questionário. Centralizado Descentralizado Hibrido Arquitetura Roteiro Arquitetura Tipos de Arquitetura Centralizado Descentralizado Hibrido Questionário 2 Arquitetura Figura 1: Planta baixa de uma casa 3 Arquitetura Engenharia de Software A arquitetura

Leia mais

José Benedito Lopes Junior ¹, Marcello Erick Bonfim 2

José Benedito Lopes Junior ¹, Marcello Erick Bonfim 2 ISBN 978-85-61091-05-7 Encontro Internacional de Produção Científica Cesumar 27 a 30 de outubro de 2009 Definição de uma tecnologia de implementação e do repositório de dados para a criação da ferramenta

Leia mais

Hoje é inegável que a sobrevivência das organizações depende de dados precisos e atualizados.

Hoje é inegável que a sobrevivência das organizações depende de dados precisos e atualizados. BANCO DE DADOS Universidade do Estado de Santa Catarina Centro de Ciências Tecnológicas Departamento de Ciência da Computação Prof. Alexandre Veloso de Matos alexandre.matos@udesc.br INTRODUÇÃO Hoje é

Leia mais

Projeto de Banco de Dados

Projeto de Banco de Dados Projeto de Banco de Dados Prof. Marcelo Siedler Objetivos do documento: Apresentar os conceitos de stored procedutes e funções. Exercícios. Referência: http://dev.mysql.com/doc/refman/4.1/pt/stored-procedures.html

Leia mais

Dado: Fatos conhecidos que podem ser registrados e têm um significado implícito. Banco de Dados:

Dado: Fatos conhecidos que podem ser registrados e têm um significado implícito. Banco de Dados: MC536 Introdução Sumário Conceitos preliminares Funcionalidades Características principais Usuários Vantagens do uso de BDs Tendências mais recentes em SGBDs Algumas desvantagens Modelos de dados Classificação

Leia mais

Código do Sistema Ponto de Vendas

Código do Sistema Ponto de Vendas Código do Sistema Ponto de Vendas O sistema ponto de vendas, tem como finalidade implementar um pequeno sistema em WPF, que sirva de exemplo para a turma da disciplina Ambiente de Programação e Banco de

Leia mais

1. Domínio dos Atributos

1. Domínio dos Atributos Structure Query Language SQL Guilherme Pontes lf.pontes.sites.uol.com.br 1. Domínio dos Atributos Por domínio, ou tipo, pode-se entender como a maneira como determinado atributo (ou campo, se tratando

Leia mais

Modelagemde Software Orientadaa Objetos com UML

Modelagemde Software Orientadaa Objetos com UML Modelagemde Software Orientadaa Objetos com UML André Maués Brabo Pereira Departamento de Engenharia Civil Universidade Federal Fluminense Colaborando para a disciplina CIV 2802 Sistemas Gráficos para

Leia mais

Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos

Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos Programação Estruturada e Orientada a Objetos Fundamentos Orientação a Objetos 2013 O que veremos hoje? Introdução aos fundamentos de Orientação a Objetos Transparências baseadas no material do Prof. Jailton

Leia mais

Comandos de Manipulação

Comandos de Manipulação SQL - Avançado Inserção de dados; Atualização de dados; Remoção de dados; Projeção; Seleção; Junções; Operadores: aritméticos, de comparação,de agregação e lógicos; Outros comandos relacionados. SQL SQL

Leia mais

PROJETO DA DISCIPLINA. PES II Processo de Engenharia de Software II

PROJETO DA DISCIPLINA. PES II Processo de Engenharia de Software II UNIOESTE - Universidade Estadual do Oeste do Paraná CCET - Centro de Ciências Exatas e Tecnológicas Colegiado de Informática Curso de Bacharelado em Informática PROJETO DA DISCIPLINA PES II Processo de

Leia mais

Structured Query Language (SQL) Ambiente Simplificado de um SGBD

Structured Query Language (SQL) Ambiente Simplificado de um SGBD Structured Query Language (SQL) Ambiente Simplificado de um SGBD 2 1 Características dos SGBDs Natureza auto-contida de um sistema de banco de dados: metadados armazenados num catálogo ou dicionário de

Leia mais

RELATÓRIO FINAL DE PROJETO DE INICIAÇÃO CIENTÍFICA (PIBIC/CNPq/INPE)

RELATÓRIO FINAL DE PROJETO DE INICIAÇÃO CIENTÍFICA (PIBIC/CNPq/INPE) DESENVOLVIMENTO DE APLICAÇÕES PARA DISPOSITIVOS MÓVEIS PARA COLETA E DISSEMINAÇÃO DE DADOS (VERSÃO CLIENTE- SERVIDOR) RELATÓRIO FINAL DE PROJETO DE INICIAÇÃO CIENTÍFICA (PIBIC/CNPq/INPE) Victor Araújo

Leia mais

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Prof. MSc. Hugo Souza Iniciando nossas aulas sobre

Leia mais

MVC e Camadas - Fragmental Bliki

MVC e Camadas - Fragmental Bliki 1 de 5 20-03-2012 18:32 MVC e Camadas From Fragmental Bliki Conteúdo 1 Introdução 2 Camadas: Separação Entre Componentes 3 MVC: Interação Entre Componentes 4 Conclusão 5 Referências Introdução A Arquitetura

Leia mais

Classes de Entidades Persistentes JDB

Classes de Entidades Persistentes JDB Classes de Entidades Persistentes JDB Brasil, Natal-RN, 07 de setembro de 2011 Welbson Siqueira Costa www.jdbframework.com Nota de Retificação: em 11/12/2011 a Listagem 3 desse tutorial sofreu uma pequena

Leia mais

Desenvolvendo Aplicações Web com NetBeans

Desenvolvendo Aplicações Web com NetBeans Desenvolvendo Aplicações Web com NetBeans Aula 3 Cap. 4 Trabalhando com Banco de Dados Prof.: Marcelo Ferreira Ortega Introdução O trabalho com banco de dados utilizando o NetBeans se desenvolveu ao longo

Leia mais

Padrões de Projeto e Persistência com DAO

Padrões de Projeto e Persistência com DAO Curso de Análise de Sistemas Análise de Sistemas II Padrões de Projeto e Persistência com DAO Prof. Giuliano Prado de Morais Giglio, M.Sc. Introdução a Padrões de Projeto Padrões de Projeto foram inicialmente

Leia mais

Guia de Fatores de Qualidade de OO e Java

Guia 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 mais

UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET. Programação para Internet I

UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET. Programação para Internet I UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET Programação para Internet I Aula 10 PHP: Trabalhando com Banco de Dados leticia@cafw.ufsm.br Acessando

Leia mais

MedEl: Uma solução de E-Learning utilizando tecnologia Microsoft ASP.NET

MedEl: Uma solução de E-Learning utilizando tecnologia Microsoft ASP.NET MedEl: Uma solução de E-Learning utilizando tecnologia Microsoft ASP.NET Átila Correia Cunha 1, 2, Glaucon Henrique Mauricio Maia 1, 2, Waner Ferreira Tavares 1, 2, Jorge Bergson¹, Rui Gomes Patrício 3

Leia mais

3 Um Framework Orientado a Aspectos para Monitoramento e Análise de Processos de Negócio

3 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 mais

HIBERNATE EM APLICAÇÃO JAVA WEB

HIBERNATE EM APLICAÇÃO JAVA WEB HIBERNATE EM APLICAÇÃO JAVA WEB Raul Victtor Barbosa Claudino¹, Ricardo Ribeiro Rufino¹ ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil victtor.claudino@gmail.com, ricardo@unipar.br Resumo: Este

Leia mais

Sistema de Gerenciamento Remoto www.pevermelho.art.br

Sistema de Gerenciamento Remoto www.pevermelho.art.br Sistema de Gerenciamento Remoto www.pevermelho.art.br 1 - SOBRE O SGR Este manual irá lhe ajudar a entender o funcionamento do SGR (Sistema de Gerenciamento Remoto) permitindo assim que você possa atualizar

Leia mais

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais 1 LINGUAGEM SQL SQL Server 2008 Comandos iniciais SQL - STRUCTURED QUERY LANGUAGE Quando os Bancos de Dados Relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua manipulação.

Leia mais

PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB)

PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB) RELATÓRIO DE ENTREGA DO PRODUTO 1 (CONSTRUÇÃO DE PORTAL WEB) PARA A ELABORAÇÃO DOS PLANOS MUNICIPAIS DE GESTÃO INTEGRADA DE RESÍDUOS SÓLIDOS PMGIRS PARA OS MUNICÍPIOS DE NOVO HORIZONTE, JUPIÁ, GALVÃO,

Leia mais

Técnicas de Programação II

Técnicas de Programação II Técnicas de Programação II Aula 06 Orientação a Objetos e Classes Edirlei Soares de Lima Orientação a Objetos O ser humano se relaciona com o mundo através do conceito de objetos.

Leia mais

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

UNIVERSIDADE 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 mais

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Banco de Dados Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Roteiro Mapeamento de objetos para modelo relacional Estratégias de persistência Persistência JDBC Mapeando Objetos para o Modelo Relacional

Leia mais

Manipulação de Banco de Dados com Java 1. Objetivos

Manipulação de Banco de Dados com Java 1. Objetivos Manipulação de Banco de Dados com Java 1. Objetivos Demonstrar os fundamentos básicos para a manipulação de banco de dados com Java; Apresentar a sintaxe de comandos SQL usados em Java. 2. Definições A

Leia mais

JDBC Java Database Connectivity

JDBC Java Database Connectivity 5 JDBC Java Database Connectivity Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Trabalhar com bancos de dados em aplicações web em JSP através das classes

Leia mais

Aula 1 Acesso a Banco de Dados

Aula 1 Acesso a Banco de Dados Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados Prof. Josenildo Silva jcsilva@ifma.edu.br Introdução O JDBC (Java Database Connectivity) foi criado com o intuito de fornecer aos programadores

Leia mais

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. 1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. Editando um Artigo 4.3. Excluindo um Artigo 4.4. Publicar

Leia mais

JPA: Persistência padronizada em Java

JPA: Persistência padronizada em Java JPA: Persistência padronizada em Java FLÁVIO HENRIQUE CURTE Bacharel em Engenharia de Computação flaviocurte.java@gmail.com Programação Orientada a Objetos X Banco de Dados Relacionais = Paradigmas diferentes

Leia mais

2 a Lista de Exercícios

2 a Lista de Exercícios Projeto de Sistemas 2011/2 2 a Lista de Exercícios (1) Um importante aspecto do projeto da camada de Lógica de Negócio (LN) diz respeito à organização das classes e distribuição de responsabilidades entre

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Modelo Cliente-Servidor: Introdução aos tipos de servidores e clientes Prof. MSc. Hugo Souza Iniciando o módulo 03 da primeira unidade, iremos abordar sobre o Modelo Cliente-Servidor

Leia mais

Acessando um Banco de Dados

Acessando um Banco de Dados Acessando um Banco de Dados Introdução Agora que você já está craque em JSP e já instalou seu servidor, vamos direto para a parte prática! Neste tutorial vamos aprender a acessar um banco de dados. Para

Leia mais

Banco de Dados. Maurício Edgar Stivanello

Banco de Dados. Maurício Edgar Stivanello Banco de Dados Maurício Edgar Stivanello Agenda Conceitos Básicos SGBD Projeto de Banco de Dados SQL Ferramentas Exemplo Dado e Informação Dado Fato do mundo real que está registrado e possui um significado

Leia mais

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA RESUMO DE AULA CRIAÇÃO E MANIPULAÇÃO DO BANCO DE DADOS

Leia mais

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br Introdução O computador como ferramenta indispensável: Faz parte das nossas vidas; Por si só não faz nada de útil; Grande capacidade de resolução

Leia mais

Criando uma agenda simples com NetBeans 6.5

Criando uma agenda simples com NetBeans 6.5 Criando uma agenda simples com NetBeans 6.5 (Swing application framework e Beansbinding) Já faz algum tempo que escrevi uma agenda simples usando o Eclipse com o Visual Class Editor. Demorei em torno de

Leia mais

Especificação do Trabalho

Especificação do Trabalho Especificação do Trabalho I. Introdução O objetivo deste trabalho é abordar a prática da programação orientada a objetos usando a linguagem Java envolvendo os conceitos de classe, objeto, associação, ligação,

Leia mais