最近になって、処理の共通化とは、「一つの関数がオールマイティになんでもこなすこと」ではなく、「関数が細かく分割されていて必要な物だけを呼び出せること」だと気がついた。
例えば、よくある掲示板の記事投稿で、新規投稿と編集には共通の処理が多いと考え、無駄がなくなるように一つの処理でまとめて扱おうとして機能を追加しているうちに、こんな感じになることがある。
if(パラメータ入力あり){
...
パラメータチェック処理
...
if(新規投稿){
...
重複投稿チェック処理
...
}else{
#編集
...
既存データ存在チェック処理
...
}
}
if(エラー無し and パラメータ入力あり){
if(新規投稿){
...
新規レコード作成処理
...
}
...
保存処理
...
}
...
記事表示処理
...
if(パラメータ入力あり){
if(新規投稿){
...
新規投稿完了表示処理
...
}else{
...
編集完了表示処理
...
}
}
もう、何がなんだかさっぱりだ。こんなときはifで場合分けするのではなく、本当に共通となる最小部分を全て関数化して、3つの処理に分けた方が見通しがつきやすくなる。
【表示】
記事表示関数();
【新規】
パラメータチェック関数();
重複投稿チェック関数();
if(エラー無し){
新規レコード作成関数();
保存関数();
}
記事表示関数();
新規投稿完了表示関数();
【編集】
パラメータチェック関数();
既存データ存在チェック関数();
if(エラー無し){
保存関数();
}
記事表示関数();
編集完了表示関数();