gpt4 book ai didi

c# - 部分类以避免实例化多个类为同一文件创建字符串

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:43 25 4
gpt4 key购买 nike

项目类型:从 ASP.NET 应用程序调用的 C# 类库框架版本:4.5.1

我一直在搜索部分类,我发现的所有引用资料都是代码味道,但我发现的所有引用资料都在谈论上帝类,而这不是。我需要帮助来确定适合这种情况的最佳方法。

我知道部分类通常用于设计器生成的代码,但是...我无法在下面列出的选项之间做出决定。我的带有部分类(class)的选项 2 真的是个坏主意吗?

我正在编写一个程序来创建非典型 CSV 文件,这意味着该文件不包含柱状数据。每行包含不同的数据和不同数量的列。

无论使用哪个选项,每个方法都需要访问两个数据集和一个 Document包含 public List<string> 的类每个方法都会向其中添加一行(字符串)。

我所知道的:

  • 每行都有一个非唯一的类型标识符,例如“H00”、“H10”、“D50”、“D55”...

  • 根据行类型标识符,每一行都有固定数量的列有些行与其他行相关,而另一些则不相关。

  • 大约有 25 种(给定或采用 5 种)类型的行,因此分部类中大约有 25 个文件,外加一个用于构造函数的文件。这个数字可能会增加,但最多不会超过 40。

我不想要的:

  • 一个大类,每种线型都有一个方法。

  • 一个大方法和一堆辅助方法。

选项 1:为每种线型创建一个单独的类。

选项 1 问题:这会创建大量类实例。

选项 2:创建一个名为“Line”的分部类,并为每个线型创建一个单独的 *.cs 文件,其中包含与其创建的线型相匹配的方法。对于这个示例,我想我会为在构造函数中初始化的数据集和文档使用类级别的属性。

选项 2:部分类被认为是一种代码味道,因为它们难以管理并使代码更加复杂。

典型方法,省略参数以保持此示例简单:

public class Document
{
//The document class would not be part of the partial class
//The document has other properties, I left them out to keep it simple
public List<string> Lines { get; set; }

public Document()
{
this.Lines = new List<string>
}
}

partial class LineMethods // file named: H01.cs
{
public void H01(DataSet ds1, DataSet ds2, Document doc)
{

string[] fields = new string[3];
fields[0] = "855";
fields[1] = "value from datatable";
fields[2] = "value from datatable";

string line = string.Join(",", fields);
doc.Lines.Add(line);
}
}

partial class LineMethods // File named: H10
{
public void H10(DataSet ds1, DataSet ds2, Document doc)
{
string[] fields = new string[27];
fields[0] = "855";
fields[10] = "other from datatable";
fields[16] = "other data";

//Line variable would be added to the "document.Lines.Add"
string line = string.Join(",", fields);
doc.Lines.Add(line);
}
}

选择答案后编辑:@Hristo,每个文件都需要执行每一行,有些方法需要不同的参数。正在创建的每条线路的要求都会发生变化。

是否需要一行的决定取决于其中一个数据集中的数据。例如,当我创建发票时,如果发票没有折扣,那么我不会创建折扣行,或者如果订单有运费,则确定是否要写运费行。我认为如果在创建该行的方法中决定此逻辑,那么编写和维护将是最容易的。如果不需要该行,则将返回零长度,并且该行将不会添加到 Doc.Lines

最佳答案

您应该问问自己,从长远来看,什么最易于管理。什么最容易阅读和维护。

解决方案 1:

我会这样走:

public class Document
{
//The document class would not be part of the partial class
//The document has other properties, I left them out to keep it simple
public List<string> Lines { get; set; }

public Document()
{
this.Lines = new List<string>
}
}

public interface ILine
{
string[] ProduceLine(DataSet ds1, DataSet ds2);
}

public class H01 : ILine
{
public string[] ProduceLine(DataSet ds1, DataSet ds2)
{
string[] fields = new string[3];
fields[0] = "855";
fields[1] = "value from datatable";
fields[2] = "value from datatable";

return fields;
}
}

public class H10 : ILine
{
public string ProduceLine(DataSet ds1, DataSet ds2)
{
string[] fields = new string[27];
fields[0] = "855";
fields[10] = "other from datatable";
fields[16] = "other data";

return fields;
}
}

var doc = new Document();

foreach (ILine line in lines)
{
doc.Lines.Add(string.Join(",", line.ProduceLine(ds1, ds2)));
}

编辑(来自哪里):

嗯,真的取决于你。最简单的例子:

var lines = new List<ILine>(new []
{
new H10(),
new H01()
});

如果您不必了解每一个实现并简单地让 Unity 将它们全部注入(inject)到您的构造函数中,那就更好了。但这实际上取决于您的业务案例。您如何确定要使用哪个实现?在所有情况下,您都需要吗?等等

例如:

public class MyWorker
{
// This would require that you setup Inversion of Control container and use it to resolve MyWorker.
// See: http://stackoverflow.com/questions/1961549/resolving-ienumerablet-with-unity
public MyWorker(IEnumerable<ILine> lines)
{
this.lines = lines;
}
}

解决方案 2:

或者,如果您真的喜欢您的部分构造,您可以像这样使用委托(delegate):

delegate string[] ProduceLine(DataSet ds1, DataSet ds2);

partial class LineMethods // file named: H01.cs
{
public string[] H01(DataSet ds1, DataSet ds2)
{
string[] fields = new string[3];
fields[0] = "855";
fields[1] = "value from datatable";
fields[2] = "value from datatable";

return fields;
}
}

partial class LineMethods // File named: H10
{
public string[] H10(DataSet ds1, DataSet ds2)
{
string[] fields = new string[27];
fields[0] = "855";
fields[10] = "other from datatable";
fields[16] = "other data";

return fields;
}
}

var h01Method = new ProduceLine(LineMethods.H01);
doc.Lines.Add(string.Join(",", h01Method.Invoke(ds1, ds2));

您决定什么更易于阅读和维护。

关于c# - 部分类以避免实例化多个类为同一文件创建字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42509472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com