Проверка параметров в соответствии с фиксированной ссылкой - PullRequest
0 голосов
/ 13 июня 2010

Следующий метод предназначен для настройки типа передачи FTP-соединения. По сути, я хотел бы проверить ввод символов (см. Комментарии).

Это идет за борт? Есть ли более элегантный подход? Как вы подходите к валидации параметров в целом? Любые комментарии приветствуются.

public void setTransferType(Character typeCharacter,
        Character optionalSecondCharacter) throws NumberFormatException,
        IOException {

    // http://www.nsftools.com/tips/RawFTP.htm#TYPE
    // Syntax: TYPE type-character [second-type-character]
    //
    // Sets the type of file to be transferred. type-character can be any
    // of:
    //
    // * A - ASCII text
    // * E - EBCDIC text
    // * I - image (binary data)
    // * L - local format
    //
    // For A and E, the second-type-character specifies how the text should
    // be interpreted. It can be:
    //
    // * N - Non-print (not destined for printing). This is the default if
    // second-type-character is omitted.
    // * T - Telnet format control (<CR>, <FF>, etc.)
    // * C - ASA Carriage Control
    //
    // For L, the second-type-character specifies the number of bits per
    // byte on the local system, and may not be omitted.

    final Set<Character> acceptedTypeCharacters = new HashSet<Character>(Arrays.asList(
            new Character[] {'A','E','I','L'}
    ));

    final Set<Character> acceptedOptionalSecondCharacters = new HashSet<Character>(Arrays.asList(
            new Character[] {'N','T','C'}
    ));

    if( acceptedTypeCharacters.contains(typeCharacter) ) {
        if( new Character('A').equals( typeCharacter ) || new Character('E').equals( typeCharacter ) ){
            if( acceptedOptionalSecondCharacters.contains(optionalSecondCharacter) ) {
                executeCommand("TYPE " + typeCharacter + " " + optionalSecondCharacter );
            }
        } else {
            executeCommand("TYPE " + typeCharacter );
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Проверка всей строки в одной простой проверке регулярных выражений:

String.matches("TYPE ([AE] [NTC]|I|L .)")

(Обратите внимание, что я использовал "." (Любой символ) после буквы L, потому что документ не объяснил, каким должен быть этот символ. Если он может быть, скажем, 7 или 8, используйте [78].)

Вы можете пойти дальше с этим (захват групп, предварительная компиляция регулярных выражений, разрешение произвольных дополнительных пробелов и т. Д.), Но вышеописанное в основном делает это.

1 голос
/ 13 июня 2010

Вот как бы я поступил по этому поводу:

private static final List<String> ALLOWED = Arrays.asList("AN", "AT", "AC", "EN", "ET", "EC");

public void setTransferType(Character type, Character optional) 
  throws NumberFormatException, IOException {

  String[] arr = new String[] { "AN", "AT", "AC", "EN", "ET", "EC" };

  if(type = 'I')
     executeCommand("TYPE " + type );
  else if(type = 'L') {
     executeCommand("TYPE " + type + " " + optional);
  else if(ALLOWED.contains("" + type + optional)) 
     executeCommand("TYPE " + type + " " + optional);
  else
     // Handle an incorrect argument error               
}
  • Ваш код не обрабатывает регистр 'L'. Я предположил, что вы хотите это сделать executeCommand("TYPE " + type + " " + optional);
  • Ваш код молча игнорировал неверные параметры. Я добавил else (последний) для явной обработки этого случая.
  • Названия, которые вы используете, слишком шумные. Например, вы объявляете переменную типа Character и называете ее typeCharacter. Суффикс имени персонажа - noise - он не добавляет никакой полезной информации.
  • Если интерфейс и обязанности вашего метода ясны, я бы не стал сильно беспокоиться о его реализации (особенно в таких коротких методах). Просто напишите простейшую вещь, которая заставляет его проходить тесты. Если вы еще не написали, они лучше начать прямо сейчас. Вам лучше потратить свое время на написание этого, а не на полировку реализации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...