個人的には結構悩むポイントだったりするので。

/**
 * 関数の中にバリデーションを持たせる場合
 */

doJob();

function doJob(data) {
  if (!validateData(data)) {
    // handle invalid data.
  } else {
    // do job.
  }
}

/**
 * 関数を呼び出す側でバリデーションを行う場合
 */

if (validateData(data)) {
  doJob(data);
}

function doJob(data) {
  // do job.
}

機能的な面でのそれぞれの利点と欠点は以下が考えられます。

  • 関数の中にバリデーションを持たせる場合
    • 利点:その関数が複数箇所で呼ばれる場合に、呼び出す側で何回もバリデーションを書く必要がない。
    • 欠点:その関数が、ある処理の中で複数回呼び出される(ループ処理など)時に、ループの1回目だけバリデーションすれば良いケースであっても毎回実行されることになりパフォーマンスが落ちる。
  • 関数を呼び出す側でバリデーションを行う場合
    • 利点欠点:上記の逆

調べてみると似たような質問がたくさんあります。

結局はその関数がどういう使われ方を意図しているのかという責務で判断しましょうということですね。

どうしても決めきれない場合、個人的には関数を呼び出す側でバリデーションを行う形をとる場合が多いです。