2011-10-27 124 views
-1

我有一种情况,我调用层叠样式的函数/方法。请参阅以下示例以了解说明和问题。我希望我知道这种情况的一些技术词汇。人们会更容易理解我在说什么。调用层次结构问题

public static class test 
{ 
    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     if (Login("johndoe","password")) 
     { 
      if(checkForSomething("johndoe")) 
      { 
       DoOpenDashboard(); 

       // Now it opens dashboard, it has several buttons. 
       // Each button does several different things 
       // On this example I am just giving you two level of hierarchy 
       // but in my actual program, there are 7 levels. 
      } 
     } 
    } 

    public static bool Login(string userid, string password) 
    { 
     //valid user 
     return true; 
    } 

    public static bool checkForSomething(string userid) 
    { 
     return true; 
    } 

如果child方法运行成功,我该如何避免进程返回到上一个调用方法/函数?

例如,登录方法正在调用checkForSomething("johndoe")。如果通过checkForSomething("johndoe"),则它将通过调用DoOpenDashboard打开仪表板窗口。此时我的流程不应该返回到checkforsoemthing,然后登录。我希望这是有道理的。

+0

你不能有一个包含它的类的名字相同的方法。 –

+0

你的问题很难理解。你能不能仅仅为你的类添加一个静态变量或者实例成员来指示你的用户是否已经登录了,如果这个布尔值的值是false,你只能调用'Login()'? –

+0

请在代码块外面移动问题......现在不可能读取它。 –

回答

0

对此问题不太清楚。你的伪代码显示你的类的构造函数中调用的Login()方法。如果这真的是你的代码的工作方式,那么为了防止再次调用Login,你需要避免创建这个类的新实例。

不过,我觉得你真的问的是箭反模式:

http://codinghorror.com/blog/2006/01/flattening-arrow-code.html

编辑

我试图避免复制&粘贴,但由于原来的职位似乎没有足够清楚,这是从上面链接的编码恐怖的选择:

在适当的情况下,我通过执行以下步骤将箭头代码弄平:

  1. 用guard子句替换条件。此代码..

    如果(SomeNecessaryCondition){// 函数体代码 }

    ..效果更好的保护条款:(!SomeNecessaryCondition)

    如果 { 抛出新RequiredConditionMissingException; } // 函数体代码

(请注意,还有其他技术也上市,但我认为,这第一个就足够了现在)

这样,每个额外的检查没有按不会导致另一个嵌套if - 一旦检查失败,方法调用失败。

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    if (AllSystemsGo()) 
    { 
     DoOpenDashboard(); 
    } 
} 

private bool AllSystemsGo() 
{ 
    if (!Login("johndoe","password")) 
     return false; 

    if (checkForSomethingEvil("johndoe")) 
     return false; 

    if (!checkForSomethingImportant()) 
     return false; 

    return true; 
} 
+1

它不是一个构造函数,它只是一个与类相同名称的方法(注意它有一个返回类型)。 – R0MANARMY

+0

这显然不是一个或另一个。显然这不是编译代码,而且你的猜测和我的一样好,无论返回值是错误还是方法名称都是错误的。 – sq33G

+0

我正在使用“扁平化箭头代码”中所述的确认检查,只要有可能。我从代码vb6代码中提取业务逻辑。由于我正在提取和理解业务逻辑,因此我陷入了可怕的境地。 – Shai

0

你是否努力确保:这也可以不具有的button1_Click调用返回一个布尔值(真成功的,虚假的失败),并立即在故障状态返回假的函数抛出异常完成你的方法只被检查一次?也许你需要多次查询一些属性,但只测试一次。

private bool? canLogin; 
private bool? somethingOk; 

private bool CanLogin 
{ 
    get 
    { 
     if (canLogin == null) 
      canLogin = Login("johndoe","password"); 
     return canLogin.Value; 
    } 
} 

private bool SomethingOk 
{ 
    get 
    { 
     if (somethingOk == null) 
      somethingOk = checkForSomething("johndoe"); 
     return somethingOk .Value; 
    } 
} 

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    if (this.CanLogin && this.SomethingOk && // other checks) 
    { 
     DoOpenDashboard();    
    } 
}