de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Shai
Shai
質問

コール階層に関する問題

関数/メソッドをカスケーディングスタイルで呼び出す状況があります。説明と質問については、次の例を参照してください。私はこの状況の技術的な言葉を知りたがっています。人々が私が何を話しているのかを理解することはより簡単になります。

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;
    }

子メソッドが正常に実行された場合、以前の呼び出しメソッド/関数に戻るプロセスを回避するにはどうすればよいですか?

たとえば、ログインメソッドは checkForSomething( "johndoe")を呼び出しています。 checkForSomething( "johndoe")が渡された場合、DoOpenDashboardを呼び出してDashboardウィンドウを開きます。この時点で私のプロセスはcheckforsoemthingに戻り、ログインするべきではありません。それが理にかなってほしい。

-1 2011-10-27T20:14:40+00:00 2
Kirk Broadhurst
Kirk Broadhurst
編集された質問 28日 10月 2011 в 8:24
プログラミング
c#
hierarchy
class-design
sq33G
27日 10月 2011 в 8:25
2011-10-27T20:25:29+00:00
さらに
ソース
編集
#56792281

あなたがここで何を求めているのかは分かりません。あなたの疑似コードは、あなたのクラスのコンストラクタで呼び出されているLogin()メソッドを示しています。これが本当にあなたのコードがどのように動作しているのであれば、再びLoginを呼び出すのを防ぐために、このクラスの新しいインスタンスの作成を避ける必要があります。

しかし、私はあなたが本当に矢のアンチパターンについて尋ねていると思います:

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

EDIT

I was trying to avoid copy & paste, but since the original post seems not to have been clear enough, here's a selection from Coding Horror as linked above:

Where appropriate, I flatten that arrow code by doing the following:

  1. Replace conditions with guard clauses. This code..

    if (SomeNecessaryCondition) { //function body code }

    .. works better as a guard clause:

    if (!SomeNecessaryCondition) { throw new RequiredConditionMissingException; } //function body code

(他のテクニックも掲載されていることに注意してください。しかし、私はこの最初のもので十分でしょう)

このようにして、チェックが失敗すると、メソッド呼び出しが失敗した場合、それぞれの追加チェックで別のネストされたチェックが行われることはありません。これは、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;
}
0
0
Kirk Broadhurst
28日 10月 2011 в 8:33
2011-10-28T08:33:42+00:00
さらに
ソース
編集
#56792282

あなたのメソッドが一度だけチェックされていることを確認しようとしていますか?おそらく、いくつかのプロパティを複数回クエリする必要があるかもしれませんが、一度だけテストします。

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();            
    }
}
0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 1週間前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 2週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属