Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何方法可以降低以下java代码的复杂性?_Java_Java 8_Refactoring_Cyclomatic Complexity - Fatal编程技术网

是否有任何方法可以降低以下java代码的复杂性?

是否有任何方法可以降低以下java代码的复杂性?,java,java-8,refactoring,cyclomatic-complexity,Java,Java 8,Refactoring,Cyclomatic Complexity,我需要根据sonar可接受的级别降低以下java方法的复杂性。现在,它给出了类似声纳的问题 这需要一些专家的帮助 public List<X> Y(final DateTime treatmentDiscontinueTime, final List< P> validPrescribedPrescriptions) { final List<x>

我需要根据sonar可接受的级别降低以下java方法的复杂性。现在,它给出了类似声纳的问题

这需要一些专家的帮助

public List<X> Y(final DateTime treatmentDiscontinueTime,
                                                    final List< P> validPrescribedPrescriptions)
  {
    final List<x> doseWrapperList = new ArrayList<>();
    final int noOfPrescriptions = validPrescribedPrescriptions.size();

    for (int prescriptionIndex = 0; prescriptionIndex < noOfPrescriptions; prescriptionIndex++)
    {
      final BasePrescribedPrescription basePrescribedPrescription = validPrescribedPrescriptions.get(prescriptionIndex);
      final String firstDoseText = basePrescribedPrescription.getFirstText();
      final String secondDoseText = basePrescribedPrescription.getSecondText();
      final boolean accordingToSchedule = A.ACCORDING.equals(firstDoseText);
      final boolean specificPrescription = A.SP.equals(firstDoseText);
      final boolean specificVbTypePrescription = A.SPVB.equals(firstDoseText);

      List<D> doseDetails = new ArrayList<>(basePrescribedPrescription.getDoseDetails());


      final DateTime changedDosageEndDate =
        getChangedDoseEndDate(basePrescribedPrescription.getActualTerminateDate(), treatmentDiscontinueTime);
      final int noOfDosages = doseDetails.size();

      for (int doseIndex = 0; doseIndex < noOfDosages; doseIndex++)
      {
        final D doseDetail = doseDetails.get(doseIndex);

        if ((doseDetail.getStart().getStartDate() != null) && (changedDosageEndDate != null) &&
            doseDetail.getStart().getStartDate().isAfter(changedDosageEndDate))
        {
          continue;
        }

        String previewDoseText;

        if (accordingToSchedule)
        {
          previewDoseText = X
        }
        else if (specificPrescription)
        {
          previewDoseText = Y;
        }
        else if (specificVbTypePrescription)
        {
          previewDoseText = Z;
        }
        else if (noOfDosages == 2)
        {

          previewDoseText = ((doseIndex == 0) ? secondDoseText : firstDoseText);
        }
        else
        {
          previewDoseText = firstDoseText;
        }

        final boolean isUnplanned =isuNplaned()



        if (!isUnplanned)
        {
          doseStart = getStartDate();
          doseEnd = getEndDate();
        }


        doseWrapperList.add(new DoseInfoLiteDTOWrapper(previewDoseText, doseStart, doseEnd, doseDetail));

      }
    }
    return doseWrapperList;
  }

我需要一些专家的帮助来解决这个声纳问题。我想用不同的方法来提取代码片段,将此方法分解为几个部分。但仍然找不到合适的方法来执行此操作。

不难弄清楚,我认为:

使用简单For循环 创建更多的小方法来为循环执行smallclear操作 Block if/esle:使用简单语句
提示:学习TDD以尽可能编写干净的代码

如果代码有效,请前往询问。提示:仅在有意义的地方使用final。将它附加到每个变量和任何变量都会产生大量无用的行噪波。您可以尝试的一件事是将这个巨大的if块移动到一个方法中,如previewDoseText=theNewMethod.previewDoseText=doseIndex==0?第二个dosetext:第一个dosetext;看起来不对。。。当然,如果是第0剂,那就不是第二剂了?@uma它可能会起作用,但它看起来是错误的,因此会增加认知负担。只是记录在案:一个人可以遵循干净的代码而不需要tdd。但是tdd做得好肯定会有帮助!是的,有很多方法可以做到这一点,tdd不难学习,但不容易应用。对我来说,尽可能地结合一切:+OOP+设计模式+实体+TDD。。。。