switch ((RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType)Enum.Parse(typeof(RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType), ihdType.Value))
{
//REF:This can (but should it?) be refactored through strategy pattern
case RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType.ReportPlanWithEffects:
grvEconomicCriteria.DataSource = RequestReportsCalculatingStoredProcedures.ReportsDataParser(
RequestReportsCalculatingStoredProcedures.ReportPlanWithEffects(requestNo, RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo(requestNo)));
break;
case RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType.ReportPlanWithEffectsForFacts:
DateTime factDate;
try
{
factDate = Convert.ToDateTime(ihdDate.Value);
}
catch(FormatException)
{
grvEconomicCriteria.DataSource = RequestReportsCalculatingStoredProcedures.ReportsDataParser(
RequestReportsCalculatingStoredProcedures.ReportPlanWithEffectsForFacts(requestNo, RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo(requestNo), DateTime.MinValue));
break;
}
grvEconomicCriteria.DataSource = RequestReportsCalculatingStoredProcedures.ReportsDataParser(
RequestReportsCalculatingStoredProcedures.ReportPlanWithEffectsForFacts(requestNo, RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo(requestNo), factDate));
break;
default:
break;
}
答案 0 :(得分:17)
对于很长的RequestReportsCalculatingStoredProcedures
类型,您始终可以使用an alias:
using RRCSP = RequestReportsCalculatingStoredProcedures;
注意:您需要在using
指令中使用完全限定名称(包括名称空间)。
答案 1 :(得分:11)
除了其他人关于缩短名称等的内容之外,您应该考虑将case语句中的代码提取到函数调用中,因此最终会得到像
这样的内容。switch (myMassiveVariable)
{
case RequestReportStoredProcedureType.ReportPlanWithEffects:
RunReportWithEffects(requestNo);
break;
case RequestReportStoredProcedureType.ReportPlanWithEffectsForFacts:
RunReportWithFacts(requestNo);
break;
}
这有助于整理一些事情。
答案 2 :(得分:5)
我坚信描述变量,类和方法名称。我总是选择明确而不是简洁,但是一个易于实施的规则是,如果你的名字的一部分总是重复,你可以将其削减。例如,您有:
RequestReportsCalculatingStoredProcedures
那很好。它解释了它是什么。但是,您已经拥有该类或对象的成员,这些成员或对象也以该名称开头,并在最后加上区分名称。例如:
RequestReportStoredProcedureType
这可以缩短为StoredProcedureType,甚至可以说是ProcedureType。
我知道很多程序员会争论像RRCalcSP或其他一些完全不明确的命名约定,但我绝不会牺牲命名清晰度以避免换行等。
老实说,你在原始例子中所拥有的并不是混乱或可耻的。只需要很长时间就可以处理换行问题了。
此外,慷慨地使用评论使事情变得更加清晰。
答案 3 :(得分:5)
老实说,这里最大的问题之一就是变量名的长度。
显然,你应该给变量/类型/等。描述性名称。但是有一点让它变得有点极端。我工作的一个人因为给出方法名称而臭名昭着:
DoSomethingVerySpecificHereIsOneOfItsSideEffectsAndHereIsAnother
在你的情况下,我注意到了大量的冗余。例如,您有一个名为RequestReportsCalculatingStoredProcedures
的类,然后在该类中,您似乎有一个名为RequestReportStoredProcedureType
的枚举。由于枚举已经是RequestReportsCalculatingStoredProcedures
中的嵌套类型,您可以将其称为Type
吗?
或者,非常缩短这些名称的有效方法(至少在此文件中)将使用简单的using
声明:
using E = RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType;
然后查看您的代码会发生什么:
using RRCSP = RequestReportsCalculatingStoredProcedures;
using E = RRCSP.RequestReportStoredProcedureType;
// ...
// Note: RRCSP = RequestReportsCalculatingStoredProcedures, and
// E = RRCSP.RequestReportStoredProcedureType
switch ((E)Enum.Parse(typeof(E), ihdType.Value))
{
//REF:This can (but should it?) be refactored through strategy pattern
case E.ReportPlanWithEffects:
grvEconomicCriteria.DataSource = RRCSP.ReportsDataParser(
RRCSP.ReportPlanWithEffects(
requestNo,
RRCSP.GetAlgorithmNoByRequestNo(requestNo)
)
);
break;
case E.ReportPlanWithEffectsForFacts:
DateTime factDate;
try
{
factDate = Convert.ToDateTime(ihdDate.Value);
}
catch(FormatException)
{
grvEconomicCriteria.DataSource = RRCSP.ReportsDataParser(
RRCSP.ReportPlanWithEffectsForFacts(
requestNo,
RRCSP.GetAlgorithmNoByRequestNo(requestNo),
DateTime.MinValue
)
);
break;
}
grvEconomicCriteria.DataSource = RRCSP.ReportsDataParser(
RRCSP.ReportPlanWithEffectsForFacts(
requestNo,
RRCSP.GetAlgorithmNoByRequestNo(requestNo),
factDate
)
);
break;
default:
break;
}
这更具可读性吗?在我看来,是的,主要是因为它看起来不那么令人生畏。显然,你正在做出权衡,因为你使用的别名比原始名称更明显 。就像其他一切一样,它最终归结为个人判断。
答案 4 :(得分:3)
如果你可以控制你正在使用的代码,我建议:
将枚举RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType带到外部作用域。内部名称已经足够冗长,您不需要外部名称来澄清。
尝试用明确其意图的名称替换长类名称,而不描述他们如何完成工作的详细信息。
提供不需要算法参数的RequestReportsCalculatingStoredProcedures.ReportPlanWithEffectsForFacts的重载,因为您无论如何都可以通过requestNo查找它。当您不需要提供非标准算法时,这消除了对RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo的详细调用。
答案 5 :(得分:2)
不可否认,这个答案正在利用这个问题的其他答案,但我认为让一些建议更明确是有帮助的。
RequestReportsCalculatingStoredProcedure类我将重命名为RequestReports。我的StoredProcedure部分似乎是一个没有其他人的业务实现细节。我不确定计算带来的是什么,所以我也删除了它。
枚举RequestReportStoredProcedureType我将重命名为ReportPlan,因为它似乎最适合上下文(ReportType也是可能的)。删除了额外的冗长,类似于重新命名包含它的类的原因。我把它留在了课堂里,因为它似乎提供了一些上下文,并且缩短名称这似乎是一个好主意。
从方法调用中删除算法参数的建议,因为它可以从已经传递的参数派生出来,看起来很好。
鉴于这些更改,代码将如下所示:
switch((RequestReports.ReportPlan)Enum.Parse(typeof(RequestReports.ReportPlan), ihdType.Value)) {
//REF:This can (but should it?) be refactored through strategy pattern
case RequestReports.ReportPlan.WithEffects:
Object reportPlan = RequestReports.ReportPlanWithEffects(requestNo);
grvEconomicCriteria.DataSource = RequestReports.ReportsDataParser(reportPlan);
break;
case RequestReports.ReportPlan.WithEffectsForFacts:
DateTime factDate;
try {
factDate = Convert.ToDateTime(ihdDate.Value);
}
catch(FormatException) {
Object reportPlan2 = RequestReports.ReportPlanWithEffectsForFacts(requestNo, DateTime.MinValue);
grvEconomicCriteria.DataSource = RequestReports.ReportsDataParser(reportPlan2);
break;
}
Object reportPlan3 = RequestReports.ReportPlanWithEffectsForFacts(requestNo, factDate);
grvEconomicCriteria.DataSource = RequestReports.ReportsDataParser(reportPlan3);
break;
default:
break;
}
答案 6 :(得分:1)
我也相信(没有检查过),但你可以做类似的事情:
RequestReportsCalculatingStoredProcedure myShortCut = RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType;
然后,您可以引用myShortCut
。
答案 7 :(得分:0)
您可以在评论时应用策略模式,或者使用基于类型的委托(Func<>或Action<>)的字典做某事。您可以使用DateTime.TryParse()方法缩短DateTime try / catch。除此之外,您的代码中最不可靠的是长名称,因此您可能希望在启动代码之前将其中一些置于变量中
希望有所帮助
答案 8 :(得分:0)
我主张从案例陈述中提取公共部分
RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType dependingOnType =(RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType)Enum.Parse(typeof(RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType), ihdType.Value);
var EssentialData = null;
var AlgorithmChosen = RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo(requestNo);
switch (dependingOnType)
{
//REF:This can (but should it?) be refactored through strategy pattern
case RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType.ReportPlanWithEffects:
EssentialData = RequestReportsCalculatingStoredProcedures.ReportPlanWithEffects(requestNo, AlgorithmChosen);
break;
case RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType.ReportPlanWithEffectsForFacts:
DateTime factDate = Datetime.MinValue;
if (!DateTime.TryParse(ihdDate.Value, factDate)) {
factDate = DateTime.MinValue;
}
EssentialData = RequestReportsCalculatingStoredProcedures.ReportPlanWithEffectsForFacts(requestNo, AlgorithmChosen, factDate);
break;
default:
break;
}
grvEconomicCriteria.DataSource = RequestReportsCalculatingStoredProcedures.ReportsDataParser(essentialData);
您可以通过计算
来更多地优化事件RequestReportsCalculatingStoredProcedures.GetAlgorithmNoByRequestNo(requestNo)
只有一次
编辑:像这样:)