UGE*_*EEN 28 c# design-patterns goto
我有一个代码用于将我的应用程序资源更新为当前应用程序版本 应用程序更新后调用此代码.
int version = 1002; // current app version
switch(version)
{
case 1001:
updateTo1002();
goto case 1002;
case 1002:
updateTo1003();
goto case 1003;
case 1003:
updateTo1004();
goto case 1004;
break;
case 1004:
updateTo1005();
break;
}
Run Code Online (Sandbox Code Playgroud)
这里我们通过跳转到指定的case块来调用cascade方法.我想知道 - 在这种情况下,使用go(通常被视为这种不良做法!)是一种好习惯吗?我不想一个接一个地调用方法 - 像这样:
updateTo1002()
{
// do the job
updateTo1003();
}
updateTo1003()
{
// do the job
updateTo1004();
}
Run Code Online (Sandbox Code Playgroud)
有没有设计模式描述这样的问题?
小智 58
好吧,如果我们想要"面向对象",为什么不让对象做对话呢?
var updates = availableUpdates.Where(u => u.version > ver).OrderBy(u => u.version);
foreach (var update in updates) {
update.apply();
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 39
在示例中,版本正在增加并始终按顺序调用较早的版本.我认为if这里的一系列陈述可能更合适
if (version == 1001 ) {
updateTo1002();
}
if (version <= 1002) {
updateTo1003();
}
if (version <= 1003) {
updateTo1004();
}
if (version <= 1004) {
updateTo1005();
}
Run Code Online (Sandbox Code Playgroud)
有些人评论说,随着版本数量的增加,这种方法是不可维护的(想想50左右).在这种情况下,这是一个更容易维护的版本
private List<Tuple<int, Action>> m_upgradeList;
public Program()
{
m_upgradeList = new List<Tuple<int, Action>> {
Tuple.Create(1001, new Action(updateTo1002)),
Tuple.Create(1002, new Action(updateTo1003)),
Tuple.Create(1003, new Action(updateTo1004)),
Tuple.Create(1004, new Action(updateTo1005)),
};
}
public void Upgrade(int version)
{
foreach (var tuple in m_upgradeList)
{
if (version <= tuple.Item1)
{
tuple.Item2();
}
}
}
Run Code Online (Sandbox Code Playgroud)
goto总是被认为是不好的做法.如果你使用goto,通常很难阅读代码,你总是可以用不同的方式编写代码.
例如,您可以使用链表创建一系列方法和一些处理链的处理器类.(请参阅pst的答案以获得良好的例子.)它更加面向对象和可维护.或者如果你必须再添加一个方法调用beetween 1003和case 1004呢?
当然看到这个问题.
