devfsa / evolua

Mande um PR e evolua com os feedbacks da comunidade.
10 stars 3 forks source link

FizzBuzz em PHP #6

Closed jonataa closed 5 years ago

jonataa commented 5 years ago

Olá,

Implementei o desafio do FizzBuzz em PHP usando classe e um teste unitário básico.

Para executar o código, digite no terminal php src/fizzbuzz/jonataweber/php/app.php.

Se tiver qualquer dúvida ou sugestão me avisa.

Abraço!

jonataa commented 5 years ago

Obrigado por revisar, @cleristonos! Good job 👍

jonataa commented 5 years ago

@cleristonos sobre os "números mágicos", acho que não faz muito sentido o uso da constante naquele caso, porque basicamente a regra pra ser ou não fizzbuzz não são "configuráveis", como no caso do MAX_PASSWORD_SIZE do stackoverflow.

Por exemplo, hoje o calculo pra ser fizz são números múltiplos de 3, se amanhã passarem a ser múltiplos de 7, okay, talvez faça sentido, mas a regra pode mudar inclusive para number * 2 > 10, ai não sei se faz tanto sentido as constantes, nesse tipo de mudança inclusive você teria que remover a constante porque ela deixaria de ser utilizada. Faz sentido?

jonataa commented 5 years ago

Uma coisa que estava aqui pensando, considerando o que vc disse sobre as constantes, talvez a solução mais SOLID e configurável possível seria separar a classe FizzBuzz em duas. Uma responsável pelas regras e outra para fazer o translate de number para fizzbuzz (FizzBuzzRules e FizzBuzzRender). Aí você teria esses ajustes, de repente passando uma lambda no construtor do Rules e passando o rules no construtor do render. Tipo isso:

...
$rule = new FizzBuzzMultiplesRule(3, 5);
$render = new FizzBuzzRender($rule);
$translated = $render->translateFromList($numbers);
echo implode($translated, PHP_EOL);
cleristonos commented 5 years ago

@jonataa Bom ponto. Existe mais de um motivo pelo qual a gente pode adotar uma constante em vez de um número direto no código. O primeiro argumento é justamente o que você apontou: Facilitar possíveis mudanças no futuro. Existem outros e o tão importante quanto, um deles é a expressividade do código.

Quando eu tenho: return $number % 3 === 0; Eu leio: "Retorna true quando $number é divizível por 3"

Quando eu tenho: return $number % FIZZ_FACTOR === 0; Eu leio: "Retorna true quando $number é divizível pelo fator fizz"

Um outro ponto a resaltar: constantes não devem ser vistas como ponto de mudança/configuração, afinal são constantes. Para algo configurável podemos utilizar outros artefatos. As constantes ajudam a expressar nossa regra de negócio.

Existem casos em que o uso da constante é desnecessário, como

Mas todos esse casos são de senso comum. Se o valor faz parte do négocio é uma boa usar constantes para aumentar a expessividade :wink:

The term magic number also refers to the bad programming practice of using numbers directly in source code without explanation. In most cases this makes programs harder to read, understand, and maintain. Although most guides make an exception for the numbers zero and one, it is a good idea to define all other numbers in code as named constants.

Então respondendo a sua pergunta, sim do ponto de vista de manutenibilidade não há ganhos, mas do ponto de vista de leitura e expressividade consigo ver benefícios. O que acha?

Um ponto a deixar claro, esse é um PR que eu aceitaria, mas o objeto aqui é stressar as decisões para extraírmos conhecimento, está bem longe de uma crítica ou imposição de uma "verdade"!

jonataa commented 5 years ago

Excelente, @cleristonos ! Achei ótimo seus argumentos, sem dúvida as constantes aumentam a expressividade, mesmo que seja num caso como aquele, onde não há reuso e é estritamente utilizado pela função isFizz. Realmente deixa mais claro o papel do 3 e do 5.

E você tem razão quando fala que constantes não devem ser vistos como pontos de mudança, apesar de serem úteis e não causam tanto impacto quando são utilizadas para esse fim. Mudar o valor de MAX_PASSWORD_SIZE, por exemplo, é algo que tende a acontecer naturalmente com o tempo.

Pronto! Tá decidido, vou adotar o FIZZ_FACTOR e BUZZ_FACTOR no código.

Obrigado por compartilhar e ajudar a melhorar meu código!

matheuscas commented 5 years ago

Eu sempre tento fazer os códigos com duas coisas em mente:

Então, sim, eu gosto de constantes mais pela legibilidade do que qualquer outra coisa, daí endosso o que o @cleristonos argumentou.

Além disso, eu queria acrescentar uma coisa (polêêêêmica) sobre esse problema do fizzbuzz e o uso de classes: no uso geral e em última instância, classe é para representar objetos que guardam estado. Esse não é o caso, penso, para isso. Mas talvez seja uma "imposição da linguagem"? De qualquer forma, ficou legal e uma boa discussão.

jonataa commented 5 years ago

Valeu, @matheuscas ! Também gosto das constantes. É que por um momento achei que não fosse tão necessário assim no caso do FizzBuzz, uma parte talvez seja por esse lance do estado que vc mencionou e das funções serem independentes.

Quanto ao uso ou não da classe, na verdade nem pensei sobre isso. Simplesmente implementei, mas realmente não precisa. Poderia ser um conjunto de funções dentro de um namespace, PHP permite isso.

<?php

use function My\Full\functionName;

functionName();
cleristonos commented 5 years ago

Haha, bom ponto @matheuscas eu só acho que nesse caso vale pelo estudo. Fazer o desafio pelo algoritmo ou como uma lib daria para ser bem mais simples. Podemos propor desafios arquiteturais depois...

jonataa commented 5 years ago

Galera, obrigado pelo review! Vocês foram 💯

Só falta o approve 😄