Чистый код. Создание, анализ и рефакторинг — страница 42 из 94

  private void parseStringSchemaElement(char elementId) {

    marshalers.put(elementId, new StringArgumentMarshaler());

  }

...

  public String getString(char arg) {

    Args.ArgumentMarshaler am = marshalers.get(arg);

    try {

      return am == null ? "" : (String) am.get();

    } catch (ClassCastException e) {

       return "";

    }

  }

...

public class Args {

...

  private Map stringArgs =

    new HashMap();

  private Map intArgs =

    new HashMap();

  private Map marshalers =

    new HashMap();

...

Затем я подставил в parseSchemaElement код трех методов parse, сократившихся до одной команды:

private void parseSchemaElement(String element) throws ParseException {

  char elementId = element.charAt(0);

  String elementTail = element.substring(1);

  validateSchemaElementId(elementId);

  if (isBooleanSchemaElement(elementTail))

    marshalers.put(elementId, new BooleanArgumentMarshaler());

  else if (isStringSchemaElement(elementTail))

    marshalers.put(elementId, new StringArgumentMarshaler());

  else if (isIntegerSchemaElement(elementTail)) {

    marshalers.put(elementId, new IntegerArgumentMarshaler());

  } else {

    throw new ParseException(String.format(

      "Argument: %c has invalid format: %s.", elementId, elementTail), 0);

  }

}

Давайте взглянем на общую картину. В листинге 14.12 представлена текущая форма класса Args.


Листинг 14.12. Args.java (после первой переработки)

package com.objectmentor.utilities.getopts;


import java.text.ParseException;

import java.util.*;


public class Args {

  private String schema;

  private String[] args;

  private boolean valid = true;

  private Set unexpectedArguments = new TreeSet();

  private Map marshalers =

new HashMap();

  private Set argsFound = new HashSet();

  private int currentArgument;

  private char errorArgumentId = '\0';

  private String errorParameter = "TILT";


  private ErrorCode errorCode = ErrorCode.OK;

  private enum ErrorCode {

    OK, MISSING_STRING, MISSING_INTEGER, INVALID_INTEGER, UNEXPECTED_ARGUMENT}

  public Args(String schema, String[] args) throws ParseException {

    this.schema = schema;

    this.args = args;

    valid = parse();

  }


  private boolean parse() throws ParseException {

    if (schema.length() == 0 && args.length == 0)

      return true;

    parseSchema();

    try {

      parseArguments();

    } catch (ArgsException e) {

    }

    return valid;

  }


  private boolean parseSchema() throws ParseException {

    for (String element : schema.split(",")) {

      if (element.length() > 0) {

        String trimmedElement = element.trim();

        parseSchemaElement(trimmedElement);

      }

    }

    return true;

  }


  private void parseSchemaElement(String element) throws ParseException {

    char elementId = element.charAt(0);

    String elementTail = element.substring(1);

    validateSchemaElementId(elementId);

    if (isBooleanSchemaElement(elementTail))

      marshalers.put(elementId, new BooleanArgumentMarshaler());

    else if (isStringSchemaElement(elementTail))

      marshalers.put(elementId, new StringArgumentMarshaler());

    else if (isIntegerSchemaElement(elementTail)) {

      marshalers.put(elementId, new IntegerArgumentMarshaler());

    } else {

      throw new ParseException(String.format(

    "Argument: %c has invalid format: %s.", elementId, elementTail), 0);

    }

  }


  private void validateSchemaElementId(char elementId) throws ParseException {

    if (!Character.isLetter(elementId)) {

      throw new ParseException(

    "Bad character:" + elementId + "in Args format: " + schema, 0);

    }

  }


  private boolean isStringSchemaElement(String elementTail) {

    return elementTail.equals("*");

  }


  private boolean isBooleanSchemaElement(String elementTail) {

    return elementTail.length() == 0;

  }


  private boolean isIntegerSchemaElement(String elementTail) {

    return elementTail.equals("#");

  }


Листинг 14.12 (продолжение)

  private boolean parseArguments() throws ArgsException {

    for (currentArgument=0; currentArgument

      String arg = args[currentArgument];

      parseArgument(arg);

    }

    return true;

  }


  private void parseArgument(String arg) throws ArgsException {

    if (arg.startsWith("-"))

      parseElements(arg);

  }


  private void parseElements(String arg) throws ArgsException {

    for (int i = 1; i < arg.length(); i++)

      parseElement(arg.charAt(i));

  }


  private void parseElement(char argChar) throws ArgsException {

    if (setArgument(argChar))