プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #47 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


今回の動画で実装したソースコード

以下が今回実装したソースコードです。

UnixTime について

UnixTime についての説明は以下です。

UNIX時間 - Wikipedia

UnixTimeが 0 になることはないので、以下の validateMemo() の引数である memoId に 0 を指定するということは、

 function validateMemo(title, body, errorHTMLElement, memoId) {
    errorHTMLElement.innerHTML = ""
    if (title.length < 1 || title.length > 30) {
      errorHTMLElement.innerHTML = "タイトルの文字数は1文字以上30文字以下にしてください。<br>"
    }

以下の "if (tr.id == memoId)" の分岐を絶対に通らないことになります。 メモを登録する際のバリデーションではこの比較は不要なので、常に実行されないように(return に入らないように)0 を指定しています。

if (memoList.children.length > 0) {
      Array.from(memoList.children).forEach((tr) => {
        if (tr.id == memoId) {
          return
        }

重複を関数に切り出す

動画ではメモのバリデーションを関数に切り出すことでプログラミング上の重複を排除しました。 バリデーションを切り出した関数は以下です。 切り出したプログラムに必要な値を引数として用意しました。 こうすることでプログラムを柔軟に切り出すことができます。

  function validateMemo(title, body, errorHTMLElement, memoId) {
    errorHTMLElement.innerHTML = ""
    if (title.length < 1 || title.length > 30) {
      errorHTMLElement.innerHTML = "タイトルの文字数は1文字以上30文字以下にしてください。<br>"
    }

    if (body.length < 1 || body.length > 100) {
      errorHTMLElement.innerHTML = errorHTMLElement.innerHTML + "本文の文字数は1文字以上100文字以下にしてください。<br>"
    }

    if (memoList.children.length > 0) {
      Array.from(memoList.children).forEach((tr) => {
        if (tr.id == memoId) {
          return
        }

        const t = getIdTitleInMemoList(tr.id).innerText
        if (title == t) {
          errorHTMLElement.innerHTML = errorHTMLElement.innerHTML + "すでに登録済みのタイトルです。<br>"
        }
      })
    }

    if (errorHTMLElement.innerHTML.length > 0) {
      errorHTMLElement.style.display = ""
    }

    return
  }