--- id: 587d7b8f367417b2b2512b60 title: Refatorar variáveis globais fora de funções challengeType: 1 forumTopicId: 301235 dashedName: refactor-global-variables-out-of-functions --- # --description-- Até agora vimos dois princípios diferentes de programação funcional: 1) Não altere variáveis ou objetos: crie novas variáveis ou objetos e os retorne, caso necessário, de uma função. Dica: escrever algo como `const newArr = arrVar` onde `arrVar` é um array não o copiará para a nova a variável, e sim apenas criará uma nova referência ao mesmo objeto. Então mudar um valor em `newArr` também o muda em `arrVar`. 2) Declare parâmetros de funções: qualquer computação dentro de uma função depende apenas dos argumentos passados a ela; nunca de uma variável ou objeto global. Incrementar um número em um não é tão divertido, mas podemos aplicar esses princípios ao trabalhar com arrays ou objetos mais complexos. # --instructions-- Reescreva o código de forma que o array global `bookList` não seja alterado em nenhuma das funções. A função `add` deve adicionar o nome do livro, `bookName` ao array passado e retornar um novo array. A função `remove` deve remover o `bookName` do array passado a ela. **Observação:** ambas as funções devem retornar um array e novos parâmetros devem ser adicionados antes do parâmetro `bookName`. # --hints-- `bookList` não deve ser alterado e precisa permanecer igual a `["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]`. ```js add(bookList, "Test"); remove(bookList, "The Hound of the Baskervilles"); assert( JSON.stringify(bookList) === JSON.stringify([ 'The Hound of the Baskervilles', 'On The Electrodynamics of Moving Bodies', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae' ]) ); ``` `add(bookList, "A Brief History of Time")` deve retornar `["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]`. ```js assert( JSON.stringify(add(bookList, "A Brief History of Time")) === JSON.stringify([ 'The Hound of the Baskervilles', 'On The Electrodynamics of Moving Bodies', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae', 'A Brief History of Time' ]) ); ``` `remove(bookList, "On The Electrodynamics of Moving Bodies")` deve retornar `["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]`. ```js assert( JSON.stringify(remove(bookList, 'On The Electrodynamics of Moving Bodies')) === JSON.stringify([ 'The Hound of the Baskervilles', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae' ]) ); ``` `remove(add(bookList, "A Brief History of Time"), "On The Electrodynamics of Moving Bodies");` deve ser igual a `["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]`. ```js assert( JSON.stringify(remove(add(bookList, 'A Brief History of Time'), 'On The Electrodynamics of Moving Bodies')) === JSON.stringify([ 'The Hound of the Baskervilles', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae', 'A Brief History of Time' ]) ); ``` # --seed-- ## --seed-contents-- ```js // The global variable const bookList = ["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]; // Change code below this line function add(bookName) { bookList.push(bookName); return bookList; // Change code above this line } // Change code below this line function remove(bookName) { const book_index = bookList.indexOf(bookName); if (book_index >= 0) { bookList.splice(book_index, 1); return bookList; // Change code above this line } } ``` # --solutions-- ```js // The global variable const bookList = ["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]; function add(bookList, bookName) { return [...bookList, bookName]; } function remove(bookList, bookName) { const bookListCopy = [...bookList]; const bookNameIndex = bookList.indexOf(bookName); if (bookNameIndex >= 0) { bookListCopy.splice(bookNameIndex, 1); } return bookListCopy; } ```