清理嵌套的 if 语句以提高可读性?

Cleaning up nested if statements to be more readable?

我正在写一个项目,我现在正在做的部分是快速获得箭头形状。如何删除嵌套的 if 语句,但仍然具有相同的行为?

下面的代码现在看起来可能还不错,但我正计划重构以包含更多方法。

public async Task FirstDiffTestAsync()
{
    string folderDir = "../../../";
    string correctReportDir = folderDir + "Reports To Compare/Testing - Copy.pdf";
    string OptyNumber = "122906";

    //Making a POST call to generate report
    string result = ReportGeneration(OptyNumber).Result;
    Response reportResponse = JsonConvert.DeserializeObject<Response>(result);
    string newURL = reportResponse.documentUrl;

    //Logging the Response to a text file for tracking purposes
    await File.WriteAllTextAsync(Context.TestRunDirectory + "/REST_Response.txt", result);

    using (StreamWriter w = File.AppendText(Context.TestDir + "/../log.txt"))
    {
        //Checking if the Integration failed
        if (reportResponse.Error == null)
        {
            //now we have the url, reading in the pdf reports
            List<string> Files = new List<string> { correctReportDir, newURL };
            List<string> parsedText = PdfToParsedText(Files);

            DiffPaneModel diff = InlineDiffBuilder.Diff(parsedText[0], parsedText[1]);

            // DiffReport is a customised object
            DiffReport diffReport = new DiffReport(correctReportDir, newURL);
            diffReport.RunDiffReport(diff);

            //In-test Logging
            string indent = "\n      - ";
            string logMsg = $"{indent}Opty Number: {OptyNumber}{indent}Activity Number: {reportResponse.ActivityNumber}{indent}File Name: {reportResponse.FileName}";
            if (diffReport.totalDiff != 0)
            {
                await File.WriteAllTextAsync(Context.TestRunDirectory + "/DiffReport.html", diffReport.htmlDiffHeader + diffReport.htmlDiffBody);
                logMsg += $"{indent}Different lines: {diffReport.insertCounter} Inserted, {diffReport.deleteCounter} Deleted";
            }
            LogTesting(logMsg, w);

            //Writing HTML report conditionally
            if (diffReport.totalDiff != 0)
            {
                await File.WriteAllTextAsync(Context.TestRunDirectory + "/DiffReport.html", diffReport.htmlDiffHeader + diffReport.htmlDiffBody);
            }
            Assert.IsTrue(diffReport.insertCounter + diffReport.deleteCounter == 0);
        }
        else
        {
            LogTesting($" Integration Failed: {reportResponse.Error}", w);
            Assert.IsNull(reportResponse.Error);
        }
    }
}

如评论中所述,缩进级别目前还不错,但尽可能减少缩进总是更好,尤其是当您重复相同的代码块时。

最好的方法是编写一个包含该代码块的单独函数,然后调用该函数而不是嵌套的 if 语句。

在你的情况下它会是这样的:

private async void checkTotalDiff(diffReport) {
      ...
}

您可以在参数中传递您可能需要的任何内容。这样在您的主代码中,您可以将 if 语句替换为 checkTotalDiff(diffReport) 并将 return (如果有)保存到变量中。

另请注意,我将 void 用于 return,但您可以根据函数 returns 更改类型。

我不认为这是嵌套过多 if-statements。没关系。否则,您可以执行以下操作(@Caius Jard 也建议):

public async Task FirstDiffTestAsync()
{
    string folderDir = "../../../";
    string correctReportDir = folderDir + "Reports To Compare/Testing - Copy.pdf";
    string OptyNumber = "122906";

    //Making a POST call to generate report
    string result = ReportGeneration(OptyNumber).Result;
    Response reportResponse = JsonConvert.DeserializeObject<Response>(result);
    
    //Checking if the Integration failed
    if (reportResponse.Error != null)
    {
        LogTesting($" Integration Failed: {reportResponse.Error}", w);
        Assert.IsNull(reportResponse.Error);
        return;
    }

    string newURL = reportResponse.documentUrl;

    //Logging the Response to a text file for tracking purposes
    await File.WriteAllTextAsync(Context.TestRunDirectory + "/REST_Response.txt", result);

    using (StreamWriter w = File.AppendText(Context.TestDir + "/../log.txt"))
    {
        //now we have the url, reading in the pdf reports
        List<string> Files = new List<string> { correctReportDir, newURL };
        List<string> parsedText = PdfToParsedText(Files);

        DiffPaneModel diff = InlineDiffBuilder.Diff(parsedText[0], parsedText[1]);

        // DiffReport is a customised object
        DiffReport diffReport = new DiffReport(correctReportDir, newURL);
        diffReport.RunDiffReport(diff);

        //In-test Logging
        string indent = "\n      - ";
        string logMsg = $"{indent}Opty Number: {OptyNumber}{indent}Activity Number: {reportResponse.ActivityNumber}{indent}File Name: {reportResponse.FileName}";
        if (diffReport.totalDiff != 0)
        {
            await File.WriteAllTextAsync(Context.TestRunDirectory + "/DiffReport.html", diffReport.htmlDiffHeader + diffReport.htmlDiffBody);
            logMsg += $"{indent}Different lines: {diffReport.insertCounter} Inserted, {diffReport.deleteCounter} Deleted";
        }
        LogTesting(logMsg, w);

        //Writing HTML report conditionally
        if (diffReport.totalDiff != 0)
        {
            await File.WriteAllTextAsync(Context.TestRunDirectory + "/DiffReport.html", diffReport.htmlDiffHeader + diffReport.htmlDiffBody);
        }
        Assert.IsTrue(diffReport.insertCounter + diffReport.deleteCounter == 0);
    }
}