Как рассчитать соотношение кода к комментарию для проекта C #? - PullRequest
0 голосов
/ 21 ноября 2018

Примечание: я не спрашиваю , каково золотое отношение кода к комментарию , и при этом я не пытаюсь прикрепить конкретное отношение к нашей команде.Вместо этого мы хотели бы улучшить то, насколько хорошо задокументирована наша кодовая база (мы начали с менталитета «код должен сам документировать»), что может быть достигнуто либо путем удаления мертвого кода, либо путем добавления комментариев к живому коду, и мы хотели бы измеритьнасколько хорошо мы собираемся делать это, измеряя это отношение несколько раз в течение нескольких месяцев.Также обратите внимание, что я хотел бы измерить количество комментариев, которые у нас есть, поэтому что-то, что получает LOC от сгенерированного IL , не будет работать.

Как мне получить кодотношение к комментариям для проекта C #?Нужно ли мне писать свой собственный скрипт синтаксического анализа, или в Roslyn есть что-то, что я могу использовать?Какие-нибудь основные IDE несут эту функцию напрямую?В качестве бонуса могу ли я отфильтровать «пунктуацию», такую ​​как лишние пробелы, разделители комментариев (// и /* */) и открывающие / закрывающие фигурные скобки?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Используя регулярное выражение Роберта Харви , мне удалось создать короткий метод C #, который вычисляет эту метрику из входной строки.Он идет посимвольно для правильного учета строк, которые содержат как код, так и комментарии, а также исключает дополнительные пробелы из метрики, так что такие вещи, как отступы строк, не учитываются.

Чтобы предотвратить катастрофический откат назадЯ упростил регулярное выражение (я обнаружил, что вам не нужны проверки новой строки, поскольку группы исключения символов уже позаботились об этом), а также сделал тело комментария блока группой без возврата.

public static double CodeToCommentRatio(
    string text, 
    out int codeChars, 
    out int commentChars, 
    out int blankChars)
{
    // First, filter out excess whitespace, reporting the number of characters removed this way
    Regex lineStartRegex = new Regex(@"(^|\n)[ \t]+");
    Regex blanksRegex = new Regex(@"[ \t]+");
    string minWhitespaceText = blanksRegex.Replace(lineStartRegex.Replace(text, "\n"), " ");
    blankChars = text.Length - minWhitespaceText.Length;

    // Then, match all comments and report the number of characters in comments
    Regex commentsRegex = new Regex(@"(/\*(?>[^*]|(\*+[^*/]))*\*+/)|(//.*)");
    MatchCollection comments = commentsRegex.Matches(minWhitespaceText);
    commentChars = 0;
    foreach (Match comment in comments)
    {
        commentChars += comment.Length;
    }
    codeChars = minWhitespaceText.Length - commentChars;

    // Finally, return the ratio
    return (double)codeChars / commentChars;
}
0 голосов
/ 22 ноября 2018

Вы можете идентифицировать строки комментариев в своем коде, используя это регулярное выражение:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)

Попробуйте подключить его к функции «Найти в файлах» в Visual Studio, чтобы увидеть его в действии.

https://regex101.com/r/GCrfzc/1

...