Снижение цикломатической сложности при обработке строк данных

У меня есть следующий фрагмент кода, который проверяет, есть ли в конкретном DataRow столбец с определенным именем и не равен ли он NULL.

private static bool HasValue(DataColumn c, DataRow row)
{
     if (c != null && row != null && row[c.ColumnName] != System.DBNull.Value)
     {
         return true;
     }
     return false;
}

Также я обрабатываю столбцы строки данных и разбираю их на соответствующие типы данных.

foreach (DataColumn c in row.Table.Columns)
{
     switch (c.ColumnName)
     {
     case Constants.Literals.ACTIVATIONDATETIME:
                                if (HasValue(c, row))
                                {
                                    bFound = true; credentialInfo.ActivationDateTime = DateTimeOffset.Parse(Convert.ToString(row[c.ColumnName]));
                                }
                                break;
     }
}

Visual Studio показывает это как циклично сложное. Есть ли способ уменьшить цикломатический индекс для этой функции.


person ckv    schedule 26.12.2014    source источник
comment
удалите все это и используйте правильную строго типизированную модель данных. Таким образом, нет необходимости проверять, есть ли у материала какой-то другой материал с определенным именем, потому что вы работаете со строго типизированным материалом, а не со словарями со строковой типизацией.   -  person Federico Berasategui    schedule 26.12.2014


Ответы (2)


Вместо того, чтобы перебирать row.Table.Columns, чтобы узнать, содержит ли таблица столбец, вы можете сделать это:

var column = row.Table.Columns[Constants.Literals.ACTIVATIONDATETIME];
if(HasValue(column, row))
{
     //column found.
}

Это устраняет цикл и переключение внутри него и значительно снижает цикломатическую сложность вашей функции.

person brz    schedule 26.12.2014

Вы можете немного уменьшить цикломатическую сложность, просто вернув связанные операторы AND:

private static bool HasValue(DataColumn c, DataRow row)
{
    return c != null && row != null && row[c.ColumnName] != DBNull.Value;
}
person Yuval Itzchakov    schedule 26.12.2014