##画面の表示値を利用することの問題点
元の値があるのに、表示名をロジックに組み込んだコードを見かけることがある。このコードの問題点は表示が変わった場合に、ロジックの修正をしなければいけない点である。サンプルコードで具体的に示す。
##サンプルコード
サンプルコードでは区分値(IsOk)がYesの場合、○を画面表示している。設計書に○の場合に太字にするという記載がある場合、作成されるコードは以下のようなコードになる。
尚、画面から区分値および、その表示値は取得できるものとする。
/** 区分値 **/
private enum IsOk
{
Yes,
No
}
public void Main()
{
// NG 画面表示に対して実装している。表示が○でなくなると修正が必要。
if (GetDisplay() == "○")
{
SetBold();
}
}
private IsOk GetValue()
{
// 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
return IsOk.Yes;
}
private string GetDisplay()
{
// 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
return "○";
}
private void SetBold()
{
// 文字を太字にする。コードは省略。
}
java
/** 区分値 **/
private enum IsOk {
YES, NO,
}
public void main() {
if (getDisplay() == "○") {
setBold();
}
}
private IsOk getValue() {
// 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
return IsOk.YES;
}
private String getDisplay() {
// 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
return "○";
}
private void setBold() {
// 文字を太字にする。コードは省略。
}
##問題点
サンプルコードの場合、表示を○から◎にすると、if文の中を修正する必要がある。画面の表示から切り離すためには、区分値を使用すればよい。
##リファクタリング後
/** 区分値 **/
private enum IsOk
{
Yes,
No
}
public void Main()
{
// OK 表示にかかわらずYesの場合は動作する。画面表示の影響は受けない。
if (GetValue() == IsOk.Yes)
{
SetBold();
}
}
private IsOk GetValue()
{
// 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
return IsOk.Yes;
}
private string GetDisplay()
{
// 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
return "○";
}
private void SetBold()
{
// 文字を太字にする。コードは省略。
}
java
/** 区分値 **/
private enum IsOk {
YES, NO,
}
public void main() {
if (getValue() == IsOk.YES) {
setBold();
}
}
private IsOk getValue() {
// 画面に設定されたフラグ値を取得する。ビルドのため、固定値になっている。
return IsOk.YES;
}
private String getDisplay() {
// 画面に設定されたフラグに対する表示値を取得する。ビルドのため、固定値になっている。
return "○";
}
private void setBold() {
// 文字を太字にする。コードは省略。
}