複数のStringBuilder.Appendステートメントをリファクタリングする

今日、私はこの悪いコード構造を見て、それ以来、私はこのコードを持つこのメソッドを見るのは本当に面倒で恐ろしいと思っていました。コードは次のようになります:

StringBuilder body = new StringBuilder();       

            #region General
            body.Append("General information:");
            body.Append('*');
            body.Append('*');
            body.Append("Exception:         ");
            body.Append(m_ExceptionInfo.Exception.GetType().ToString());
            body.Append('*');
            body.Append("Message:           ");
            body.Append(m_ExceptionInfo.Exception.Message);
            body.Append('*');
            body.Append("Method:            ");
            body.Append(m_ExceptionInfo.GetMethodName(m_ExceptionInfo.Exception));
            body.Append('*');
            body.Append("Class:             ");
            body.Append(m_ExceptionInfo.GetClassName(m_ExceptionInfo.Exception));
            body.Append('*');
            body.Append("Assembly:          ");
            body.Append(m_ExceptionInfo.AssemblyName);
            body.Append('*');
            body.Append("App-Domain:        ");
            body.Append(m_ExceptionInfo.AppDomainName);
            body.Append('*');
            body.Append("Source-File:       ");
            body.Append(m_ExceptionInfo.GetFileName(m_ExceptionInfo.Exception));
            body.Append('*');
            body.Append("Line/Row:          ");
            body.Append(
                m_ExceptionInfo.GetFileLineNumber(m_ExceptionInfo.Exception).ToString(currentNumberFormatInfoProvider));

UIで表示されるエラーメッセージボックスの情報をカスタマイズするためにこれを行います。それで、私たちはそのような多くの情報を持つ文字列を準備しています。しかし、私には、このコードを見て、それをどのようにリファクタリングするか分からないと感じています。

どんな助けもありがとう!ありがとう

2
追加された 著者 JP Hellemons,
ところで、あなたの気持ちを悪くしないようにするには、 StringBuilder を使用します。それはデフォルト文字列連結よりはるかに優れています。
追加された 著者 JP Hellemons,
このコードについて、あなたに何を迷惑をかけているのですか?
追加された 著者 sq33G,
実際には、上記は私がここにあるものの半分に過ぎません。メソッドには50程度の文があります。ああ、愚かな開発者がそれを書いた方法を想像してください?まあ、体はそれを修正するように私に尋ねたが、私はそれを見て嫌い。プラス小さな変更、それはラインごとに慎重に見て私を蹴るのは難しいです。退屈な仕事!
追加された 著者 Zenwalker,

3 答え

StringBuilder.AppendFormat()メソッドを使用します。

StringBuilder body = new StringBuilder();    
body.AppendFormat("Exception: {0}, Message: {1}{2}Class: {3}, Assembly: {4}{5}", 
                            m_ExceptionInfo.Exception.GetType(),
                            m_ExceptionInfo.Exception.Message,
                            Environment.NewLine,                              
                            m_ExceptionInfo.GetClassName(...),
                            m_ExceptionInfo.AssemblyName,
                            Environment.NewLine);

body.AppendFormat("App-Domain: {0}, Source-File: {1}{2}",
                            m_ExceptionInfo.AppDomainName,
                            m_ExceptionInfo.GetFileName(...),
                            Environment.NewLine);
3
追加された
まあ私はすでにそれを見ても、それを使用しても、行の長さを増加させるAppendFormat()は、長時間にします。垂直成長から、これを使用すると水平に縮小されます。それで全部です。
追加された 著者 Zenwalker,
賢明に見えます。ありがとう:)
追加された 著者 Zenwalker,
@zenwalker:複数のAppnedFormat()呼び出しを使用できます
追加された 著者 sll,
AppendFormatを使用し、それらをテーマに結合します。 1つの例外メッセージの3行は、IMHO exagerationです。
追加された 著者 fixagon,

文字列ペアの単純なコレクションを作成し、それらを繰り返して実際の文字列を構築するのはなぜですか?例えば:

 Dictionary info = new Dictionary();
 info.Add("General information", "*");
 info.Add("Exception", m_ExceptionInfo.Exception.GetType().ToString());
 info.Add("Message",   m_ExceptionInfo.Exception.Message);
 //etc

 StringBuilder body = new StringBuilder();  
 foreach(KeyValuePair stringPair in info)
     body.AppendFormat("{0}:{1, 20}", stringPair.Key, stringPair.Value);
1
追加された
いいえ、半分の数があり、アラインメントについて心配する必要はありません
追加された 著者 GazTheDestroyer,
Dictionary.Addステートメントで繰り返しているAppend行の数と同じです。
追加された 著者 Zenwalker,

追加される情報のビットごとに意味のある名前を持つ別個のメソッドを作成すると、このメソッドはより良く見えるようになります。

private void AppendExceptionMessage(StringBuilder builder)
{
    builder.Append("Message:           ");
    builder.Append(m_ExceptionInfo.Exception.Message);
    builder.Append('*');
}

private void AppendMethodInfo(StringBuilder builder)
{
    builder.Append("Method:            ");
    builder.Append(m_ExceptionInfo.GetMethodName(m_ExceptionInfo.Exception));
    builder.Append('*');
}

body.Append("General information:");
body.Append('*');
body.Append('*');
AppendExceptionMessage(body);
AppendMethodInfo(body);
0
追加された
私はすでにそれについて考えましたが、問題は、私がいくつかの変更を行う必要があるたびに、この大きな混乱を詳細に見なければなりません。基本的に私はAppend行の数を減らすために探しています。
追加された 著者 Zenwalker,