2009-08-12 2 views
0

Я кодирования метод, который возвращает, является ли данный символ, который выглядит следующим образом: -Лучший стиль кодирования - Проверка, является ли символ допустимым символом

private static boolean isValid(char c) { 
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':'; 
} 

Проверить стиль помечено это в качестве логического значения сложность слишком велика (5, если она должна быть не более 3). Мой менеджер по развитию выделил несколько альтернативных реализаций, которые я опубликую в качестве ответов. Лично я считаю, что мой код достаточно читабельен и предпочитает отключать стиль проверки для этого метода.

Как вы думаете?

+0

Этот метод делает больнее добавлять символы или удалять их по сравнению с другими, и сложнее увидеть с первого взгляда, какие символы действительны. –

+7

Сделайте свой опрос ответом c/w или он похож на ферму репутации. –

+2

используйте регулярное выражение MAN – Tom

ответ

11
private static boolean isValid(char c) { 
    String validChars =".,+/;:"; 
    return (validChars.indexOf(c) > -1); 
} 
+0

Это хорошее решение, но оно плохо масштабируется. Для этого вам нужна таблица поиска. –

+0

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

5
private static boolean isValid(char c) { 
    switch (c) { 
    case '.' : // FALLTHROUGH 
    case ',' : // FALLTHROUGH 
    case '+' : // FALLTHROUGH 
    case '/' : // FALLTHROUGH 
    case ';' : // FALLTHROUGH 
    case ':' : 
     return true; 
    default : return false; 
    } 
} 
+0

В случае альтернативных аргументов case я бы не стал беспокоиться о комментариях // FALLTHROUGH. – Avi

+0

Мне нравится этот лучший, потому что он самый простой. Если скорость не является проблемой, я ВСЕГДА иду за удобочитаемость, потому что вы никогда не знаете, кому придется поддерживать код, когда вас нет. – Ben

+0

Мне очень не нравится этот, потому что он громоздкий и негибкий. –

1
private static boolean isValid(char c) { 
    char[] validChars2 = {'.', ',', '+', '/', ';', ':'}; 
    for (char d : validChars2) { 
     if (c == d) { return true; } 
    } 
    return false; 
} 
2
private static boolean isValid(char c) { 
    /* CHECKSTYLE:OFF */ 
    return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':'; 
    /* CHECKSTYLE:ON */ 
} 
0

Регулярное выражение может хорошо работать. Я жестко закодировал его в примере ниже, но вы могли бы просто вытащить его из файла конфигурации.

[Test] 
    public void AisNotValid() 
    { 
     Assert.IsFalse(IsValid('a')); 
    } 

    [Test] 
    public void SemiColonIsValid() 
    { 
     Assert.IsTrue(IsValid(';')); 
    } 

    public bool IsValid(Char c) 
    { 
     return Regex.IsMatch(Regex.Escape(".,+/;:"), c.ToString()); 
    } 

Метод Regex.Escape() пригодится здесь, потому что ускользает символы, которые обычно имеют значение в Regex. Из документов: «Сбрасывает минимальный набор символов (\, *, +,?, |, {, [, (,), ^, $,., # И пробел), заменяя их их escape-кодами. "

+0

Я кодирую на Java, а не C# – Tarski

+0

Ницца, проголосовавший за использование другого (но очень похожего) языка? Слабый. – RKitson

+0

Я мог бы downvote на основе regexp быть overkill, но C# настолько похож на Java, что я даже не заметил. –

0

Если читаемость не является проблемой, это может быть решена с полу двоичного поиска, с булевой сложности 3

В качестве эталона для полукокса значения

+ 11 
, 12 
. 14 
/15 
: 26 
; 27 

private static boolean isValid(char c) 
{ 
    return c > 14 ? c == '/' || c == ';' || c == ':' : c == '.' || c == ',' || c == '+'; 
} 
+0

Бинарные поисковые запросы часто бывают быстрее, чем линейные, но для стольких элементов накладные расходы более сложного алгоритма могут не стоить того. Простая справочная таблица была бы быстрее и оставалась бы быстрой, независимо от того, сколько экземпляров проверялось. –

2

Я хотел бы использовать набор. Он имеет преимущество от описательного имени, и он хорошо масштабируется.

private static Set<Character> validCharacters = new HashSet<Character>(); 

public static void initValidCharacters() { 
    validCharacters.add('.'); 
    validCharacters.add(','); 
    validCharacters.add('+'); 
    validCharacters.add('/'); 
    validCharacters.add(';'); 
    validCharacters.add(':'); 
} 

private static boolean isValid(char c) { 
    return validCharacters.contains(c); 
} 
+0

Это сработало бы, единственным недостатком было бы автоматическое боксирование накладных расходов при каждой проверке? – BenM