也谈需求变化的应对
看到很多人太需求变化,我也谈一下,凑个热闹。
举个例子:
比如有一个程序要用combox显示一个列表。列表内容是X1、X2、X3。程序中会根据X1,X2,X3判断做一些处理。
参考代码如下:
代码
int value = comboBox1.SelectedIndex;
switch (value)
{
case 0:
MessageBox.Show("x1");
break;
case 1:
MessageBox.Show("x2");
break;
case 2:
MessageBox.Show("x3");
break;
}
int value = comboBox1.SelectedIndex;
switch (value)
{
case 0:
MessageBox.Show("x1");
break;
case 1:
MessageBox.Show("x2");
break;
case 2:
MessageBox.Show("x3");
break;
}
用户使用过一段时间后,需要增加列表内容:比如增加X4,X5。那么上述程序就要改成:
代码
int value = comboBox1.SelectedIndex;
switch (value)
{
case 0:
MessageBox.Show("x1");
break;
case 1:
MessageBox.Show("x2");
break;
case 2:
MessageBox.Show("x3");
break;
//v2.0 add 支持x4,x5
case 3:
MessageBox.Show("x4");
break;
case 4:
MessageBox.Show("x5");
break;
}
switch (value)
{
case 0:
MessageBox.Show("x1");
break;
case 1:
MessageBox.Show("x2");
break;
case 2:
MessageBox.Show("x3");
break;
//v2.0 add 支持x4,x5
case 3:
MessageBox.Show("x4");
break;
case 4:
MessageBox.Show("x5");
break;
}
维护代码,风格好点的会写点注释。
这样的方式可以一直延续下去,用户不断增加需求,程序员不断修改代码。但是,有没有更好的方案呢?我相信博客园的高手众多,肯定又很多很好的方案。我想的方案是这样的:
代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<ObjectHolder> list = new List<ObjectHolder>();
list.Add(new ObjectHolder(0,"test1"));
list.Add(new ObjectHolder(0,"test1"));
list.Add(new ObjectHolder(0,"test1"));
comboBox1.DataSource = list;
}
private void button1_Click(object sender, EventArgs e)
{
//int value = comboBox1.SelectedIndex;
//switch (value)
//{
// case 0:
// MessageBox.Show("x1");
// break;
// case 1:
// MessageBox.Show("x2");
// break;
// case 2:
// MessageBox.Show("x3");
// break;
// //v2.0 add 支持x4,x5
// case 3:
// MessageBox.Show("x4");
// break;
// case 4:
// MessageBox.Show("x5");
// break;
//}
// V3.0 重构
ObjectHolder selectObject = comboBox1.SelectedItem as ObjectHolder;
selectObject.DoWork();
}
}
class ObjectHolder
{
public int value;
public string caption;
public ObjectHolder(int value, string caption)
{
this.value = value;
this.caption = caption;
}
public override string ToString()
{
return caption;
}
public void DoWork()
{
MessageBox.Show(this.caption);
}
}
{
public Form1()
{
InitializeComponent();
List<ObjectHolder> list = new List<ObjectHolder>();
list.Add(new ObjectHolder(0,"test1"));
list.Add(new ObjectHolder(0,"test1"));
list.Add(new ObjectHolder(0,"test1"));
comboBox1.DataSource = list;
}
private void button1_Click(object sender, EventArgs e)
{
//int value = comboBox1.SelectedIndex;
//switch (value)
//{
// case 0:
// MessageBox.Show("x1");
// break;
// case 1:
// MessageBox.Show("x2");
// break;
// case 2:
// MessageBox.Show("x3");
// break;
// //v2.0 add 支持x4,x5
// case 3:
// MessageBox.Show("x4");
// break;
// case 4:
// MessageBox.Show("x5");
// break;
//}
// V3.0 重构
ObjectHolder selectObject = comboBox1.SelectedItem as ObjectHolder;
selectObject.DoWork();
}
}
class ObjectHolder
{
public int value;
public string caption;
public ObjectHolder(int value, string caption)
{
this.value = value;
this.caption = caption;
}
public override string ToString()
{
return caption;
}
public void DoWork()
{
MessageBox.Show(this.caption);
}
}
引入对象的方法来解决。将来如果变化仍然频繁,可以考虑把combox列表配置成外部文件,如:XML。Table等等。
说了这么多,我觉得就是敏捷里面的一个核心思想,拥抱变化。通过重构来不断进化你的程序架构。这样,始终保持你的程序健壮性。又不至于过度设计。
当然,上面的例子可能有些过于简单,第一个版本就设计成对象的方式也未尝不可。只是,如果复杂的例子,能够经历过这样的演进过程会让程序变化更平稳。