2021-12-6

耳にはするが意味がわかってなかった用語をまとめる

雑な技術メモ

耳にはするが意味をふんわりとは知っているがちゃんと理解していない用語がよくある。随時その用語と詳細を追加していく。

null安全

Null Pointer Exception を起こさないようにする仕組みのこと。

TypeScriptで言うところの以下のようなコード

const hoge: string[] | undefined = undefined

if (hoge.length === 0) someFunc() // <= コンパイルエラー

上記のコードはTypeScriptだと hoge.length をしている時点で string[] であることが確定していないのでコンパイルエラーとなる。これを回避するには以下のようにする必要がある。

const hoge: string[] | undefined = undefined

if (hoge !== undefined) {
  if (hoge.length === 0) someFunc() // <= コンパイルOK
}

TypeScriptを使っていると割と当然のように思える仕組みだが、このような仕組みがない言語だと List 型の変数に当然のように null が入っているケースがあり、nullチェックがないせいでランタイムエラーが発生するというのがよくあったみたい。

null安全でない言語は、もはやレガシー言語だ

参照透過性

関数の性質。引数で結果が一意に定まること。

以下の関数は参照透過性が無い。

const getCurrentUnixTime = () => {
  return Date.now()
}

(引数がそもそも無い上に、呼び出したタイミングによって結果が変わるので…)

参照透過性がないと、関数のテストが非常にやりにくくなる。今回の場合だと Date のモックをする必要がある。

以下のようにコードを修正すると、改善する。

const getUnixTime = (date: Date) => {
  return date.getTime()
}

const currentDate = new Date()
const currentUnixTime = getUnixTime(currentDate)
  • 現在のUnixTimeを取得する

という処理を

  • 現在時刻を取得する
  • 時刻をUnixTimeに変換する

という参照透過に出来る処理と出来ない処理に分割することで、テストしやすい部分を作り出せた。

現在時刻を取得する箇所に関してはテストしにくいのはどうしようもない。

関数型プログラムの紹介かつ自分用備忘録的なもの

冪等性

現在の状態に関わらず、何回実行しても実行後の状態が同じになること。

例えば、サーバー監視の有効/無効を制御する toggleServerMonitoring という処理があるとする。これは現在の状態に応じて実行後の状態は異なる。これは冪等性が「無い」。

冪等性が無いと困ることがある。一例として何らかの理由で同じ処理が複数回実行された際に予期せぬ結果になることがある。例えばHttpリクエストに失敗してリトライしたら、2回処理が実行された等。

今回のケースだと、 toggleServerMonitoring ではなく enableServerMonitoringdisableServerMonitoring の処理を用意しそれぞれ必要な方を叩けばいい。サーバーの監視を有効化したい際は enableServerMonitoring を実行し、そうすればリトライにより複数回実行されても「サーバーの監視が有効化されている」という状態になることは変わらない。

冪等性とは「同じ操作を何度繰り返しても、同じ結果が得られる性質」のこと

第一級関数・高階関数・コールバック関数

第一級関数

関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のこと
第一級関数

たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。
第一級オブジェクト

まとめると、「生成・代入・演算・引数戻り値としての受け渡しといった基本的な操作を制限なしに使用できる関数のこと」。関数が数値とかと同様に操作出来るのであれば第一級関数なので、JavaScriptの関数は第一級関数。C言語は関数ポインタにすれば基本的な操作が可能だが、関数ポインタという物を経由する必要があるからか第一級関数とみなされてはいない模様。

高階関数・コールバック関数

高階関数は「引数または戻り値に関数がある関数」のこと。コールバック関数は「関数の引数として指定された関数」のこと。

const highOrderFunction = (callbackFunction: () => void) => {
  // なんらかの処理

  callbackFunction()
}

TypeScriptのコードで言うと、上の highOrderFunction が高階関数で callbackFunction がコールバック関数。

レプリケーション(DB)

DBの複製のこと。

…で終わると「バックアップと何が違うの?」となるが、バックアップは日次バッチとかで行うがレプリケーションはリアルタイムで行う。RAID1をイメージしたらわかりやすい。

  • メリット
    • 障害が発生した際にスムースに切り替えられる
    • 参照系のパフォーマンスが上がる
  • デメリット
    • 更新系のパフォーマンスが落ちる

MySQL入門 レプリケーション編