说我有自定义数据类。它只是以有意义的方式保存数据。
该课程可能如下:
class MyClass
{
public struct MyType
{
public string parameter;
public string data;
public string value;
}
public List<MyType> myTypeList= new List<MyType>();
}
假设我有一个程序可以创建许多这些类。通过解析许多文件来填充数据,并且List<MyType>
在抓取数据时将具有无限数量的项目。然后我在整个程序中以多种方式使用这些数据(创建文档,在GUI上显示等)。
当我添加到Parsing类的列表中时,我必须首先创建一个MyType
的新对象,然后将其添加到myTypeList
。因此解析类必须实际知道并使用内部对象类型。但是,一旦添加它,我就可以使用MyClass
的实例直接访问字段而不需要任何类型的知识。
如:
string myString = myClassInstance.myTypeList[0].parameter;
在MyClass
内部创建一个允许解析类在不知道底层类型的情况下传递数据的方法是否更好?如果是这样,最好的方法是什么?
我可以想到几种方法,我只是不知道它是否是最佳或正确的方法。我想它会更好地概括代码,但在添加数据时可能会更不易读。
编辑:添加因评论而产生的使用差异。
class MyParser
{
public List<MyClass> ParseFile(string[] lines)
{
List<MyClass> myClassInstance = new MyClass();
foreach(string line in lines)
{
MyType typeInstance = new MyType();
typeInstance.parameter = line.Substring(0, 1);
typeInstance.data = line.Substring(1, 1);
typeInstance.value = line.Substring(2, 1);
myClassInstance.myTypeList.Add(typeInstance);
}
}
}
Vs以上。类似的东西:
class MyParser
{
public List<MyClass> ParseFile(string[] lines)
{
List<MyClass> myClassInstance = new MyClass();
foreach(string line in lines)
{
myClassInstance.AddData(line.Substring(0, 1),
line.Substring(1, 1),
line.Substring(2, 1));
}
}
}
答案 0 :(得分:1)
不,最好将MyType
课分开。它有一个目的,代表它所代表的任何东西。如果它这样做那么它是完美的,不需要改变。 (查看Single Responsibility Principle。)
在大多数情况下,完全按照自己的意愿行事是有意义的。另一个类有自己的责任,需要一些输入 - 一个文件,一个SQL查询的结果等,并将它读入一个类或一组类。
有时候如果它变得复杂,最好再将其分解 - 也许一个类从文件读取而其他类将文件中的记录转换为类。但这通常是矫枉过正的。通常情况下,将它们分解为一个类中的单独方法通常就足够了。
我能想到的唯一一种情况是,一个类“拥有”解析某些东西的功能是使用int
或DateTime
之类的值类型或类似IpAddress
的类,其中字符串表示是如此常见的是,使用int.Parse(string)
或DateTime.Parse(string)
等方法是有意义的。但是对于像文件或SQL记录解析记录这样复杂的事情来说,这是没有意义的。