質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

1765閲覧

「ある処理が実行できないなら例外を返す」関数の名前は?

KazuhiroHatano

総合スコア7802

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2018/03/10 09:34

編集2018/03/10 13:26

「ある処理が実行可能かを判定し、できないならその理由をメッセージに含めた例外を投げる」
だけのメソッドの名前はどうするのが良いでしょうか?

can...は真偽値を返すことを期待しますし
try...だと処理できるなら実行することを期待します
いまいちしっくりくる名前が思いつきません…


追記

実物とはかなり違いますが、大まかには下記のようなことをやろうとしてます

php

1 2class ClassRoom{ 3 public function try_reserve($student_id,$curriculum){ 4  //まずは生徒・教室・講師のいずれでもこの予約が問題ないかチェック 5  $student_obj=get_student_obj($student_id); 6 $student_obj->check_can_entry($this,$curriculum); 7 $this->check_can_reserve($curriculum); 8 $this->teacher->check_can_teach($student,$curriculum); 9 10 //いずれでも問題なければ予約に伴う処理をそれぞれ実行 11 $student_obj->entry($this,$curriculum); 12 $this->reserve($student,$curriculum); 13 $this->teacher->teach($student,$curriculum); 14 } 15 .... 16}

最初の判定条件は簡単だったので、各インスタンスのプロパティを参照して
判定する形にしてたのですが、度重なる仕様変更に対応した結果
条件判定部分だけで300行、処理部分合わせて400行、
can,has,isとかのメソッドをそれなりに使ってこの行数、これはやばい
インスタンス毎に条件判定処理も実行処理も分けないとテストもまともにできない

問題あったら例外スローするだけのメソッド?
そんなん書いたことない、名前どうしよう?
というような経緯です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2018/03/10 11:27

実行できるならどうするんですか?
KazuhiroHatano

2018/03/10 11:53

複数のインスタンスのすべてで処理の実行が可能であることが確認できて初めて処理を実行する、というようなことをしようとしています。
guest

回答4

0

ベストアンサー

例外を投げる

throwErrorFunction というところでしょうか。
しかしながら、

「ある処理が実行可能かを判定し、できないならその理由をメッセージに含めた例外を投げる」

このような関数を作る設計がどこかおかしい気がしています。
例外を返すだけなら関数化する必要性を感じません。

エラーメッセージを出力する

簡単に言えば授業予約システムで、生徒・講師・教室それぞれに予約可能条件と予約時の処理があり
それら全ての条件がクリアである場合のみそれぞれの予約時の処理を実行する
何か不備があればその旨をユーザーに知らせるメッセージを出力する

「例外を返す」ではなく、エラーメッセージを得たいのであれば、getErrorMessage でしょうか。

設計の見直し

関数呼び出ししてみて予約可能か確認しているように見受けられますが、「予約可能の確認処理」と「予約処理」は別個の関数に分離させるとすっきりするように感じます。

  1. 生徒・講師・教室それぞれに予約可能条件を確認する (checkReservationAll)
  2. エラーメッセージをまとめて出力 (outputError)
  3. エラーがなければ、まとめて実行する (reserveAll, reserveStudent, reserveTeacher, reserveClassRoom)

JavaScript

1'use strict'; 2/** 3 * 関数定義 4 */ 5function checkReservationAll () {} // 生徒、教師、教室を予約可能かチェックし、不可能ならエラーオブジェクトの配列を返す 6function outputError () {} // エラーメッセージを出力 7 8function reserveAll () { // 全予約処理(生徒、教師、教室)を実行 9 reserveStudent(); // 生徒の予約 10 reserveTeacher(); // 教師の予約 11 reserveClassRoom(); // 教室の予約 12} 13function reserveStudent () {} // 生徒の予約 // 生徒の予約 14function reserveTeacher () {} // 教師の予約 15function reserveClassRoom () {} // 教室の予約 16 17/** 18 * 実行処理 19 */ 20var errorList = checkReservationAll(); 21 22if (errorList) { 23 outputError(errorList); 24} 25 26reserveAll();

分かりやすさ重視で愚直に書きましたが、reserveAll は配列を繰り返し処理するとよりスマートだと思います。

Re: KazuhiroHatano さん

投稿2018/03/10 09:44

編集2018/03/10 12:24
think49

総合スコア18156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2018/03/10 09:52

回答ありがとうございます 複数の子孫インスタンスのすべてにおいて 任意のメソッドの処理実行が可能なことを確認した上で それぞれのメソッドを実行させる 処理不能であればその理由を取得する という感じのことをしたいのです 理由を取得したいというのがなければcan...でやってるところなんですが 判定条件が多くて、何でつまずいたかはちゃんと取得したいのです
think49

2018/03/10 11:17 編集

それは通常の「関数呼び出し」と何か違う動作がありますか。 例えば、JavaScriptの場合は関数呼び出しで例外があればコンソールにエラーメッセージが出力されます。 ですので、ただ関数呼び出しするだけで期待する動作となります。
KazuhiroHatano

2018/03/10 11:51

大きく外側にある処理でキャッチしてメッセージを出力します 簡単に言えば授業予約システムで、生徒・講師・教室それぞれに予約可能条件と予約時の処理があり それら全ての条件がクリアである場合のみそれぞれの予約時の処理を実行する 何か不備があればその旨をユーザーに知らせるメッセージを出力する といった感じです 予約処理の途中でつまずいて生徒・講師・教室のいずれかの予約時の処理だけが 行われる・行われないというようなことにはしたくないのです 例外をthrowでなくエラーオブジェクトをreturnというのでもいいのですが 結構処理が入れ子になってるので、エラーオブジェクトをリレーするのは ちょっと面倒なので例外をthrowという形にしています
think49

2018/03/10 12:16

親記事に追記しました。
guest

0

その手のチェック用メソッドの名前には、私の場合はensureをよく使います。ある処理をするための条件(データの妥当性など)を保証するという意味ですね。

投稿2018/03/10 13:56

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2018/03/11 13:35

回答ありがとうございます ensure、いいですね
guest

0

Iteratorなんかで考えると、

  • 次の要素を取り出せるか→次の要素があるか

→hasNext()メソッド
(あるかどうかのbooleanを返す)

  • 次の要素を取り出す→next()メソッド

(次の要素を返すが、存在しないなら例外発生)

というように、役割が分かれるべきでは?

今回の例で言うなら、処理するならシンプルに「処理する」旨のメソッド名にする。「処理させたいのに処理できない」から例外が発生するので、例外を発生させてその処理ができないことを伝えることまでメソッド名に織り込む必要はないはずです。

投稿2018/03/10 12:08

編集2018/03/10 12:11
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2018/03/11 13:40

一連の判定と処理が膨らみすぎたので分けようとしています、 しかし、判定処理の全てをクリアしなければいずれも実行処理してはならないというような感じなので クラス個々に判定メソッドと実行メソッドを持たせようとしています
guest

0

設計はともかくcheckでよいのでは?

〈…を〉(確認のため)調べる,点検する,照合する,〈…の〉性能[安全性(など)]を検査する;

https://ejje.weblio.jp/content/check

投稿2018/03/10 11:22

defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuhiroHatano

2018/03/10 12:10

回答ありがとうございます check、候補です その他候補はwil..l,willTo...,assert... will..がシンプルで意味合い的に結構いいかもとか思ってる感じです assertは意味的にもまあありって感じで、 なんかあったら例外投げるんだろうな というのもなんとなくわかっていいかなとか考えてます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問