Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Joaopedro23434we

Está código está mal feito?

Recommended Posts

Olá pessoal, eu desenvolvo em PHP a um tempinho, porém nunca fui de praticar muito e de vez em quando eu crio alguma coisa, porém sempre que eu faço algo eu procuro na internet para verificar se minha aplicação está bem feita. Hoje precisei criar uma função que retorna o tempo em que o usuário fez uma postagem, similar ao facebook, Ex: O arquivo foi postado a 1h ou a 23 minutos. O negócio é que eu vi algumas funções que fazem algo parecido só que com um código bem feito.

Olhem a função que eu fiz:

function calcular_tempo_postagem($dataPublicacao){
		#Ler data e hora atual. Data em formato (AAAA-MM-DD) e hora em (HH-MM-SS)
		$dataAtual = date("Y-m-d");
		$horaAtual = date("H:i:s");
		
		#Criar data e hora para comparação: DATA ATUAL
		$exDATA_A = explode("-", $dataAtual);
		$exHORA_A = explode(":", $horaAtual);
		
		#Separar data da hora, da publicacao
		$exDATAPUB = explode(" ", $dataPublicacao);
		
		#Criar data e hora para comparação: DATA DA PUBLICAÇÃO
		$exDATA_P = explode("-", $exDATAPUB[0]);
		$exHORA_P = explode(":", $exDATAPUB[1]);
		
		if($exDATA_A[0]>$exDATA_P[0]){
		$subAnos = $exDATA_A[0]-$exDATA_P[0];
		return "Há ".$subAnos." anos";
		}
		else if($exDATA_A[1]>$exDATA_P[1]){
		$subMeses = $exDATA_A[1]-$exDATA_P[1];
		return "Há ".$subMeses." meses";
		}
		else if($exDATA_A[2]>$exDATA_P[2]){
		$subDias = $exDATA_A[2]-$exDATA_P[2];
		return "Há ".$subDias. " dias";
		}
		else if($exHORA_A[0]>$exHORA_P[0]){
		$subHoras = $exHORA_A[0]-$exHORA_P[0];
		return "Há ".$subHoras." horas";
		}
		else if($exHORA_A[1]>$exHORA_P[1]){
		$subMinutos = $exHORA_A[1]-$exHORA_P[1];
		return "Há ".$subMinutos." minutos";
		}
		else{
		$subSegundos = $exHORA_A[2]-$exHORA_P[2];
		return "Há ".$subSegundos." segundos";
		}
		
		
	}

Eu sei que existe várias formas de fazer isso, entretanto eu fico meio bolado porque eu não consegui pensar em algo mais robusto e talvez mais leve. O que acham?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está código está mal feito?

Sim, está.

Se é apenas para calcular a diferença, utilize recursos da linguagem ao invés de explode. PHP tem uma biblioteca inteira só para isso

$now = new DateTime();
$published = \DateTime::createFromFormat('Y-m-d H:i:s' , '2017-01-24 10:00:00');
 
$diff = $now->diff($published);
 
echo $diff->format('%H:%I');
Separe as responsabilidades. Uma coisa é calcular, outra é exibir/imprimir. Logo:

function calcPublishedTime(\DateTime $publishedTime) : \DateInterval
{
    return $publishedTime->diff(new \DateTime() , true);
}
E, então, exibir:

$diff = calcPublishedTime(DateTime::createFromFormat('Y-m-d H:i:s' , '2017-01-24 10:00:00'));
 
echo $diff->format('%H:%I');
Se deseja ter algum output com textos diferentes, pode criar uma função só para formatar a saída.

Mais alguns pontos são sobre Object Calisthenics, os quais pode ver nos links abaixo:

http://pt.slideshare.net/guilhermeblanco/php-para-adultos-clean-code-e-object-calisthenics

http://williamdurand.fr/2013/06/03/object-calisthenics/

Com os links acima, vai resolver o problema de alta complexidade ciclomática nos seus códigos. Use PHPMD (PHP Mess Detector) para lhe ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

João Pedro, vou te passar uma ideia:

function retornaTempoDaPostagemEmFormatoHumano($dataPublicacao = '2017-01-24 17:55:00')
{
    $dataPublicacao = new DateTime($dataPublicacao);
    $dataAtual = new DateTime('NOW');
    $intervalo = $dataAtual->diff($dataPublicacao);

    return $intervalo->format('Postado há: %y anos %m mes, %d dias, %h horas, %i minutos, %s segundos');
}

print retornaTempoDaPostagemEmFormatoHumano();

Como o Gabriel disse, estude mais a linguagem. As vezes você pode estar criando um baita algoritmo para resolver um problema, e já existe uma função nativa na linguagem que faz a mesma coisa com apenas uma palavra :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas dicas pessoal. De acordo com o que vocês falaram eu fiz o código da seguinte forma:

function calcular_tempo_postagem($dataPublicacao){
	        $dataAtual = new DateTime("NOW");
		$dataPublicacao = new DateTime($dataPublicacao);
		$difTempo = $dataAtual->diff($dataPublicacao);
		
		$transfTempo = array("y","m","d","h","i","s");
		$rax = 0;
		
		while($rax<6){
			  $lerTF = $transfTempo[$rax];
			  $temp  = $difTempo->format("%$lerTF");
			  if($temp!=0){
				 return $temp;
			  }
			  $rax++;
		}
	}

Está com uma precisão de tempo excelente e bem menor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de bola.

Um 'pro' do seu código foi o uso do Early return

http://softwareengineering.stackexchange.com/a/18473

http://blog.alura.com.br/quanto-mais-simples-melhor/

Boa evolução.

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

João Pedro, falando sobre código "bonito", mas conhecido como código limpo, ainda podemos melhorar algumas coisas nesse seu resultado atual:

O ideal seria podermos entender o que esse while faz, sem ter que ler o código dentro dele, você poderia extrair esse while para outra função, onde o nome dessa função explicasse a sua funcionalidade. E de quebra você teria um componente para se reutilizar.

Falando em reutilizar, a primeira etapa que você faz para pegar o $difTempo também poderia estar em outra função. Assim caso precise fazer esse calculo entre datas novamente, já vai ter essa função pronta.

Ah, o que quer dizer essa variável de nome $rax? É difícil entender para que ela serve, apenas lendo-a

Código bonito não é código curto, ou que tenha um super algoritmo complexo, código bonito é código fácil de ler e entender, onde os métodos, variáveis e arquivos tenham bons nomes, e que seja reutilizável, entre outras coisas...


Se você se interessa pelo assunto, um dos livros mais recomendados é o "Codigo Limpo" de Robert C. Martin

Compartilhar este post


Link para o post
Compartilhar em outros sites

edcesar obrigado pelas dicas! Esse nome da variável $rax é porque geralmente eu coloco qualquer coisa antes que eu esqueça a lógica da função, mas eu só faço isso quando não monto nenhum Diagrama de blocos. Se tratando da extração dos códigos para funções, eu não costumo fazer isso pois o que eu aprendi de PHP era em blogs amadores e hoje em dia eu tenho um pouco de dificuldade em me atualizar. Mas obrigado pelas dicas, vou procurar urgente uma forma de melhorar! Esse ano vou começar o curso de CC e espero aprender muita coisa legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recomendo bastante essa lista no YT (o canal como um todo):

https://www.youtube.com/playlist?list=PLMdYygf53DP5Sc6yFYs6ZmjsuuA2fu0TK

Especialmente esse:

Animal os videos do Felipe Deschamps.

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando funções específicas, nativas do PHP para o feito de cada necessidade é uma excelente prática, é o que recomendo a todos. Se tem função específica para aquilo, então vamos utilizar; nada de ficar dando rodeios para chegar ao resultado esperado.

É notório que o código ficará simples de se entender e interpretar, além de melhorar a performance.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel assisti o vídeo e gostei muito, abriu mais minha mente sobre a importância das funções na qual eu não dava muito valor. Alaerte realmente é bem melhor, eu sou meio cabeça dura e sempre preferi inventar minhas gambiarras, por exemplo; quando eu tinha um array e precisava inverte-lo, ao invés de utilizar uma função já pronta eu criava um método de inversão só para me sentir "mais programador", mas vejo que isso é desnecessário sendo que posso dividir meu código em várias funções e melhorar a manutenção e agilidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compreendo. Então, na verdade não precisa inventar o que já está pronto, é perda de tempo, perda de performance e isola funções que deveriam estar trabalhando, que são "específicas daquilo" entendeu ? Faça do modo certo que você se sentirá mais "programador" quando ver tudo bonitinho e rodando maravilhosamente bem.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Gabriel assisti o vídeo e gostei muito, abriu mais minha mente sobre a importância das funções

Eu tmb meu querido... eu tmb haha.

De qlq forma é legal tmb refazer algumas funções 'nativas' para aprendizado.

O conceito/teoria por trás da classe DateTime()

Você sabe criar um in_array()?

Ainda mais em php/web que normalmente você acaba programando em pelo menos mais uma linguagem (Js estou falando de você)

Como utilizar o in_array() no js vanilla?

Fazer uma 'magica' no DB para junção de tabelas.

Uma coisa falada pelo Felipe nos videos que tento fazer hoje após um tempo de caminhada é o estudo de Design Patterns

Mais alguns links que lembrei:

http://br.phptherightway.com/#data_e_horario

http://br.phptherightway.com/pages/Design-Patterns.html

Evolução de código é muito bom.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou me focando muita na qualidade do código. Me lembro que eu fiquei um tempo desenvolvendo um jogo da velha simples, só que eu parei e quando fui tentar voltar eu não sabia o que estava escrito, o código estava praticamente ilegível pois algumas variáveis não tinha sentido, sem falar que existia apenas uma função declarada e praticamente o código inteiro era jogado sem comentários.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.