gpt4 book ai didi

c# - 对象设计 : How to Organize/Structure a "Collection Class"

转载 作者:行者123 更新时间:2023-11-30 15:10:55 25 4
gpt4 key购买 nike

我目前正在努力理解我应该如何组织/构造一个我已经创建的类。该类执行以下操作:

  1. 作为构造函数的输入,它需要一组日志
  2. 在构造函数中,它通过一系列实现我的业务逻辑的算法来验证和过滤日志
  3. 完成所有过滤和验证后,它会返回有效和过滤日志的集合(列表),可以在 UI 中以图形方式呈现给用户。

这是一些描述我正在做的事情的简化代码:

class FilteredCollection
{
public FilteredCollection( SpecialArray<MyLog> myLog)
{
// validate inputs
// filter and validate logs in collection
// in end, FilteredLogs is ready for access
}
Public List<MyLog> FilteredLogs{ get; private set;}

}

但是,为了访问这个集合,我必须执行以下操作:

var filteredCollection = new FilteredCollection( specialArrayInput );
//Example of accessing data
filteredCollection.FilteredLogs[5].MyLogData;

其他关键输入:

  1. 我预见应用程序中只存在这些过滤集合中的一个(因此我应该将其设为静态类吗?或者也许是单例?)
  2. 创建对象的可测试性和灵 active 很重要(也许因此我应该将其保留为可测试的实例类?)
  3. 如果可能的话,我更愿意简化日志的取消引用,因为实际的变量名称很长,需要大约 60-80 个字符才能获取实际数据。
  4. 我试图让这个类保持简单,因为这个类的唯一目的是创建这个经过验证的数据集合。

我知道这里可能没有“完美”的解决方案,但我确实在努力通过这种设计提高我的技能,我将非常感谢这样做的建议。提前致谢。


编辑:

感谢所有回答者,Dynami Le-Savard 和 Heinzi 确定了我最终使用的方法 - 扩展方法。我最终创建了一个 MyLogsFilter 静态类

namespace MyNamespace.BusinessLogic.Filtering
{
public static class MyLogsFilter
{
public static IList<MyLog> Filter(this SpecialArray<MyLog> array)
{
// filter and validate logs in collection
// in end, return filtered logs, as an enumerable
}
}
}

我可以通过以下方式在代码中创建一个只读集合

IList<MyLog> filteredLogs = specialArrayInput.Filter(); 
ReadOnlyCollection<MyLog> readOnlyFilteredLogs = new ReadOnlyCollection<MyLog>(filteredLogs);

最佳答案

听起来您对日志做了三件事:

  1. 验证它们
  2. 过滤它们和
  3. 访问它们

您想将日志存储在一个集合中。标准的 List 集合非常适合,因为它不关心其中的内容,为您提供 LINQ 并允许您使用只读包装器锁定集合

我建议您将您的顾虑分为上述三个步骤。

考虑

interface ILog
{
MarkAsValid(bool isValid);
... whatever data you need to access...
}

将您的验证逻辑放在一个单独的接口(interface)类中

interface ILogValidator
{
Validate(ILog);
}

还有另一个过滤逻辑

interface ILogFilter
{
Accept(ILog);
}

然后使用 LINQ,类似于:

List<MyLog> myLogs = GetInitialListOfLogsFromSomeExternalSystem();
myLogs.ForEach(x => MyLogValidator(x));
List<MyLog> myFilteredLogs = myLogs.Where(x => MyLogFilter(x));

关注点分离使测试和可维护性变得更好。远离单例。由于包括可测试性在内的许多原因,它们不受青睐。

关于c# - 对象设计 : How to Organize/Structure a "Collection Class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909254/

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