こういう書き方どうなの?という話
Twitterで話したら反応頂いたのですがソース貼れないのでこちらで。後で追記する。
public class とある3人向けGame { /*略*/ public static enum RemovePlayerStatus { SUCCEEDED, GAME_ALREADY_STARTED, PLAYER_NOT_FOUND; } public RemovePlayerStatus removePlayer(String playerName) { if(this.gameStartedFlg) { System.out.println("既にゲーム開始している"); return RemovePlayerStatus.GAME_ALREADY_STARTED; } for(int i=0; i<this.playerCount(); i++) { if(this.players.get(i).equalsName(playerName)) { // 発見 this.players.remove(i); return RemovePlayerStatus.SUCCEEDED; } } return RemovePlayerStatus.PLAYER_NOT_FOUND; } public static enum GameStartStatus { SUCCEEDED, GAME_ALREADY_STARTED, PLAYERS_NOT_ENOUGH; } public GameStartStatus gameStart() { if(this.gameStartedFlg) { System.out.println("既にゲーム開始している"); return GameStartStatus.GAME_ALREADY_STARTED; } if(this.playerCount() != 3) { System.out.println("プレイヤー人数が足りない"); return GameStartStatus.PLAYERS_NOT_ENOUGH; } System.out.println("ゲームを開始する"); this.gameStartedFlg = true; return GameStartStatus.SUCCEEDED; } /*略*/ }
追記
上のコードでは、例えばgameStartメソッドは、ちゃんと席が3人埋まっていないと開始できない。
また、既に開始されてたら開始できない。
開始できたらtrue/できなければfalseを返すだと、開始できないときに一律falseになってしまい、できない理由が返せない。
開始できたら0/できなければ理由ごとに1,2,...では型安全でない。
というわけでenumにして、できる(SUCCEEDED)/できない理由を返すようにした。
これの問題点は、いちいちそういうメソッドごとにenumを用意しないといけない点です。
で、これどうなんかなーっていう話をtwitterでしたところ、
エラー処理なのだからきちんと例外を使って書くべきでは?という意見を頂いた。
こういう時に例外を使うべきなのかどうか、というのが難しいところだと思う。
というのは、例外をキャッチして何かできるかっていうと、この場合エラーメッセージを吐くくらいしか出来ない。
それから、例外というにはあまりに頻繁に出過ぎる気がする(gameStart()が成功する保証はどこにもない)。
まーそんなんで、まいどまいどメソッドごとに例外を作るのはあまりにコストな気がして、どうなんかなーという疑問でした。