6/30/2007

Работа с командной строкой

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

 

Способ 1:

(код разбора строки и загрузки свойств находится внутри класса)

 

public class Host

{

    public static void Main(string[] args)

    {

        Util util = new Util(args);

        util.Start();

    }

}

public class Util

{

    public Util(string[] args)

    {

        // парсинг и валидация значений args[]

    }

    public void Start() {...}

}

 

Плюс: коротко и ясно.

Минус: если Util понадобится, например, в WF-активности, то при каждом вызове будет происходить парсинг и валидация значений args[].

 

Примечание: конструктор Util можно сделать без параметров, при этом использовать значение Environment.CommandLine.

 

Способ 2:

(отдельный immutable-класс с параметрами для класса Util)

 

public class Host

{

    public static void Main(string[] args)

    {

        UtilSettings us = new UtilSettings(args);

        Util util = new Util(us);

        util.Start();

    }

}

public class Util

{

    public Util(UtilSettings s) {...}   

    public void Start() {...}

}

 

public class UtilSettings

{

    public UtilSettings(string[] args) {...}

}

 

Плюс: избавились от минуса, который был в «Способ 1».

Минус: данные для UtilSettings передаются через конструктор. Если источников с данными будет несколько, то и конструкторов будет несколько. В итоге, чтобы понять что делать с данными, надо будет смотреть на количество и очередность параметров у конструкторов.

 

Способ 3:

(модифицированный UtilSettings из «Способ 2»)

 

public class UtilSettings

{

    private UtilSettings() { }

    public static UtilSettings FromCommandLine(string[] args) {...}

}

 

Плюс: избавились от минуса, который был в «Способ 2».

Минус: нет.

 

Теперь, если понадобится загрузить параметры, например, из xml-файла, то в UtilSettings надо просто добавить соответствующий метод, например,

public static UtilSettings FromXml(string path) {…}

0 Comments: