関数型プログラミング: 関数からグローバル変数をリファクタリングする


  • これまで、関数型プログラミングの 2 つの異なる原則を見てきました:
  • 変数またはオブジェクトを変更しないでください.新しい変数とオブジェクトを作成し、必要に応じてそれらを関数から返します.
  • 関数パラメータの宣言 - 関数内の計算は、関数に渡された引数のみに依存し、グローバル オブジェクトや変数には依存しません.
  • コードを書き直して、グローバル配列 bookList がどちらの関数内でも変更されないようにします. add 関数は、渡された配列の末尾に指定された bookName を追加し、新しい配列 (リスト) を返す必要があります. remove 関数は、渡された配列から指定された bookName を削除する必要があります.
  • 注: どちらの関数も配列を返す必要があり、新しいパラメーターは bookName パラメーターの前に追加する必要があります.

  • var 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) {
      var book_index = bookList.indexOf(bookName);
      if (book_index >= 0) {
    
        bookList.splice(book_index, 1);
        return bookList;
    
        // Change code above this line
        }
    }
    
    var newBookList = add(bookList, 'A Brief History of Time');
    var newerBookList = remove(bookList, 'On The Electrodynamics of Moving Bodies');
    var newestBookList = remove(add(bookList, 'A Brief History of Time'), 'On The Electrodynamics of Moving Bodies');
    
    console.log(bookList);
    


  • 回答:

  • var bookList = ["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"];
    
    function add (books, bookName) {
      let copyBooks = [...books] <--- we used a copy of the array in our functions.
      copyBooks.push(bookName);
      return copyBooks ;
    
    }
    
    function remove (books, bookName) {
      let copyBooks = [...books]
      var book_index = copyBooks.indexOf(bookName); // <-- is just finding if the book exists in the copyBooks(bookList) in this case for `newestBookList` book_index would be on position 1.
      if (book_index >= 0) { // <-- (1 >= 0)
        copyBooks.splice(book_index, 1); // <-- (1, 1) removes 'On The Electrodynamics of Moving Bodies' 
        return copyBooks;
    
        }
    }
    
    var newBookList = add(bookList, 'A Brief History of Time');
    var newerBookList = remove(bookList, 'On The Electrodynamics of Moving Bodies');
    var newestBookList = remove(add(bookList, 'A Brief History of Time'), 'On The Electrodynamics of Moving Bodies');
    
    console.log(newestBookList); // will display ["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]