none
Classe, e Obetos com CONTEUDO! RRS feed

  • Pergunta

  • Talvez, seja uma pergunta persistente, porem preciso que alguem me responda com algum conteúdo.
    Por favor, respostas sem um nível minimo de conteúdo são agradecidas porem não resolvem os problemas.

    Estou estudando o desenvolvimento de um sistema onde será pontuado o cadastro de clientes onde terei, seus endereços, telefones e contas bancarias por exemplo.

    Devo Criar uma classe Clientes, que herdara de uma classe Pessoa(fisica e/ou juridica)
    Devo criar uma classe Endereços, uma classe telefones e uma classecontas bancarias tambem..

    Minha pergunta é se devo criar DENTRO da classe Clientes uma PROPRIEDADE que será uma lista de OBJETOS endereços, uma LISTA de OBJETOS telefones e uma LISTA de OBJETOS contas bancarias.
    OU seria melhor nao colocar dentro da classe CLIENTES estas propriedade e apenas gerir um possivel RELACIONAMENTO entre OBJETOS, por exemplo, OBJETO CLIENTE relacionado com OBJETO ENDEREÇOS... OBJETO CLIENTES relacionado com OBJETO TELEFONES e OBJETO CLIENTE relacionado com OBJETO CONTAS BANCARIAS.

    Obrigado pela atenção dispensada e empenhada.

    Abraços a todos e SUCESSO.

    Juliano~


    J.Luz
    domingo, 22 de março de 2009 23:35

Respostas

  • Hummm,

    Com esta explciação do contexto ajuda muito a pensar melhor me uma arquitetura. Pelo seu modelo de negócio, uma plataforma que se encaxia bem seria o Smart Client com alguns  módulos desconectados (gerencia / Caixa / Etc).

    Neste modelo de arquitetura terial como típico algo abaixo :


    client

         Camada de UI (forms) (EXE + DLL comuns)
            |
          Camada de Validação basica  (Regras basicas comuns tipo campos obriogadorios e 
                                                           navegação/acesso) (DLL)
            |
           Chanel Adapter  (Camada de acesso aos serviços e dados , Aqui o meio de transporte web-                                   services/remoting/msmq etc seriam encapsuladas de forma que a UI 
                                        não saiba 'como e sim apenas "o que". Aqui tb é feito a logica de ir on-line ou 
                                        off   line , cache local etc.)  (DLL podendo ser unificada na DLL de validação)
    web /Servidor 

        Serviços (ex :wcf) expondo os contratos definidos pela classe de dados de transporte (Essas class
                   que  recebe os dados e "navega pelas camadas, e não possuem métodos)

        Camada de negocio (Aqui estão efetivamente as regras de seu negocio , onde vc instancia as classes , executa (DLL) 

        camada de DAL (Aqui estão efeitivamente instancias das fabricas de acesso   ou simplesmente um proxy para o acesso aos dados    (DLL) 

        Camada de Transporte(Aqui estão efetivamente classes de transpote que serão expostas pelos serviços , como esta separada em um projeto posso usar elas no projeto de serviços deixando bem claro os contrados de nossos serviços e tb na camada de negocio e/ou MApeameno ou ainda em outra camada do server (DLL) 

        Camada de Mapeamento OO X BD (Responsavel pelo mapeamento do Banco para classes . O LINQ é desesavel ou outra ferramneta como nHibernate. (DLL)


    Novamente não custa lembrar que isso é apenas uma arquitetura típica e pode variar bastante. Claro que estou suprimindo muita coisa senão o post cabaria gigantesco :-)

    Fernando Cerqueira MVP.ASP.NET TEAM AJAX.TOOLKIT CONSULTOR & ARQUITETO
    segunda-feira, 23 de março de 2009 16:53

Todas as Respostas

  • Ola Juliano,

    As duas formas são boas  e tem seus cenários onde se obtem melhores resultados.

    Olhando para o modelo de termos "dentro" da classe outras classes temos que tormar o cuidado para cenários com efeito caascata, o que pode causar um overhead desnecessário . A contra partida disso é que temos uma simplificação no transporte de dados uma vez que a classe representa diversas outras sub-classes.

    Olhando para o modleo de termos "isolada" as classes termos uma classe + "clean" porem termos nescessidade de encadear instancias para obtermos o mesmo resultado. 

    O meio termo e sempre uma boa saida : Eu utilizo classes simples e quando o cenário requer crio uma classe "mãe" que herda de uma classe simples e complemento com as propriedades de relacionamento nescessárias, desta forma por herança tenho o melhor dos 2 mundos.
    Fernando Cerqueira MVP.ASP.NET TEAM AJAX.TOOLKIT CONSULTOR & ARQUITETO
    segunda-feira, 23 de março de 2009 14:41
  • Obrigado Fernando, estou entendendo teu ponto de vista. 

    E fico contente de ter encontrado alguem que responde com uma certa coerencia e não apenas me passando links genéricos.
    Acredito que quando postamos algo aqui, é porque precisamos de respostas o quanto imediatas possíveis.

    Se você me permitir dar continuidade e no teu tempo, responder-me;

    ( e para facilitar o entendimento, talvez não somente o meu mas para outras pessoas, vamos nos limitar a estas três entidades: Cliente, Endereços e Contas Correntes. )

    Supondo que eu desenvolva com esta sua metodologia:

    Eu devo crias as 3 classes:

    - Clientes,
    - Enderecos e 
    - Contas Correntes.

    Levando em consideração que "Clientes", vou criar, herdando de uma "Classe Pessoa Fisica" e/ou  herdar de uma "Classe Pessoa Juridica" e estas duas por sua vez, vou herdar de uma Classe "Pessoa", pois posso ter "Clientes Pessoa Fisica" e "Clientes Pessoa  Juridica". 

    Classe Pessoa -> Classe Pessoa Fisica -> Classe Clientes
    Classe Pessoa -> Classe Pessoa Juridica -> Classe Clientes

    DEVO COMPOR qual Classe com as Classes Enderecos e Contas Correntes? 
    .. a Classe Pessoa, a Classe Pessoa Fisica/Juridica ou a Classe Clientes?

    O Metodo Gravar_Cliente (por exemplo) devo implementar em qual das três?

    Perguntinha basica: Devo colocar estas 3 classe num unico projeto "ClassLibrary" ???

    Quero continuar, mas para não ser massante vou com calma...

    Obrigado pela atenção,

    Juliano~

    J.Luz
    segunda-feira, 23 de março de 2009 14:49
  • Ola J.Luiz

    Em relação a indicarmos link, é que fica Bem + rápido ajudar :-) De um modo geral gosto que as pessoas pensem e entedam e não apenas colem um codigo que posto , pois acredito que isso não ajudar a evoluir o conhecimento.

    Quato a suas dúvidas , vou usar as palavras de todo o consultor depende.... Minhas repostas estão baseada em um contexto simples não levando em conta detalhes de projeto e requisitos , que podem claro alterar a escolha e abordagem, ou seja,  isso não é receita de bolo, mas são a que podem ser aplicadas com um bom resultado entre performance e manutenção.


    DEVO COMPOR qual Classe com as Classes Enderecos e Contas Correntes. .. a Classe Pessoa, a Classe Pessoa Fisica/Juridica ou a Classe Clientes?

    VOu te responder com outra pergunta :

    Quem possui endereço ? Uma Pessoa Ou um Cliente ? A entidade pessoa Pode existir sem endereço ?
    Uma ContaCorrente Existe sem um cliente ?  As respostas suas vão lhe levar a escolher a classe desejada.

    O Metodo Gravar_Cliente (por exemplo) devo implementar em qual das três?

    Parece senstado ser a classe cliente pois mesmo que não exita ainda a pessoa como esta tarvbalhando por herança tera todas as proriedades nescessárias para persistir e/ou extratir a classe Pessoa. Talvez neste seu cenário seria interesante pensar em implemnetar uma interface  para pessoa de forma a padronizar o consumo da pessoa independente do tipo.

    Perguntinha basica: Devo colocar estas 3 classe num unico projeto "ClassLibrary" ???

    Aqui novamente o meio termo :-).... Se fizer uma DLL para cada entidade teriamo  muitas dll, isso até que não seri ao problema, mas deve pensar que toda vez que é carregado um Assembly para memoria o Framework jaz uma série de validações de segunrança  e isso bem ou mal causa um trablho extra de processamento, logo o que gosto de fazer e agrupar as classes de negocio  em  um projeto que simbolize o core daquele conjunto  e ter outra DLL com o mesmo conceito para as classes de transporte .
    Desta forma posso referenciar as classes de transporte em outra camada  e/ou reaproveitar em outros classes de negócio. 

    Fernando Cerqueira MVP.ASP.NET TEAM AJAX.TOOLKIT CONSULTOR & ARQUITETO
    segunda-feira, 23 de março de 2009 15:36
  • Concordo Fernando, é claro para mim, que observando os links e tendo tempo para le-los e entende-los é uma pratica saudavel.
    Mas não falo de código postado, falo de resumos explicativos, assim como você tem feito para mim, desta forma absorvo mais rápido e com um certo grau de confiabilidade nas informações que você posta.

    Claro que não quero que você escreva códigos e códigos, caso contrário, pediria para minha empresa contratar você. hihihi.... 
    Não me entenda mal.

    Tua primeira resposta, através de uma pergunta foi sensacional, e consolidou meu conhecimento.
    Vou COMPOR a Classe Clientes com as Classes Enderecos e Contas Correntes.
     Assim terei uma Classe CLIENTE que Herdará da Interface PESSOA e será COMPOSTA entre outras pelas classes ENDERECO e CONTAS_CORRENTES.

    Na segunda resposta, também fiquei muito satisfeito, vou criar uma Interface PESSOA e a partir dela, vou criar as classes, PessoaFisica e PessoaJuridica, Funcionario, Fornecedores etc.......


    Na tua terceira resposta, entendi o sentido de ter uma DLL core com as classes pertencentes a uma determinada gama de entidades, por exemplo, uma DLL com a interface Pessoa, e com as classes, PESSOAFISICA, PESSOAJURIDICA, FORNECEDORES, FUNCIONARIOS etc...
    So não percebi bem o que você quis dizer com classes de transporte :( 
    Seria as classes da camada de acesso a dados ?

    E por falar na classe de acesso a dados:

    Supondo que tenho uma CLASSE PESSOAFISICA, herdada da INTERFACE PESSOA, e uma CLASSE PESSOAJURIDICA, tambem herdada da INTERFACE PESSOA, devo criar uma DLL (DAL) para cada entidade, no caso DALPESSOAFISICA e DALPESSOAJURIDICA?
    Ou CRIO UMA UNICA DAL ABSTRATA GENERICA para todas as entidades?

    Grande Fernando, obrigado pelas luzes...

    Abraços, Juliano.

    (estou trabalhando num projeto de meios de pagamentos, imagina você ir a um restaurante, e na hora de pagar a conta, ao invés de apresentar dinheiro, ou cartão de credito ou cartão de debito, você simplesmente apresenta tua impressão digital: 
    Vc vai ao caixa, diz que vai pagar com o dedo por exemplo (nao posso falar o nome do produto, por sigilo de negocio), na maquininha que estamos desenvolvendo, o caixa informa os dados de VALOR, e CPF do pagante, o software empacota os dados de DATA, HORA, VALOR, CPF, NUMERO DE ESTABELECIMENTO e envia para nosso datacenter fazer asa devidas validações, retornando positivo ou negativo se a operação foi realizada.)


    J.Luz
    segunda-feira, 23 de março de 2009 16:19
  • Hummm,

    Com esta explciação do contexto ajuda muito a pensar melhor me uma arquitetura. Pelo seu modelo de negócio, uma plataforma que se encaxia bem seria o Smart Client com alguns  módulos desconectados (gerencia / Caixa / Etc).

    Neste modelo de arquitetura terial como típico algo abaixo :


    client

         Camada de UI (forms) (EXE + DLL comuns)
            |
          Camada de Validação basica  (Regras basicas comuns tipo campos obriogadorios e 
                                                           navegação/acesso) (DLL)
            |
           Chanel Adapter  (Camada de acesso aos serviços e dados , Aqui o meio de transporte web-                                   services/remoting/msmq etc seriam encapsuladas de forma que a UI 
                                        não saiba 'como e sim apenas "o que". Aqui tb é feito a logica de ir on-line ou 
                                        off   line , cache local etc.)  (DLL podendo ser unificada na DLL de validação)
    web /Servidor 

        Serviços (ex :wcf) expondo os contratos definidos pela classe de dados de transporte (Essas class
                   que  recebe os dados e "navega pelas camadas, e não possuem métodos)

        Camada de negocio (Aqui estão efetivamente as regras de seu negocio , onde vc instancia as classes , executa (DLL) 

        camada de DAL (Aqui estão efeitivamente instancias das fabricas de acesso   ou simplesmente um proxy para o acesso aos dados    (DLL) 

        Camada de Transporte(Aqui estão efetivamente classes de transpote que serão expostas pelos serviços , como esta separada em um projeto posso usar elas no projeto de serviços deixando bem claro os contrados de nossos serviços e tb na camada de negocio e/ou MApeameno ou ainda em outra camada do server (DLL) 

        Camada de Mapeamento OO X BD (Responsavel pelo mapeamento do Banco para classes . O LINQ é desesavel ou outra ferramneta como nHibernate. (DLL)


    Novamente não custa lembrar que isso é apenas uma arquitetura típica e pode variar bastante. Claro que estou suprimindo muita coisa senão o post cabaria gigantesco :-)

    Fernando Cerqueira MVP.ASP.NET TEAM AJAX.TOOLKIT CONSULTOR & ARQUITETO
    segunda-feira, 23 de março de 2009 16:53
  • Agora você já foi longe demais Fernandão, ta correndo muito ... eu sou peixe pequeno, estou com um projeto grande na mão... mas preciso quebrar em partes para poder gerenciar tudo o que precisarei desenvolver.

    Meteu toda a arquitetura no post hihihi... eu estava tentando manter as coisas simples para mim :D
    Eu sei, também, eu fui colocar o macro do sistema que estou desenvolvendo... mas, vamos deixar as coisas menores e falar apenas do CADASTRO DO CLIENTE.

    O que penso em fazer é desenvolver uma Aplicação EXE que enviará para o SERVIDOR (para um Web-Service talvez?) todos os dados cadastrais do CLIENTE: nome, enderecos, telefones, rg, cpf, nome da mae, nome do pai... etc...
    A Aplicação EXE empacota esses dados e envia para o servidor e lá no servidor eu faço a persistencia dos dados. Claro apos todos serem validados. Essa Aplicação irá rodar em diversos locais de São Paulo, pois vamos ANGARIAR clientes em varias regiões da CIDADE ( em supermercados por exemplo... quero ter um TERMINAL -PC- rodando essa aplicação em varias regiões de SP)

    Me diz uma coisa:

    Supondo que tenho uma CLASSE PESSOAFISICA, herdada da INTERFACE PESSOA, e uma CLASSE PESSOAJURIDICA, tambem herdada da INTERFACE PESSOA, devo criar uma DLL (DAL) para cada entidade, no caso DALPESSOAFISICA e DALPESSOAJURIDICA?

    Ou CRIO UMA UNICA DAL ABSTRATA GENERICA para todas as entidades passando parametros para os metodos de  CRUD?


    O que de fato faz este negocio de:

    "Camada de Mapeamento OO X BD (Responsavel pelo mapeamento do Banco para classes. O LINQ é desesavel ou outra ferramneta como nHibernate. (DLL)"

    Ele cria as classes da camada de acesso a dados????? ele facilita a criacão da camada DAL?

    Juliano;

    J.Luz
    segunda-feira, 23 de março de 2009 18:29