我的函数从某个网页获取QueryString作为string
。
我需要把它包起来,检查一下,我必须使用什么策略。
现在我的代码看起来很丑陋(我想是这样):
public QueryStringParser(string QueryString)
{
if (string.IsNullOrEmpty(QueryString))
{
this._mode = Mode.First;
}
else if (QueryString.Contains(_FristFieldName) && !QueryString.Contains(_SecondFieldName))
{
this._mode = Mode.Second;
}
else if (!QueryString.Contains(_FristFieldName) && QueryString.Contains(_SecondFieldName))
{
this._mode = Mode.Third;
}
else
{
throw new ArgumentException("QueryString has wrong format");
}
}
一个QueryString中不能同时存在两个FieldNames。
如何将此代码更改为可读。
答案 0 :(得分:6)
我至少会在检查现有字段时删除一些重复内容:
public QueryStringParser(string QueryString) {
if (string.IsNullOrEmpty(QueryString))
this._mode = Mode.First;
else {
bool has_1st = QueryString.Contains(_FristFieldName);
bool has_2nd = QueryString.Contains(_SecondFieldName);
if ( has_1st && !has_2nd) this._mode = Mode.Second;
else if (!has_1st && has_2nd) this._mode = Mode.Third;
else
throw new ArgumentException("QueryString has wrong format");
}
}
答案 1 :(得分:3)
您可以将Mode的确定放入单独的方法并返回Mode值;这样你就可以消除if-else语句
public QueryStringParser(string QueryString)
{
this._mode = DetermineMode(QueryString);
}
private Mode DetermineMode(string QueryString)
{
// Input is NULL STRING
if (string.IsNullOrEmpty(QueryString))
return Mode.First;
bool hasFirst = QueryString.Contains(_FristFieldName);
bool hasSecond = !QueryString.Contains(_SecondFieldName);
// Query using FirstName
if (hasFirst && !hasSecond)
return Mode.Second;
//Query using SecondName
if (!hasFirst && hasSecond)
return Mode.Third;
//Insufficient info to Query data
throw new ArgumentException("QueryString has wrong format");
}
[编辑]删除了对字段名称存在的双重检查,改为使用变量。
答案 2 :(得分:2)
代码是可读的,您可以在常见条件下使用一些嵌套,以使部件更清晰。
您无法使用Switch,因为比较必须是静态值。
答案 3 :(得分:2)
它已经很好看了。
public QueryStringParser(string QueryString)
{
// Input is NULL STRING
if (string.IsNullOrEmpty(QueryString))
{
this._mode = Mode.First;
}
// Query using FirstName
else if (QueryString.Contains(_FristFieldName) &&
!QueryString.Contains(_SecondFieldName))
{
this._mode = Mode.Second;
}
//Query using SecondName
else if (!QueryString.Contains(_FristFieldName) &&
QueryString.Contains(_SecondFieldName))
{
this._mode = Mode.Third;
}
//Insufficient info to Query data
else
{
throw new ArgumentException("QueryString has wrong format");
}
}
我希望她现在看起来很漂亮......
古德纳克!!
答案 4 :(得分:1)
代码可读。您可以通过删除括号来缩短它,因为语句只有一行:
public QueryStringParser(string QueryString)
{
//check if string is empty
if (string.IsNullOrEmpty(QueryString))
this._mode = Mode.First;
else
{
bool hasFirst = QueryString.Contains(_FristFieldName);
bool hasSecond= QueryString.Contains(_SecondFieldName);
//check if string contains first field name but not second field name
if (hasFirst && !hasSecond)
this._mode = Mode.Second;
//check if string contains second field name but not first field name
else if (!hasFirst && hasSecond)
this._mode = Mode.Third;
//default - error
else
throw new ArgumentException("QueryString has wrong format");
}
}
此外 - 删除了对Contains方法的重复调用
我不建议使用任何速记操作符,因为这会使代码的可读性低得多。
最后 - 在线评论!
答案 5 :(得分:1)
使用像ReSharper或Refactor Pro这样的东西!帮助整理代码并鼓励良好实践。
答案 6 :(得分:0)
使用Switch case。