今天我正在从Nikhil Kothari的Facebook.NET API中查看一些代码。我只想看看他是如何在那里做一些事情的想法。
我遇到的其中一件事是对我来说似乎很奇怪的财产。
检查一下:
FacebookRequest.cs定义了一个属性,并将它在构造函数中设置为自定义类的新实例:
public FacebookRequest(FacebookSession session) {
....
_parameters = new FacebookRequestParameterList();
}
私人领域:
私人FacebookRequestParameterList _parameters;
和财产:
public FacebookRequestParameterList Parameters {
get {
return _parameters;
}
}
现在FacebookRequestParameterList实际上是一个通用词典,因为它继承了&扩展词典:
public sealed class FacebookRequestParameterList : Dictionary<string, string> {
...
}
确实如此,当您实例化FacebookRequest时,它会自动附带一个自动实例化的FacebookRequestParameterList类实例。所以Property实际上是返回一个FacebookRequestParameterList的实例。
这是正常的吗?我不认为我见过那么多。似乎偷偷摸摸地对我或这是这个标准的东西?这似乎是一种奇怪的方式。我不会发布这篇文章让他失望,但要明白这是标准还是偷偷摸摸/邪恶。
在我看来,要求开发人员通过FacebookRequest的构造函数传递FacebookRequestParameterList的实例会更好。然后通过在构造函数初始化后设置私有字段_parameters来处理它。为什么我认为这更好?因为那时开发人员确切地知道发生了什么。他们知道该类需要预先设置参数列表。只是通过适当的方式向我展示这样的实例似乎很奇怪。
我离开基地吗?
答案 0 :(得分:3)
我认为这根本不奇怪。它为客户端省去了必须实例化FacebookRequestParameterList
实例的麻烦,FacebookRequest
类保证_parameters
包含FacebookRequestParameterList
类的有效实例,并且isn' t null
。
客户端的方便性和类本身的对象有效性。
没有什么可看到的,人们,继续前进。
(编辑:澄清了第一段中的具体实例)
答案 1 :(得分:2)
用法完全有效。该类仅在内部使用Dictionary<string,string>
并将其作为属性公开。大概没有必要将预先编写的字典传递给构造函数。
更好的方法是将其公开为IDictionary<string,string>
而不是具体类的实例。
答案 2 :(得分:0)
你曾经使用过DataTable吗?实例化新的DataTable时,会自动拥有行和列的集合。是否必须实例化DataTable然后在您自己的行和列集合中传递它是否有意义?显然不是。他们已经在你身边,你可以根据自己的需要为他们添加东西。
(我刚刚选择了一个DataTable,因为我觉得这很容易理解。我相信还有很多其他的例子。)
答案 3 :(得分:0)
我这是正常的,而且不是偷偷摸摸的。由于公开的集合属性是只读的(您不能一次替换整个集合),它会向您保证您有一个要使用的实例(除非拥有的类使用它做了一些时髦的事情)。
我同意它可能是一个更好的设计,但我不知道API的其余部分,所以我无法评论在该上下文中是好还是坏 。一般来说,我同意,参数应该传入(并坦率地复制到另一个字典,因为会话对象似乎有某种生命周期)。
答案 4 :(得分:0)
我认为它没有任何问题。然后,您可以以非常直观的方式执行fbreq.Parameters["param"]="value"
之类的操作,同时要求在构造时提供字典可能会更加混乱(或分散注意力),并且您甚至可能在创建请求之前甚至都不知道所有参数。 / p>