Classe com mais de 16000 linhas. O que vocês acham?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
palerique
Debugger
[Avatar]
Membro desde: 04/12/2009 13:37:03
Mensagens: 62
Localização: Brasília - DF
Offline

Estou em um projeto que está com sérios problemas de performance e esse projeto tem uma classe com mais de 16000 linhas!!!

De cara acho isso totalmente anormal.
Observando a classe notei que ela tem muitas inner classes.

O sistema é um cliente feito com ADF swing e essa classe contem os listeners de tudo o que acontece no sistema dividido em suas inners classes.

  • Me parece uma péssima prática, o que vocês acham?

  • Qual o fundamento ou estudo ou material científico que posso utilizar para aprender sobre isso?

  • Me parece que terei que refatorar o sistema, qual a melhor forma de fatiar essa classe?

  • Mesmo as inner classes sendo compiladas em arquivos diferentes eu terei problema de performance relacionado com essa classe? Ou o problema é só de desenvolvimento mesmo?

  • Quais as implicações dessa classe tão grande?

  • Como ela funciona na JVM?


  • Prova do crime:
    https://docs.google.com/open?id=0B8aMhRidHf-iZGQyMjllNmUtZDlkMi00ODIyLWI2MDEtZjE4ODE1MDU0NGZi

    Agradeço demais pelas respostas!
    PH

    Abraços,

    Paulo Henrique Lerbach Rodrigues
    OCPJP 6

    Todos os lugares onde você me encontra: http://www.palerique.com.br

    "Nestes lances de sobre-humano desespero, que seria de nós, se não nos valesse essa inspiração que nossas mães sabem derramar no coração infantil de seus filhos, esta crença indelével na grande divisa, na vida futura, na infalibilidade da Providência. Falo-vos assim porque eu também já provei desse cálice. Muitas e muitas vezes, abrasado por essas páginas de fogo que geram as imaginações escaldadas, eu iludi-me com os panegíricos com que a razão humana tem endeusado a si mesma, muitas vezes julguei a inteligência onipotente e absoluta; muitas vezes esperei descobrir nos recessos da ciência, desta ciência que já é tão grande, a chave para os arcanos do universo, o alimento são, completo e abundante para o espírito, o bálsamo generoso para as mágoas do coração. Deus, porém, estendeu o seu braço para mim e crestou a flor do meu orgulho (...) Então, ..., achei os livros mudos, a razão muda, e a filosofia estéril. Chorei e abracei-me à cruz. Foi a fé que me salvou"

    Rui Barbosa
    [WWW] [MSN]
    felipedamiani
    JavaEvangelist
    [Avatar]

    Membro desde: 07/10/2006 17:38:46
    Mensagens: 382
    Localização: Braço do Norte / Tubarão - SC
    Offline

    Não és o único com esse problema hahaha

    Felipe Damiani
    [Email] [WWW] [MSN]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    Problema de performance geralmente não tem a ver com o número de linhas num arquivo. Os arquivos gerados pelo antlr, por exemplo, são gigantescos e tem excelente performance.

    Se você quer descobrir pq o sistema está lento, ou consumindo memória, use um profiler:
    http://netbeans.org/features/java/profiler_pt_BR.html
    http://profiler.netbeans.org/
    http://visualvm.java.net/

    @ViniGodoy - Lattes

    Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

    Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
    Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

    Ei... você está usando DefaultTableModel no seu projeto??
    Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
    [WWW]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    palerique wrote:Me parece uma péssima prática, o que vocês acham?


    Geralmente é. Mas classes geradas por editores automáticos podem ficar bastante grandes. Nesse caso, é bom muda-las apenas no editor onde foram geradas.

    Me parece que terei que refatorar o sistema, qual a melhor forma de fatiar essa classe?

    Leia o livro Refatoração, do Martin Fowler. Há diferentes estratégias para os diferentes tipos de coisas que vc encontrar na classe.

    Mesmo as inner classes sendo compiladas em arquivos diferentes eu terei problema de performance relacionado com essa classe? Ou o problema é só de desenvolvimento mesmo?

    Nem um, nem outro. Se você tem problemas de performance, use um profiler.

    Quais as implicações dessa classe tão grande?

    Fica difícil de ler. Pode esbarrar no limite de linhas de um método da JVM.

    Como ela funciona na JVM?

    Exatamente igual a uma classe pequena. Até pq, pelo que vc falou, são várias classes num arquivo só (uma classe e várias inner classes).

    @ViniGodoy - Lattes

    Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

    Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
    Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

    Ei... você está usando DefaultTableModel no seu projeto??
    Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
    [WWW]
    fabim
    GUJ Master
    [Avatar]

    Membro desde: 14/12/2006 19:30:03
    Mensagens: 1268
    Localização: Vitoria - Espirito Santo
    Offline

    Acontece muito em sistemas Java Estruturados (e acredite, eles estão mais presente do que se imagina).

    Nao é pq um Sistema está construído com classes, ou alguns objetos "helpers", que seu sistema é Orientado a Objetos.
    Grande parte dos Sistemas Java poderiam ser substituidos por "Packages + Functions + Structs". Rsrsrsrs

    Refatorar uma classe de 16.000 linhas pode ser uma tarefa árdua e que exige experiencia.
    Mas siga as dicas acima do Viny e tudo vai dar certo.

    ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

    Sun Certified Web Component Developer
    Sun Certified Java Programmer
    Sun Certified Java Associate
    Sun Certified Business Component Developer - Em Andamento
    Bacharelando em Sistemas de Informacao


    [MSN]
    hugo.hlcxcx
    JavaChild
    [Avatar]

    Membro desde: 21/01/2010 18:17:35
    Mensagens: 108
    Offline


    16000 linhas ? Temos aqui na empresa um sistema com uma classe de ~ 4000 linhas e eu já entro em pânico quando tenho que dar alguma manutenção nela.

    Boa sorte na sua refatoração cara, vc vai precisar.

    Meu software nunca tem bugs. Isso são features aleatórias.
    YvGa
    Virtual Machine Man

    Membro desde: 07/03/2007 15:58:16
    Mensagens: 518
    Offline

    Como o Viny disse nao existe nenhum problema tecnico com uma classe de 16000 linhas. Este nao eh o motivo dos problemas de performance da aplicacao, entao quebra-la em classes menores nao vai ajudar, nem atrapalhar NESTE PONTO.

    Use um profiler, como ja foi recomendado, para descobrir os problemas de performance, se este problema for urgente, depois refatore as classes aos poucos a medida que for mexendo nela para fazer alteracoes.

    Mas entenda bem, os problemas de desempenho que voce tem nao sao relacionados ao design da classe, mas sim sao ocasionados pela implementacao dela.

    Paulo Borio
    DaviPiala
    Virtual Machine Man
    [Avatar]
    Membro desde: 17/08/2007 19:17:35
    Mensagens: 598
    Localização: São Paulo
    Offline

    É verdade que a perfomance não tem relação com o tamanho em si classe.

    Mas o tamanho dela inviabiliza qualquer manutenção ou melhoria. Essa classe suporta uma única tela? Se for esse apenas uma tela é possível negociar com o cliente? Se for apenas uma tela dá pra fazer uma nova proposta de tela em formato wizard ou segregar as funcionalidades em telas menores!!

    This message was edited 1 time. Last update was at 03/01/2012 20:19:31


    Si temi more regat
    Efamima dove tore
    Infata dio re
    Infa lati plastire
    Rocklee6544
    Debugger
    [Avatar]

    Membro desde: 02/03/2010 03:05:46
    Mensagens: 50
    Offline

    16000 Linha é o tamanho de muito sistema por ai.

    A maior classe que já vi tem 5000 linhas e já achei muito muito grande.

    Teve um projeto que participei que minhas classe ficaram com 150 linhas em média gostei muito.

    Fácil de dar manutenção.
    [Email] [MSN]
    Rocklee6544
    Debugger
    [Avatar]

    Membro desde: 02/03/2010 03:05:46
    Mensagens: 50
    Offline

    Código limpo e simples...

    Atualmente estou fazendo o caso de uso no qual criei uma tela base
    e as tela de manutenção que fazem o crud extend essa tela base.

    Por hora as classes que são responsaveis pelo crud estão com 60 linhas

    e tela base tem 400.

    e já esta fazendo quase tudo que deveria fazer.

    This message was edited 1 time. Last update was at 17/01/2012 08:23:11

    [Email] [MSN]
    aeciovc
    Java Ninja

    Membro desde: 28/02/2008 21:15:34
    Mensagens: 267
    Localização: Recife
    Offline

    como já foi dito. o fato da classe ter 16.000 ou 8.000 ou 400 linhas não quer dizer que a performance seja ruim.

    o que dizer por exemplo do Android que tem classes de 5.000 linhas pra mais.

    As inner class não atrapalham, por outro lado ajudam e economizam ( claro quando há necessidade).

    Aécio Costa
    www.aeciocosta.com.br
    [WWW] [MSN]
    fantomas
    GUJ Master
    [Avatar]

    Membro desde: 24/04/2008 16:10:55
    Mensagens: 1534
    Localização: Terra (maior parte do tempo)
    Offline

    Oi palerique,

    Minha opinião:

    Me parece uma péssima prática, o que vocês acham?

    Considero uma pratica ruim, ao pensar em reusabilidade do código poderemos notar que as coisas podem se complicar.

    Qual o fundamento ou estudo ou material científico que posso utilizar para aprender sobre isso?

    Siga a super dica do Vini.

    Me parece que terei que refatorar o sistema, qual a melhor forma de fatiar essa classe?

    Desculpe a sinceridade, ao utilizar as palavras "fatiar essa classe" vc gerou uma certa preocupação. Dividir um arquivo e partes menores não quer dizer que resolveu o problema, já vi casos que a situação ficou muito pior ao fazer isto. É preciso fazer um estudo do problema antes e depois aplicar os conceitos de OO junto com alguns padrões de projeto.

    Mesmo as inner classes sendo compiladas em arquivos diferentes eu terei problema de performance relacionado com essa classe? Ou o problema é só de desenvolvimento mesmo?

    Acredito que o problema foi gerado ao desenvolver o código já que a compilação resulta em arquivos menores. Lembrando que parte mais afetada é a reusabilidade do código.

    Quais as implicações dessa classe tão grande?

    Para chegar nas verdadeiras implicações é preciso fazer uma analise da(s) funcionalidade(s) envolvidas na implementação. Normalmente, pode não ser este seu caso, estas situações leva a geração de um objeto muito grande sem necessidade em alguns momentos. Isto faz com que a memória seja utilizada de forma não otimizada.

    Como ela funciona na JVM?

    Vide item acima.


    flws
     
    Índice dos Fóruns » Arquitetura de Sistemas
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team