设置
假设您有以下代码
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
//Add a LOT more items to result
return result;
}
问题
因为字典中有很多项目,所以我想将它们拆分。 但是...将字典传递给子方法(并将其返回给父方法)的“干净代码”方式是什么?以下选项的优点和缺点是什么?
可能的答案
选项1 :作为参数传递并返回字典
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
result = SubMethod1(result);
result = SubMethod2(result);
//And so on...
return result;
}
public Dictionary<string,string> SubMethod1(Dictionary<string,string> result){
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
return result;
}
选项2 :作为参数->最流行的答案
传递public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
SubMethod1(result);
SubMethod2(result);
//And so on...
return result;
}
public void SubMethod1(Dictionary<string,string> result){
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
}
选项3 :以参数“ ref”传递以指示字典中的更改
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
SubMethod1(ref result);
SubMethod2(ref result);
//And so on...
return result;
}
public void SubMethod1(ref Dictionary<string,string> result){
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
}
选项4 :返回Dictionary的新实例并合并字典
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
foreach(var pair in SubMethod1()){
result.Add(pair.Key, pair.Value);
}
foreach(var pair in SubMethod2()){
result.Add(pair.Key, pair.Value);
}
//And so on...
return result;
}
public Dictionary<string,string> SubMethod1(){
var result = new Dictionary<string,string>();
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
return result;
}
选项5 :扩展方法
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
result.SubMethod1();
result.SubMethod2();
//And so on...
return result;
}
public Dictionary<string,string> SubMethod1(this Dictionary<string,string> result){
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
return result;
}
选项6 :将字典作为类中的字段
private Dictionary<string,string> _settings = new Dictionary<string,string>();
public Dictionary<string,string> BuildSettings(){
SubMethod1();
SubMethod2();
//And so on...
return settings;
}
public void SubMethod1(){
settings.Add("key1","value1");
settings.Add("key2","value2");
//And so on...
}
选项7 :还有其他建议吗?
结果
我认为选项2最好,就像这里的大多数人所说的那样。 另外,我认为添加一个好的方法名称也可以帮助解决这个问题。
所以这应该是代码(在我看来):
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
AddUserSettingsTo(result);
AddCompanySettingsTo(result);
//And so on...
return result;
}
public void AddUserSettingsTo(Dictionary<string,string> result){
result.Add("key1","value1");
result.Add("key2","value2");
//And so on...
}
答案 0 :(得分:1)
如果键值对在编译时都是常量,则可以将它们全部写入JSON文件:
{"key1": "value1", "key2": "value2", ...}
并使用JSON.NET将其转换为字典。
string jsonFile = File.ReadAllLines(...);
var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonFile);
return dict; // you probably want to cache this. It may be to inefficient to read the file every time you call BuildSettings()
如果KVP不是常数,我认为选项2是最好的选择。或者,为Dictionary<string, string>
创建扩展方法,以便执行此操作:
result.AddBuildSettingsPart1();
result.AddBuildSettingsPart2();
result.AddBuildSettingsPart3();
答案 1 :(得分:-3)
只需将接口作为参数传递即可:
public Dictionary<string,string> BuildSettings(){
var result = new Dictionary<string,string>();
SubMethod1(result);
SubMethod2(result);
return result;
}
public void SubMethod1(IDictionary<string,string> dictionary)
{
dictionary.Add("key1","value1");
dictionary.Add("key2","value2");
}