Refatorando código de forma marota

Eu tenho 1 aluno co-orientado, sim eu co-oriento diversos alunos em seus TCCs, de Estatística e sempre ajudo ele a refatorar sua funções porém hoje ele chegou com um desafio diferente:

function insertValueInArray(array,value) {  
  function insert (array) {
    var max = 100;
    var min = 1;
    return array.push(Math.floor(Math.random() * (max - min)) + min);
  }
  while(value!= 0){
    insert(array)
    console.log("value=>"+value);
   value--
 }
}
var arr = [];  

E a chamada para essa função ficou assim:

insertValueInArray(arr,10)  

Porém ele queria refatorar para chamar assim:

insertValueInArr(insert(10));  

Porém, PARA MIM, estava errada tanta a lógica como a nomenclatura das funções.

Como assim?

Simples meu caro gafanhoto! Vamos ler o que ele me disse no Facebook:

William Dias

Add números aleatórios no array a partir de um value e retornar esse novo Array com os numeros gerados  
Pensei em usar sparse mas não deu

Pra ficar função unaria teria que ficar tipo InsertValuesInArray(insert(array)), mas não consegui fazer direito  

Logo a ideia dele é:

Criar um ARRAY com valores randômicos.

Certo?

Então primeiramente precisamos mudar o nome da função e sua chamada para:

createRandomArray(10)  

Nesse caso então sabemos que iremos criar 1 Array de 10 posições com valores randômicos, correto?

Então refatoramos a função assim:

function createRandomArray(tamanho) {  
  function insert (array) {
    var max = 100;
    var min = 1;
    return array.push(Math.floor(Math.random() * (max - min)) + min);
  }
  while(value!= 0){
    insert(array)
    console.log("value=>"+value);
   value--
 }
}

Agora vamos refatorar a função para ela se basear no tamanho:

function createRandomArray(tamanho) {  
  while(tamanho != 0){
    insert(array)
    console.log("value=>"+tamanho);
   tamanho--
 }
  // function insert (array) {
  //   var max = 100;
  //   var min = 1;
  //   return array.push(Math.floor(Math.random() * (max - min)) + min);
  // }
}
createRandomArray(10)  

Agora como você deve ter percebido eu comentei a função insert pois ela está noemeada errôneamente.

Por quê?

Simplesmente porque a responsabilidade dela não deve ser inserir no Array mas sim gerar o valor randômico.

Sabendo disso podemos refatorar essa função para:

function createRandomArray(tamanho) {  
  var arr = [];
  function createRandomNumber() {
    var max = 100;
    var min = 1;
    return Math.floor(Math.random() * (max - min)) + min;
  }
  while(tamanho != 0){
    arr.push(createRandomNumber());
    console.log("value=>"+tamanho);
   tamanho--
 }
 return arr;
}

Podendo agora executar dessa forma:

createRandomArray(10)  

Mas isso ainda não está bom!

Você está louco Suissa?

Sim, mas isso não vem ao caso!

Pense aqui comigo:

Se criamos uma função para gerar números randômicos por que RAIOS ela está dentro de createRandomArray?

Consegue perceber que dessa forma não conseguimos reutilizar ela muito menos mudar facilmente o algoritmo de criação randômica?

Então agora ficou fácil né?!

Basta tirar createRandomNumber de dentro da função createRandomArray!

Então refatoramos assim:

function createRandomNumber() {  
  var max = 100;
  var min = 1;
  return Math.floor(Math.random() * (max - min)) + min;
}
function createRandomArray(tamanho, algoritmoCriacao) {  
  var arr = [];
  while(tamanho != 0){
    arr.push(algoritmoCriacao());
    console.log("value=>"+tamanho);
   tamanho--
 }
 return arr;
}

Agora perceba que eu mudei a assinatura da função createRandomArray:

function createRandomArray(qntidade, algoritmoCriacao)  

Onde ela além do tamanho também recebe algoritmoCriacao que será a função que geradora dos valores.

Fazendo isso agora executamos a função assim:

createRandomArray(10, createRandomNumber)  

Separando da função geradora do Array o algoritmo de criaçãõ dos seu valores, com isso deixando simples para mudar os valores do Array gerado, por exemplo um Array apenas de número pares ficaria assim:

function createEvenRandomNumbers() {  
  var max = 100;
  var min = 1;
  var random = Math.floor(Math.random() * (max - min)) + min
  console.log('random', random)
  if(!(random % 2)) return random;
  else return createEvenRandomNumbers();
}

Onde sua chamada ficará assim:

createRandomArray(10, createEvenRandomNumbers)  

Viu como é fácil refatorar seu código para deixar reusável?

Bom fica aqui mais uma dica de como refatorar e caso você se interesse mais por isso eu sempre gravo aulas dessa forma no curso do Be MEAN.

[UPDATE 01 de Julho]

Transformei esses códigos em módulos do NPM aqui: https://www.npmjs.com/~suissa.

Até a próxima!

Beijinho, beijinho, tchau, tchau

Comentários

comments powered by Disqus