14장 점진적인 개선

<aside> 💡 프로그래밍은 작문과 같다. 초안을 쓰고 최종안을 만들어가는 과정이다.

</aside>

Args(예시) 구현하기

public static void main(String[] args) {
	try {
		Args arg = new Args("l, p#, d*", args);
		boolean logging = arg.getBoolean('l');
		int port = arg.getInt('p');
		String directory = arg.getString('d');
		executeApplication(logging, port, directory);
	} catch (ArgsException e) {
		System.out.printf("Argument error: %s\\n", e.errorMessage());
	}
}
  1. “l, p#, d*” : 첫째 매개변수는 형식 또는 스키마를 지정한다. 명령행 인수 3개를 정의한다
  2. “args” : 둘째 매개변수는 main으로 넘어온 명령행 인수 배열 자체다

Args.java 살펴보기

package com.objectmentor.utilities.args;

import static com.objectmentor.utilities.args.ArgsException.ErrorCode.*;
import java.util.*;

public class Args {
	private Map<Character, ArgumentMarshaler> marshalers;
	private Set<Character> argsFound;
	private ListIterator<String> currnetArgument;

	public Args(String schema, String[] args) throws ArgsException {
		marshalers = new HashMap<Character, ArgumentMarshaler>();
		argsFound = new HashSet<Character>();
		
		parseSchema(schema);
		parseArgumentStrings(Arrays.asList(args));
	}

	private void parseSchema(String schema) throws ArgsException {
		for (String element : schema.split(","))
			if (element.length() > 0)
				parseSchemaElement(element.trim());
	}

	private void parseSchemaElement(String element) throws ArgsException {
		char elementId = element.charAt(0);
		String elementTail = element.substring(1);
		validateSchemaElementId(elementId);
		if (elementTail.lengt() == 0)
			marshalers.put(elementId, new BooleanArgumentMarshaler());
		else if (elementTail.equals("*"))
			marshalers.put(elementId, new StringArgumentMarshaler());

...