如何重构此方法以将其认知复杂度从21降低到允许的15?

时间:2020-02-05 10:45:32

标签: java sonarqube

/** @param  e */
    private void doActionForUldProfileRecordGrid(ListSelectionEvent e)
    {
        Object source = e.getSource();
        if ((uldProfileTab.getRecordsGrid() != null) && (source == uldProfileTab.getRecordsGrid().getSelectionModel()))
        {
            try
            {
                if (uldProfileTab.getRecordsGrid() != null)
                {
                    UldProfileRec data = (UldProfileRec) getDataVector().elementAt(uldProfileTab.getRecordsGrid()
                            .getActiveRow());

                    if ((data != null) && Str.isNotEmpty(data.contourGroup))
                    {
                        ContourGroup contourGroup = ContourGroupServiceCallUtil.getContourGroup(data.contourGroup);

                        if ((uldProfileTab.getRecordsGrid().getActiveRow()
                                == (uldProfileTab.getRecordsGrid().getRowCount() - 1)))
                        {
                            data = new UldProfileRec();
                            getDataVector().addElement(data);
                        }

                        if (contourGroup != null)
                        {
                            data.setBaseWeight(contourGroup.defaultWeight());
                            data.setBaseVolume(contourGroup.defaultVolume());
                            data.deck(contourGroup.getDeckDescription());
                        }
                    }

                    if (data != null)
                    {
                        setWeightVolume(data, data.position());
                    }
                }
            }
            catch (VerifyException ve)
            {
                LOGGER.warn(ve.getLocalizedMessage(), ve);
            }
        } // end if
    }

1 个答案:

答案 0 :(得分:2)

您应该重构代码,并将孤立的逻辑分离为单独的较小方法,这将在两个方面为您提供帮助:

  1. 这将使代码更具模块化和可维护性。
  2. 更小方法更易于测试,并减少将来引入错误的可能性。

作为副产品,这些方法的认知复杂性也将降低。

例如:

通过此方法:

private void doActionForUldProfileRecordGrid(ListSelectionEvent e)
    {
        Object source = e.getSource();
        if ((uldProfileTab.getRecordsGrid() != null) && (source == uldProfileTab.getRecordsGrid().getSelectionModel()))
        {
            try
            {
                if (uldProfileTab.getRecordsGrid() != null)
                {
                    UldProfileRec data = (UldProfileRec) getDataVector().elementAt(uldProfileTab.getRecordsGrid()
                            .getActiveRow());

                    if ((data != null) && Str.isNotEmpty(data.contourGroup))
                    {
                        **ContourGroup contourGroup = ContourGroupServiceCallUtil.getContourGroup(data.contourGroup);

                        if ((uldProfileTab.getRecordsGrid().getActiveRow()
                                == (uldProfileTab.getRecordsGrid().getRowCount() - 1)))
                        {
                            data = new UldProfileRec();
                            getDataVector().addElement(data);
                        }

                        if (contourGroup != null)
                        {
                            data.setBaseWeight(contourGroup.defaultWeight());
                            data.setBaseVolume(contourGroup.defaultVolume());
                            data.deck(contourGroup.getDeckDescription());
                        }**
                    }

                    if (data != null)
                    {
                        setWeightVolume(data, data.position());
                    }
                }
            }
            catch (VerifyException ve)
            {
                LOGGER.warn(ve.getLocalizedMessage(), ve);
            }
        } // end if

您可以重构突出显示的部分,可以将其移动到单独的方法中。