Не совсем понятно, о чем вы спрашиваете здесь. Ваш псевдокод показывает метод Login (), вызываемый в конструкторе вашего класса. Если ваш код работает именно так, то для предотвращения повторного вызова Login вам необходимо избегать создания новых экземпляров этого класса.
Тем не менее, я думаю, что вы действительно спрашиваете об анти-паттерне Arrow:
http://codinghorror.com/blog/2006/01/flattening-arrow-code.html
EDIT
Я пытался избежать копирования и вставки, но так как исходное сообщение, кажется, не было достаточно ясным, вот выбор из Coding Horror, как указано выше:
Где это уместно, я выравниваю код стрелки, выполняя следующее:
Заменить условия защитными оговорками. Этот код ..
if (SomeNe Необходимое Условие) {
// код тела функции
} * * Тысяча двадцать-один
.. лучше работает как пункт охраны:
if (! SomeNe Необходимое Условие)
{
бросить новое RequiredConditionMissingException;
}
// код тела функции
(обратите внимание, что есть и другие техники, перечисленные в списке, но я думаю, что этой первой пока хватит)
Таким образом, каждая дополнительная проверка не приводит к другой вложенности, если - если одна из проверок не пройдена, вызов метода завершится неудачно. Это также можно сделать, не вызывая исключения, вызвав button1_Click для вызова функции, которая возвращает bool (true для успеха, false для ошибки) и немедленно возвращает false в случае сбоя:
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;
}