如何使此代码更具可读性?

时间:2010-10-21 13:20:12

标签: c# coding-style readability

我今天写了这篇文章,我感到很惭愧。我需要做些什么来使这些混乱的东西更准确和可读?

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;
    }

9 个答案:

答案 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)

如果你可以控制你正在使用的代码,我建议:

  1. 将枚举RequestReportsCalculatingStoredProcedures.RequestReportStoredProcedureType带到外部作用域。内部名称已经足够冗长,您不需要外部名称来澄清。

  2. 尝试用明确其意图的名称替换长类名称,而不描述他们如何完成工作的详细信息。

  3. 提供不需要算法参数的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)

查看using command

我也相信(没有检查过),但你可以做类似的事情:

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)

只有一次

编辑:像这样:)