2016-09-16 51 views
1

我目前有一个函数可以使用一个对象创建一个stringbuilder变量。使用多个函数来构建stringbuilder变量

我遇到的问题是功能现在非常长,我开始意识到我可以轻松地将其分解为多个功能,以提高可读性和可维护性。是否有任何理由不将它们分解成单独的功能?会有性能提升还是相反?

这是我使用的当前stringbuilder函数的一个较小版本(因为它大大超过300多行代码)。正如你所看到的,我可以根据每一行输入来分割功能:

private static StringBuilder GetObjectData(Object obj) 
{ 
    StringBuilder sb = new StringBuilder(); 

    sb.AppendLine(("TempClass;" + 
     obj.TempClass.TempValue + 
     obj.TempClass.TempValue1 + 
     obj.TempClass.TempValue2 + 
     obj.TempClass.TempValue3 + 
     obj.TempClass.TempValue4 + 
     obj.TempClass.TempValue5 + 
     obj.TempClass.TempValue6 + 
     obj.TempClass.TempValue7 + 
     obj.TempClass.TempValue8)); 

    sb.AppendLine(("TempClass2; + 
     obj.TempClass2.TempValue)); 

    sb.AppendLine(("TempClass3;" + 
     obj.TempClass3.TempValue)); 

    if (obj.TempClass3.TempValue != null && obj.TempClass3.TempValue1 != null) 
    { 
     sb.AppendLine(("TempClass3;" + 
      obj.TempClass3.TempValue + 
      obj.TempClass3.TempValue1)); 
    } 

    sb.AppendLine(("TempClass4;" + 
     obj.TempClass4.TempValue)); 

    foreach (string element in obj.TempClass5.TempValue) 
    { 
     sb.AppendLine(("TempClass5;" + element)); 
    } 
    return sb; 
} 

任何输入都非常感谢!

+8

你可能在http://codereview.stackexchange.com/有更好的运气了 – Brandon

+0

由于额外的函数调用,消耗的时间可能会有轻微(非常轻微的)增加。但是,与你所做的处理相比,它是非常小的,它是无关紧要的。可读性和可维护性应始终是第一个倾向。仅在出现问题时才担心性能。 – hatchet

+0

你调用这个函数多少次?如果它不是百万,那么没有太大的区别。 –

回答

1

您可以为每个子类使用ToStringBuilder(StringBuilder sb)方法。这将追加到它们传递StringBuilder的,那么你最好保持使用StringBuilder的,像这样的好处:

private static StringBuilder GetObjectData(MyObject obj) 
{ 
    StringBuilder sb = new StringBuilder(); 

    obj.ToStringBuilder(ref sb); 

    return sb; 
} 


class MyObject 
{ 
    MySubObject Object1; 
    MySubObject Object2; 

    public void ToStringBuilder(ref StringBuilder sb) 
    { 
     if (Object1 != null) 
     { 
      sb.AppendLine(Object1.ToStringBuilder(ref sb)); 
     } 

     if (Object2 != null) 
     { 
      sb.AppendLine(Object2.ToStringBuilder(ref sb)); 
     } 
    } 
} 


class MySubObject 
{ 
    object Field1; 
    object Field2; 

    public void ToStringBuilder(ref StringBuilder sb) 
    { 
     if (Field1 != null) 
     { 
      sb.AppendLine(Field1.ToString()); 
     } 

     if (Field2 != null) 
     { 
      sb.AppendLine(Field2.ToString()); 
     } 
    } 
} 
+0

这是一种方法,但实际上我有超过20个子类。并且会有不同的文件格式使用不同的字符串构建器,我将这个对象和子对象用作中性格式来读取和写出所有转换。所以不知道这是否是最好的解决方案。 – Baraa

+0

@Baraa如果你的一些类使用.ToString(),你可以用它来代替它们,并将它们的结果附加到StringBuilder上? –

+0

即使我走的是不同的路线,在技术上你的解决方案是我提出的问题的答案!谢谢! – Baraa

0

如果一个功能是帮助维护性和可读性,你一定要分手了这段代码。


如果你知道你要添加的所有参数/在你的类中的字段,你可以缩短代码(在技术上)一行:

myclass.GetType() 
    .GetProperties()   //or .GetFields() 
    .OrderBy(x => x.Name) 
    .Where(x => ....)   //optional 
    .Select(x => { sb.Append(x.GetValue(myclass).ToString()); return x; }) 
    .ToList(); 

有一个高的机会,这将降低你的表现,所以先做一些测试,如果它足够适合你。


还有#region somedescription + #endregion使您的代码更具可读性。

0

如果目标仅仅是获得一个任意对象的字符串表示你可以序列化对象到JSON:

private static StringBuilder GetObjectData(Object obj) 
{ 
    string json = JsonConvert.SerializeObject(obj); 

    return new StringBuilder(json); 
}