以下のようなユーザからの入力 (JSON payload) があったとき...
{
"parameterA": "Enable",
"parameterB": "Disable",
...
}
-
入力が省略されていたパラメタがあった (
null
だった) 場合は、そのパラメタをそのデフォルト値で補完する。- 今回は、変数
defaultValues
に各パラメタのデフォルト値があらかじめ格納されているものとする。- 例:
parameterA
のデフォルト値はdefaultValues.ParameterA
に格納されている。
- 例:
- 今回は、変数
-
パラメタが入力されていたら、それが妥当な値かどうかを検証してから、それを格納する。
- 「妥当な値かどうかの検証」は、メソッド
ValidateParameterByType()
で行うものとする。- ここで、このメソッドを使用する際は、各パラメタに応じた Type を指定するものとする。
- 例:
parameterA
には、ParameterTypeEnum.TYPE_A
の Type を指定する。
- 例:
- ここで、このメソッドを使用する際は、各パラメタに応じた Type を指定するものとする。
- 「妥当な値かどうかの検証」は、メソッド
void GetValidatedParameters()
{
if (payload.parameterA == null)
{
// filled with its default value if the value of the payload is empty
this.ValidatedParameterA = defaultValues.ParameterA;
}
else
{
// filled with validated value if the value of the payload is not empty
this.ValidatedParameterA
= ValidateParameterByType(ParameterTypeEnum.TYPE_A, payload.parameterA);
}
if (payload.parameterB == null)
{
this.ValidatedParameterB = defaultValues.ParameterB;
}
else
{
this.ValidatedParameterB
= ValidateParameterByType(ParameterTypeEnum.TYPE_B, payload.parameterB);
}
/* And so on... */
}
- 各パラメタ間で共通処理っぽい部分があるので、
GetValidatedParameterCommon()
としてくくり出してみる。 - さらに、if/else 文が長く感じるので、三項演算子にしてみる。
void GetValidatedParameters()
{
this.ValidatedParameterA = GetValidatedParameterCommon(payload.parameterA,
defaultValues.ParameterA,
ParameterTypeEnum.TYPE_A);
this.ValidatedParameterB = GetValidatedParameterCommon(payload.parameterB,
defaultValues.ParameterB,
ParameterTypeEnum.TYPE_B);
/* And so on... */
}
private string GetValidatedParameterCommon(string payloadValue,
string defaultValue,
ParameterTypeEnum parameterType)
{
return payloadValue == null ? defaultValue
: ValidateParameterByType(parameterType, payloadValue);
}
GetValidatedParameters()
の部分で言うと...- コードが短くなった。
- 書く量が減るので、コーディングミスも減りそう。
- 処理がまとまっており、一覧性が高いので、コーディングミスにも気づきやすい。
- コードが短くなった。
GetValidatedParameterCommon()
の部分で言うと...- ロジックがシンプルになった。
- 「ここはパラメタAについての箇所だから、パラメタAのデフォルト値を使って...」などと頭を使わずに読む/書くことができるようになった。
- 三項演算子を使うかどうかは議論の余地があるかもしれない。
- このレベルであれば if/else 文でもいいのかもしれない。
- ロジックがシンプルになった。