Refatoração vs Desempenho

33 respostas
Marcio_Duran

Estava lendo o artigo colocado por Eduardo Guerra onde ele faz uma colocação sobre Refatoração no que ele observa coloca a seguinte questão:

:arrow: [color=darkred] Quando Fowler definiu refatoração ele deixou bem claro que o objetivo da refatoração era deixar o código mais limpo e mais claro.O ato de refatorar, muitas vezes, não tem a intenção de melhorar desempenho.[/color]

Questionando a colocação acima eu vejo isso de forma bem polêmica, mesmo então porque pensamos em Refatorar Patterns isso não tem uma extensão muito mais comportamental ao código, estávamos fazendo o que então ? destruindo projetos ? ; - Ou argumentando “olha refatorar é só pra códigos duplicados”

33 Respostas

tnaires

Olá

Até aqui eu entendi.

Como assim “refatorar patterns”?

O quê exatamente “não tem uma extensão muito mais comportamental ao código”?

Isso eu entendi também, só não entendi os argumentos que fizeram você concluir isso.

Pessoal, não estou tirando onda, estou realmente querendo entender o que ele escreveu e argumentar.

R


Marcio Duran,

Nem sempre uma melhora evolutiva e benefica, temos varias provas no mercado de TI.
A Microsoft com seus fix e patchs as vezes fodem, ao invez de de melhorar o SO.

E depois pensamos o que ? Sera que fizeram um Refactoring ou Downgrade no codigos?

Complicado se pensamos nisso…
Seria um mal necessario uma equipe de suporte sempre, ja que o produto sofre regressoes.

saudaçoes de Marte!

Marcio_Duran

Marcio Duran:
mesmo então porque pensamos em Refatorar Patterns
Como assim “refatorar patterns”?

Você não Refatora Banco de Dados ? Existe Patterns quando penso nisso pelo que seja ao Hibernate ou JDO ?

Marcio Duran:
isso não tem uma extensão muito mais comportamental ao código
O quê exatamente “não tem uma extensão muito mais comportamental ao código”?

Quando esbarra em uma interface de um outro sistema ?

Marcio Duran:
estávamos fazendo o que então ? destruindo projetos ? ; - Ou argumentando “olha refatorar é só pra códigos duplicados”
Isso eu entendi também, só não entendi os argumentos que fizeram você concluir isso.

Pessoal, não estou tirando onda, estou realmente querendo entender o que ele escreveu e argumentar.


É algo muito mais além do que dizer que isso não melhora ou tem relevância no desempenho não acha !!!

Marcio_Duran

Um coisa que já ouvi falar que certas empresas já desenvolvi seus próprio SO, para garantir a sustentação de suas aplicações e segurança


E depois pensamos o que ? Sera que fizeram um Refactoring ou Downgrade no codigos?

Bem preocupante pois o usuário comum fica refém de uma tecnologia controlada por códigos de pouca credibilidade, vejo que o linux é ao anos luz que Microsoft já.

[b]Sim, o problema esta na cultura de um País que ainda não tem retaguarda de desenvolvedores especializados ainda, o assunto é bem cultural mesmo.
[/b]

R

Marcio Duran:

[b]Sim, o problema esta na cultura de um País que ainda não tem retaguarda de desenvolvedores especializados ainda, o assunto é bem cultural mesmo.
[/b]


Marcio Duran,

Realmente ficar escravo de um SO ou qualquer programa pago e complicado, mas isso e uma decisao que as empresas tomam.
Nem todos querem OpenSource, pois os gratis nao geram confiança!

Eu vejo tudo igual a crise atual, uma falta de confiança.

Mas o Refactoring e melhorar o que temos, e nos preparar para o dia de amanha.
Pois se nao melhoramos, o proprio mal nos devora.

saudaçoes

Andre_Fonseca

Marcio,

Acho que com o barateamento cada vez maior do hardware a questão do desempenho deixa de ter importância se compararmos com a dificuldade que pode existir em dar manutenção em um código macarrônico feito a base de Ctrl-C e Ctrl-V

Além disso, todos que gostam mesmo de programar se sentem muito mais satisfeitos quando colocam a mão em um código limpo e fácil de entender não é?? :smiley:

Abs

L

Marcio Duran:
Estava lendo o artigo colocado por Eduardo Guerra onde ele faz uma colocação sobre Refatoração no que ele observa coloca a seguinte questão:

:arrow: [color=darkred] Quando Fowler definiu refatoração ele deixou bem claro que o objetivo da refatoração era deixar o código mais limpo e mais claro.O ato de refatorar, muitas vezes, não tem a intenção de melhorar desempenho.[/color]

Questionando a colocação acima eu vejo isso de forma bem polêmica, mesmo então porque pensamos em Refatorar Patterns isso não tem uma extensão muito mais comportamental ao código, estávamos fazendo o que então ? destruindo projetos ? ; - Ou argumentando “olha refatorar é só pra códigos duplicados”

Não vejo nada de polêmico na afirmação do Eduardo, tão pouco na do Fowler. Refatoração, na maioria das vezes, é utilizada para melhorar o código existente. Isso se dá principalmente pq ao longo do desenvolvimento do projeto, os desenvolvedores vão amadurecendo tanto profissionalmente, quanto no conhecimento e do funcionamento do projeto, então, nada mais natural do que com isso evoluir o código para aprimorá-lo, e é aí que entra a refatoração. Agora, nada impede de você querer fazer um refactoring para melhorar o desempenho do seu sistema em uma parte crítica, caso isso seja necessário.

Outra coisa que o Fowler e outros autores sempre falam, é que na larga maioria das vezes, você não precisa de um código otimizado ao extremo, então, não é recomendável você abrir mão de legibilidade do código, só pra deixar ele mais performático. Acho que é por isso que ele fala que Fowler enfatizou que o objetivo é deixar o código mais limpo e mais claro. Eu já ouvi em um projeto que o cara cismou que tinha que colocar as constantes inteiras escritas em hexadecimal, que isso otimizava o código. Até podia ser, não sei dizer se sim ou não, mas dá pra imaginar a beleza que ficava pra entender né.

Quanto a discussões aí sobre SO, não entendi nada, mas também prefiro não entender! :slight_smile:

aleck

Vc apenas deve se preocupar com desempenho se for um requisito de seu sistema, do contrário espere os problemas de performance aparecerem para começar a otimizar.

Isso já está passado mas vou repetir: “premature optimization is the root of all evil”.

victorwss

Isso definitivamente está entre as coisas mais imbecis que eu já vi.
Esse idiota realmente não manja porra nenhuma e não sabe programar nada. E não deve saber nada sobre o funcionamento do compilador e da JVM.

  1. Se está em hexadecimal, binário, octal ou decimal, não importa, pois o compilador vai traduzir para a mesma forma (binária) durante a análise léxica. No runtime não existe nenhuma, absolutamente nenhuma, diferença entre eles. Você pode descompilar a classe para ver isso.

  2. Quanto a constantes “static final int” e “static final long”. A JVM é esperta o suficiente para otimizar isto copiando e colando os valores diretamente nos bytecodes.

victorwss

Marcio Duran:
Estava lendo o artigo colocado por Eduardo Guerra onde ele faz uma colocação sobre Refatoração no que ele observa coloca a seguinte questão:

:arrow: [color=darkred] Quando Fowler definiu refatoração ele deixou bem claro que o objetivo da refatoração era deixar o código mais limpo e mais claro.O ato de refatorar, muitas vezes, não tem a intenção de melhorar desempenho.[/color]

Questionando a colocação acima eu vejo isso de forma bem polêmica, mesmo então porque pensamos em Refatorar Patterns isso não tem uma extensão muito mais comportamental ao código, estávamos fazendo o que então ? destruindo projetos ? ; - Ou argumentando “olha refatorar é só pra códigos duplicados”

:arrow: Refatorar = Deixar código melhor.

:?: Melhor == Mais rápido?
:!: Talvez, mas normalmente não. O objetivo nem sempre é melhorar o desempenho. Normalmente é melhorar a legibilidade, a manutenibilidade, a reusabilidade, a modularidade.

Refatorar não é só para códigos duplicados. As vezes você vê aquela classe cheia de “public static” da vida, e reorganiza ela de uma forma mais OO. Ou então você vê aquela classe CarroMotorista que representa o carro e o motorista ao mesmo tempo ( :shock: :x :? :evil: ) e então você a divide em duas, Carro e Motorista ( :smiley: 8) ).

Marcio_Duran

victorwss:

:arrow: Refatorar = Deixar código melhor.

:?: Melhor == Mais rápido?
:!: Talvez, mas normalmente não. O objetivo nem sempre é melhorar o desempenho. Normalmente é melhorar a legibilidade, a manutenibilidade, a reusabilidade, a modularidade.

Refatorar não é só para códigos duplicados. As vezes você vê aquela classe cheia de “public static” da vida, e reorganiza ela de uma forma mais OO. Ou então você vê aquela classe CarroMotorista que representa o carro e o motorista ao mesmo tempo ( :shock: :x :? :evil: ) e então você a divide em duas, Carro e Motorista ( :smiley: 8) ).


:arrow: Esse material lida com Refactoring to Patterns

Refactoring to Patterns is the marriage of refactoring – the process of improving the design of existing code – with patterns, the classic solutions to recurring design problems. Refactoring to Patterns suggests that using patterns to improve an existing design is better than using patterns early in a new design. This is true whether code is years old or minutes old. We improve designs with patterns by applying sequences of low-level design transformations, known as refactorings.

“Esse PDF Coloca de forma direta o assunto, acho que mostra uma versão melhor do que estamos aqui questionando”, espero que ajude[size=18] ; )[/size]

:arrow: http://rockfish-cs.cs.unc.edu/COMP290-agile/rtp113.pdf

Marcio_Duran

Algoritmos pessimamente projetados ou quebra de código a Refatoração é algo que envolve o design de um padrão de projeto e é reflexivo também nas implementações existentes, o que penso ai é , estou ganhando tempo para desfazer tais praticas de desenvolvimento viciadas ou então estou re-projetando o sistema para novas especificações que são as minhas novas features para o sistema.


Quanto a discussões aí sobre SO, não entendi nada, mas também prefiro não entender! :-)

“Já ouviu falar em ambiente de software controlado, ou até ainda EJB´s são como um sistema Operacional”

Marcio_Duran

André Fonseca:
Marcio,

Acho que com o barateamento cada vez maior do hardware a questão do desempenho deixa de ter importância se compararmos com a dificuldade que pode existir em dar manutenção em um código macarrônico feito a base de Ctrl-C e Ctrl-V

Além disso, todos que gostam mesmo de programar se sentem muito mais satisfeitos quando colocam a mão em um código limpo e fácil de entender não é?? :smiley:

Abs


[i]A qualidade de software para os instrumentos de desenvolvimento de hoje exige um domínio pelas ferramentas que fazem test de frameworks e ainda controlam profile e entre outras situação de criticalidade, até então não podendo ser feito a mão ou no olhômetro.Open Source é viável mas é são comunidades que mantém essas atualizações e melhorias.“Gostar de programar” , você esta em um projeto que envolve colaborações e o sucesso e o tempo de vida do mesmo é que lhe garante prestigio e sobrevivência.

abrsss[/i]

tnaires

Victor, pegando um gancho no seu comentário… De que forma poderíamos refatorar, por exemplo a classe Math, para ficar mais OO? A gente sente um “bad smell” quanto vê uma classe cheia de métodos estáticos, mas qual seria a melhor forma de refatorá-la?

Marcio_Duran

aleck:
Vc apenas deve se preocupar com desempenho se for um requisito de seu sistema, do contrário espere os problemas de performance aparecerem para começar a otimizar.
Isso já está passado mas vou repetir: “premature optimization is the root of all evil”.

A tendencia é até que o uso de inteligencia artificial possa fazer previsões de requisitos, voltando ao que deve ao desempenho é o que vale a tecnologia em seu tempo e sua geração que torna-se determinante perceptível para outra forma de linguagem de sua época, ao menos o que vai para WEB não vai esperar é simplesmente convergente.

victorwss

Marcio Duran:
aleck:
Vc apenas deve se preocupar com desempenho se for um requisito de seu sistema, do contrário espere os problemas de performance aparecerem para começar a otimizar.
Isso já está passado mas vou repetir: “premature optimization is the root of all evil”.

A tendencia é até que o uso de inteligencia artificial possa fazer previsões de requisitos, voltando ao que deve ao desempenho é o que vale a tecnologia em seu tempo e sua geração que torna-se determinante perceptível para outra forma de linguagem de sua época, ao menos o que vai para WEB não vai esperar é simplesmente convergente.

Marcio, você estava indo muito bem, conseguindo ser mais ou menos lúcido e claro. Mas agora, acabou de ter uma recaída de novo.
Cara, pare de beber. Pare de fumar cogumelos. Não acredite no que os duendes azuis que você vê dizem.

B

Victor, pegando um gancho no seu comentário… De que forma poderíamos refatorar, por exemplo a classe Math, para ficar mais OO? A gente sente um “bad smell” quanto vê uma classe cheia de métodos estáticos, mas qual seria a melhor forma de refatorá-la?

Math não precisa de refatoração. O objetivo dela não é ser uma classe OO, está mais pro lado do paradigma funcional.

Bad smells não são absolutos.


Bem, voltando ao tópico, para mim refatorar === melhorar a legibilidade do código.

Um dos motivos para refatorar é você limpar o teu sistema para conseguir vê-lo de um ponto mais alto, descobrir o real motivo de um dado problema, por exemplo, de desempenho, e ter a capacidade e segurança de alterar o teu código para resolver o problema.

Quem já não encontrou um código e não entendeu nada que fazia? Então refatoramos, limpando o código, descobrimos que certas partes não precisam gastar tanto tempo, daí as refatoramos.

Normalmente, mais que um fim, refatorar é um meio para conseguir benefícios maiores.

Marcio_Duran

victorwss:

Marcio, você estava indo muito bem, conseguindo ser mais ou menos lúcido e claro. Mas agora, acabou de ter uma recaída de novo.
Cara, pare de beber. Pare de fumar cogumelos. Não acredite no que os duendes azuis que você vê dizem.

Claro estou indo além, você só entende isso em uma atividade que seja comercial, existem vários campos sobre o assunto, desde industrial até outras áreas de entretenimento games e por ai vai.

:arrow: Refactoring para Aspectos de um Motor de Jogo Orientado a Objeto.

:arrow:http://wiki.dcc.ufba.br/pub/WASP04/AcceptedPosters/RefactoringParaAspectosMotorJogosWASP2004.corrigido.pdf

Abstract

The development of games is a complex activity that requires specific knowledge in several areas such as Computer Graphics, Artificial Intelligence, Distributed Systems, etc. In this work, we are interested in assessing the potential benefits of the aspect-oriented paradigm related to the maintenance and evolution of electronic games, through the the aspect-oriented refactoring of a game engine, followed by a quantitative comparison between the object-oriented and aspect-oriented implementations.

Você não precisa imaginar, assista ao vídeo é algo como iterar objetos do mundo real para o computacional.
[size=18]
[color=red]Post-its eletrônicos usando? post-its![/color][/size]
Um pessoal do MIT resolveu que a melhor maneira de criar post-its eletrônicos é usando? post-its de papel! O projeto Quickies usa canetas digitais, RFID e inteligência artificial para transformar post-its de papel em arquivos digitais, com busca, tags, e outras funcionalidades bacanas, tipo reconhecer quando uma nota é sobre um compromisso e mandar uma mensagem por email ou SMS para lembrá-lo na hora certa. Muito bacana!

[youtube]http://www.youtube.com/watch?v=HQT5_4aVvHU&eurl[/youtube]

M

"

Marcio_Duran

quote=Bruno Laturner

…(…)…
Normalmente, mais que um fim, refatorar é um meio para conseguir benefícios maiores.[/quote]
Eu concordo que códigos esdrúxulos devam ser redesenhados, entretanto a aplicação impacta no desempenho sim, pois a semântica já pode não ser mais a mesma ao código refatorado.

Existem requisitos que afetam diversas classes de maneira sistemática, modificando a semântica destas e/ou o desempenho da aplicação, tais como: mecanismos de persistência, depuração, distribuição etc. A implementação destas normalmente feita de forma tal que fragmentos de código correspondentes a estas são encontrados dispersos ao longo de diversas classes da aplicação. Da mesma forma, atributos e métodos para tratar destas propriedades aparecem em diversas classes do sistema de forma direta (inseridos na classe) ou indireta (através de associações).
[Kiczales et al. 1997]

B

Sim, impacta, mas é significante? É negativo? Se for os dois, regrida.

Quanto a semântica…? Significado? Resultado? O princípio fundamental da refatoração é que o resultado/retornos do código fatorado sejam idênticos a antes da transformação. É como dizer a mesma coisa, mas de forma mais clara.

peczenyj

:arrow: Se uma aplicação ficar 100 milissegundos mais lenta mas a manutenção na mesma for 20% mais rapida nas proximas vezes que eu tive que atualizar alguma coisa pode fazer a pena, basta ter métricas.

S

tnaires:
Victor, pegando um gancho no seu comentário… De que forma poderíamos refatorar, por exemplo a classe Math, para ficar mais OO? A gente sente um “bad smell” quanto vê uma classe cheia de métodos estáticos, mas qual seria a melhor forma de refatorá-la?

Colocar aqueles métodos na classe Number:

Integer i = 5;
i.abs();
i.sin();

Em Ruby:

5.abs

Senhores, se código é requisito, podemos afirmar que refatorar código é melhor os requisitos? :twisted:

peczenyj
Marcio_Duran

Schuenemann:

Senhores, se código é requisito, podemos afirmar que refatorar código é melhor os requisitos? :twisted:

O que é refatorar?
R: Alterar a estrutura interna do softwareb[/b] sem alterar seu comportamento observável(como ele funciona).

Segundo Eduardo Guerra:
[color=blue]O que é Refatoração ?[/color]
O objetivo de uma refatoração é tornar o código mais claro e limpo, seja com uma mudança simples, como alterar o nome de uma variável, ou complexa, como a mudança de uma estrutura de classes.

[color=blue]Por que se deve refatorar ?[/color]
Caso no futuro seja necessário[color=blue] alterar os requisitos[/color], com este código constantemente refatorado é mais fácil de implementar as modificações.

[color=red]
Refactoring on Rails[/color]
, estudar é preciso não para não[size=18] ; )[/size]

:arrow: http://www.tudoquequerosaber.com/files/refactoring_on_rails_eduardo_fiorezi.pdf

peczenyj

Sejam M o conjunto de códigos que tem o mesmo comportamento observável(como ele funciona), a refatoração seria uma aplicação M -> M onde eu altero C para C’ (nesse caso existe a invariância funcional).

Se eu preciso alterar os requisitos, alterando assim o seu comportamento observável, como em C’ pode ser mais fácil do que em C, uma vez que eles são invariantes funcionais? Matemáticamente não é plausivel essa hipotese a menos que C’ seja pensado de forma a ter alguma relação com uma classe de futuras alterações de requisitos.

LPJava

para o autor do topico recomendo a leitura no link abaixo, acho que a frase:

houve um pouco de infelicidade…

link

veja no link pq refatorar…

Marcio_Duran

LPJava:

:arrow: [size=18]LPJava[/size] O termo refatoração é aplicado a sistemas orientados a objetos; para outros paradigmas de programação esse mesmo processo é descrito como reestruturação.

ahha !!!
Poxa porque não questiona aqui mesmo, eu tenho que ir no seu blog bom eu já fui, agora coloca aqui as questões para que todos venham a debater no Forúm.

abrsss

LPJava

Marcio Duran:
LPJava:

:arrow: [size=18]LPJava[/size] O termo refatoração é aplicado a sistemas orientados a objetos; para outros paradigmas de programação esse mesmo processo é descrito como reestruturação.

ahha !!!
Poxa porque não questiona aqui mesmo, eu tenho que ir no seu blog bom eu já fui, agora coloca aqui as questões para que todos venham a debater no Forúm.

abrsss

ue repetir o que ja está na internet e tb algo que ja foi postado no guj alguns meses atras por outra pessoa?

Marcio_Duran

peczenyj:
Sejam M o conjunto de códigos que tem o mesmo comportamento observável(como ele funciona), a refatoração seria uma aplicação M -> M onde eu altero C para C’ (nesse caso existe a invariância funcional).

Se eu preciso alterar os requisitos, alterando assim o seu comportamento observável, como em C’ pode ser mais fácil do que em C, uma vez que eles são invariantes funcionais? Matemáticamente não é plausivel essa hipotese a menos que C’ seja pensado de forma a ter alguma relação com uma classe de futuras alterações de requisitos.


:arrow: C , você atribui aqui como variável ?

Ferramentas que apoiam o teste funcional, em geral, enfatizam a automatização da geração de casos de teste, e não oferecem análise de cobertura segundo critérios do teste funcional. Para suprir essas duas características introduz-se a ferramenta AFTT - Aspect-based Functional Testing Tool, que usa os recursos providos pelo AspectJ para instrumentação do programa em teste, execução dos critérios funcionais e checagem de invariantes, pré e pós-condições.

Marcio_Duran

LPJava:

ue repetir o que ja está na internet e tb algo que ja foi postado no guj alguns meses atras por outra pessoa?

UE, Clickar para ler no seu Blog, UE, UE !!!

peczenyj

Marcio Duran:
peczenyj:
Sejam M o conjunto de códigos que tem o mesmo comportamento observável(como ele funciona), a refatoração seria uma aplicação M -> M onde eu altero C para C’ (nesse caso existe a invariância funcional).

Se eu preciso alterar os requisitos, alterando assim o seu comportamento observável, como em C’ pode ser mais fácil do que em C, uma vez que eles são invariantes funcionais? Matemáticamente não é plausivel essa hipotese a menos que C’ seja pensado de forma a ter alguma relação com uma classe de futuras alterações de requisitos.


:arrow: C , você atribui aqui como variável ?

Ferramentas que apoiam o teste funcional, em geral, enfatizam a automatização da geração de casos de teste, e não oferecem análise de cobertura segundo critérios do teste funcional. Para suprir essas duas características introduz-se a ferramenta AFTT - Aspect-based Functional Testing Tool, que usa os recursos providos pelo AspectJ para instrumentação do programa em teste, execução dos critérios funcionais e checagem de invariantes, pré e pós-condições.

Vc não respondeu a minha pergunta :wink:

Marcio_Duran

peczenyj:

Vc não respondeu a minha pergunta ;-)

Entendendo M sendo conjunto de código tendo C o mesmo comportamento observável de C , onde C é invariante funcional (então C), é simétrico por suas grandezas invariantes, agora sendo C para n-instâncias eu teria ai uma referência forte e não seria somente Conjunto de M, e sim um Aspecto que satisfaça outro comportamento observável.

Espero ter ajudado,
Abaixo visão sobre requisito ao sistema,

Requisitos (Observáveis na execução)

Como é que o sistema durante a execução satisfaz seus requisitos de comportamento?
Fornece os resultados esperados?
Fornece-os num período de tempo razoável?
O sistema funciona como desejado quando ligado a outros sistemas?

Requisitos (Não observáveis na execução)

É fácil integrar, testar e modificar o sistema?
É caro de desenvolver?
Qual é o limite de tempo para lançar no mercado?

Criado 29 de janeiro de 2009
Ultima resposta 1 de fev. de 2009
Respostas 33
Participantes 12