- A, B, C のすべてがundefinedなら無視
- A, B, C のいずれかに値が入っていて、かつ、どれか一つにでもundefinedがあればエラー
- A, B, C の全てに値があれば問題ない(無視)
実際のケースではこういう状況は実務ではほぼ出てきません。
1番目は何も処理をしないのですぐに逃げる、
2番目はエラーを投げる、3番目は実際に実行。
この条件ならガード節を使って2秒で実装出来ますし、
そうなっていないなら、3つの引数が全てundefinedにも関わらず処理を継続しなければならない既存ロジックがおかしいケースが殆どです。
上流の方の流れを変えてやるほうが良いでしょう。
JavaScript
1const awesomeFunc = (a, b, c) => {
2 if (a === undefined && b === undefined && c === undefined) return;
3 if (a !== undefined) throw new Error('a is undefined.');
4 if (b !== undefined) throw new Error('b is undefined.');
5 if (c !== undefined) throw new Error('c is undefined.');
6 // main logic
7}
ここからは質問文に沿って動作させなければならない状況に遭遇したとして考えます。
過度なガード節はあまりよろしいものではありません。
あなたは数学の時間に、適当にありとあらゆる公式を連れてきて、
闇雲に計算してみて答えに近いものを解答用紙に書くような答え方をしていましたか?
そうではなく、適切な公式を持ってきて数式を綺麗な形に整形して回答していましたよね?
プログラミングの世界でもそれは同じです。
if文はただし書き、例外を取り扱うようなもので、
何の関数をいつ使うのかは上流の工程でしっかり制御するべきです。
つまり、質問文の状況に陥るのはそもそもプログラミングが下手だからでしょ?という結論になります。
どうしても初期の構想で動作しなければならないのであれば、
最低限、実行する関数と判定関数を分けましょう。
また実行しても良いか悪いかわからないのに、
とりあえず実行してみるなんて、
わけも分からず自爆スイッチを押すバカ職員です。
try-catchの構文は、ネットワーク通信やデータベースへの問い合わせ等、
プログラムのロジックが完璧に動作するにも関わらず、
エラーが帰ってきてやむを得ず挙動を修正しなければならないケースで用いられるべきものです。
関数として用意するならこんな感じ。
JavaScript
1const isPossible = (a, b, c) => {
2 if (a === undefined && b === undefined && c === undefined) return true;
3 if (a !== undefined || b !== undefined && c !== undefined) return false;
4 return true;
5}
6
7const awesomeFunc = (a, b, c) => {
8 // main logic
9}