List 4 對List 3的菜單項進行修正
這樣,需要的信息都能夠包含在數組裡了。
構建菜單的方法是,通過檢查被選擇的菜單對象的FromHour的值,如果與現在時間相比小,就把該菜單項顯示出來。
這麼看來,這個code如果按照YAGNI*的原則來看的話就比較完善了,這樣的代碼也屬於良品了。
* YAGNI是“You Aren't Going to Need It.”的簡寫,意思是:或許是必要的功能實際上並不必要的可能性非常高。一句話,為未知的未來而事先准備的代碼,基本上是沒用的。這樣的教訓很多。
但是,這個代碼來應對需求變更的要求,恐怕還太脆弱。例如,條件如果從19點改為19點半,就沒法辦了。或者要求設置個結束時間,或者是個時間段的話,或是根據星期幾而變動,這種要求實在是太多了。
琢磨了一下要求,加入能夠指定條件的代碼,修正後如下:
1public delegate bool SimpleMenuAvailability();
2
3public class MenuItemC
4{
5 public readonly string Name;
6 public readonly SimpleMenuAction Action;
7 // 判斷現在是否是有效菜單項
8 public readonly SimpleMenuAvailability IsAvailable;
9
10 public MenuItemC(string name, SimpleMenuAction action, SimpleMenuAvailability isAvailable)
11 {
12 Name = name;
13 Action = action;
14 IsAvailable = isAvailable;
15 }
16}
17
List5 加上條件的菜單定義
如果使用匿名方法,數組就要改寫成如下:
Menu
1private static MenuItemC[] MenuItems3 =
2 {
3 new MenuItemC(
4 "選擇1", 執行方法, delegate() { return true; }),
5 new MenuItemC(
6 "選擇2", 執行方法, delegate() { return true; }),
7 new MenuItemC(
8 "選擇3", 執行方法, delegate() { return true; }),
9 new MenuItemC(
10 "選擇4", 執行方法, delegate() { return DateTime.Now.Hour >= 19; } ),
11 };
12