1 つの関数に 1 つの責務、とはどういうことですか

長い関数を役目ごとに分ける例で答える問い。名前で 1 言で言えるか、変わる理由が 1 つか、を物差しにします。

こう聞かれます

  • 「1 つの関数に 1 つの責務、とはどういうことですか」
  • 「長い関数があったら、どう分けますか」
  • 「関数を分けすぎると、かえって読みにくくなりませんか」(裏から聞く形)

面接官が見ている点

  • 「短くする」ことと「役目で分ける」ことを区別しているか
  • 分けるかどうかを決める物差しを、自分の言葉で言えるか
  • 分けたあとも動きが変わっていないことを、どう確かめるかまで話せるか

短い答え

  • 1 つの関数には 1 つの仕事だけをさせ、その仕事を名前で 1 言で言える形にする、ということです。
  • 入力の確かめ、計算、表示の形づくりのように、変わる理由が違う仕事は別の関数に分けます。
  • 分けると、1 つの直しが届く範囲が狭くなり、部品ごとに試しやすく、ほかの所でも使い回せます。

少し詳しい答え

注文の文を作る処理を分ける

数量を確かめる、金額を出す、表示の文にする、の 3 つの仕事を、それぞれ関数に分けました。最後の関数は、3 つを順に呼ぶだけです。

JavaScript

function isValidQty(qty) {
  return Number.isInteger(qty)
    && qty > 0;
}

function total(price, qty) {
  return price * qty;
}

function toLabel(yen) {
  return yen + " 円";
}

function orderText(price, qty) {
  if (!isValidQty(qty)) {
    return "数量が正しくありません";
  }
  const yen = total(price, qty);
  return toLabel(yen);
}

console.log(orderText(300, 4));
console.log(orderText(300, 0));
1200 円
数量が正しくありません

「円の前にカンマを入れたい」となったら toLabel だけを、「数量は 99 個まで」となったら isValidQty だけを直せば済みます。1 つの関数に全部が入っていると、表示の直しのつもりで計算まで壊す、ということが起きます。

分けるかどうかの物差し

  • 名前で言えるか「〜して〜して〜する」と、名前に「と」が要るなら、仕事が 2 つ以上入っています
  • 変わる理由が 1 つか表示の決まりが変わったとき、計算の決まりが変わったときに、同じ関数を直すことになるなら分けどきです
  • 分けすぎない 1 か所でしか使わず、名前を付けても読みやすくならない数行まで、無理に分ける必要はありません

分けたあとは、分ける前と同じ入力で同じ答えが出るかを、テストや実際の操作で確かめます。

作った物と結ぶなら、たとえば「ポートフォリオで 100 行を超えたフォームの送信処理を、入力の確かめ、送信、結果の表示に分け、確かめの部分にだけテストを足しました」のように話します。

よくある間違い

  • 「1 つの関数は何行以内」と行数だけで話す物差しは行数ではなく、役目と変わる理由です
  • 何でも細かく分ける名前を付けても意味が増えない分け方は、読む人に行き来をさせるだけです
  • 分けたあとに確かめない分けるときに順番や条件を取り違えると、動きが変わります。分ける前後で同じ答えが出るかを確かめます

深掘りの問い

  • 「関数の外の値を書き換える関数は、どう扱いますか」計算だけをする関数と、保存や表示のように外を変える関数を分けると、計算の側を試しやすくなる、と答えます
  • 「長い関数を分けたら、動きが変わってしまいました。どう防ぎますか」先に今の動きを確かめるテストを書き、少しずつ分けては回す、と答えます
  • 「クラスや画面の部品でも同じ考え方を使いますか」使います。1 つの部品に 1 つの役目を持たせ、変わる理由ごとに分ける、と答えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る