gpt4 book ai didi

c# - 方法链接的最佳实践 ("return this")

转载 作者:太空狗 更新时间:2023-10-29 19:39:56 26 4
gpt4 key购买 nike

我有一个名为 DatabaseRow 的抽象类,在派生和构造之后,主要从 Load(object id) 方法加载。

我有很多代码创建类的新实例,从 ID 加载它,然后返回类。我想将这段代码简化为一行代码(为了简洁起见,有很多类只包含返回这些 Loaded 实例的属性列表)。

我可以想到两种方法,但对我来说都不“正确”。

1. 我可以在 Load 方法的末尾 return this; 并使用 return new Derived().Load (id);

2.我可以创建一个通用方法来返回一个加载的方法。

public static T LoadRow<T>(object id) where T : DatabaseRow, new()
{
T row = new T();
row.Load(id);
return row;
}

我见过一些其他代码使用与数字1相同的方法,但我从未见过任何有经验的开发人员推荐它,也没有遇到任何.NET框架中的方法做同样的事情,所以也许这不是最佳做法?

有没有人知道比这两个更好的其他解决方案?

解决方案:

在阅读了 SirViver 的回答和评论后,我意识到无论如何都需要缓存所有返回的属性。解决方案略有不同,但类似于选项 2(我不希望任何人提出这个答案,因为我没有解释这部分设计)

所有这些实例都将从数据库中另一列检索到的值加载(如果您愿意,可以使用数据库关系)。我没有尝试从这个值加载新实例,而是创建了一个方法来从列名加载实例并将加载的值缓存在字典中。这很好用,因为这是 DatabaseRow 类的主要功能之一。

    private Dictionary<string, DatabaseRow> linkedRows;

protected T GetLinkedRow<T>(string key) where T : DatabaseRow, new()
{
if (linkedRows.ContainsKey(key)) return (T)linkedRows[key];
else
{
T row = new T();
row.Load(this[key]);
linkedRows.Add(key, row);
return row;
}
}

最佳答案

就我个人而言,我认为将对对象实例产生实际副作用的方法调用链接起来是不好的做法。老实说,我认为这两个例子都是非常丑陋的“黑客”,其唯一目的是节省两行代码。我也不认为结果实际上更具可读性。

如果您希望立即加载记录,我可能宁愿提供一个构造函数变体,它采用您从中加载的 ID 并使对象在构造时自动填充自身,但当我考虑它时,我不会'老实说,一点也不费心——在一行中塞满更多信息不会产生更多可读性和可维护性的代码。

关于c# - 方法链接的最佳实践 ("return this"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6200509/

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