Итак, я рефакторинг унаследованной кодовой базы, которую я унаследовал, и в процессе я нашел статический класс, который инкапсулирует логику для запуска сторонних приложений. По сути, это выглядит так (сокращенно для краткости, чтобы показать только одно приложение):
using System.IO;
using System.Configuration;
public static class ExternalApplications
{
public string App1Path
{
get
{
if(null == thisApp1Path)
thisApp1Path = Configuration.AppSettings.Get("App1Path");
return thisApp1Path;
}
}
private string thisApp1Path = null;
public bool App1Exists()
{
if(string.IsNullOrEmpty(App1Path))
throw new ConfigurationException("App1Path not specified.");
return File.Exists(App1Path);
}
public void ExecuteApp1(string args)
{
// Code to launch the application.
}
}
Это хорошая попытка отделить внешние приложения от остальной части кода, но мне кажется, что это могло быть подвергнуто дальнейшему рефакторингу. Я имею в виду что-то вроде этого:
using System.IO;
public abstract class ExternalApplicationBase
{
protected ExternalApplicationBase()
{
InitializeFromConfiguration();
}
public string Path { get; protected set; }
public bool Exists()
{
if(string.IsNullOrEmpty(this.Path))
throw new ConfigurationException("Path not specified.");
return File.Exists(this.Path);
}
public virtual void Execute(string args)
{
// Implementation to launch the application
}
protected abstract InitializeFromConfiguration();
}
public class App1 : ExternalApplicationBase
{
protected virtual void InitializeFromConfiguration()
{
// Implementation to initialize this application from
// the application's configuration file.
}
}
public class App2 : ExternalApplicationBase
{
protected virtual void InitializeFromConfiguration()
{
// Implementation to initialize this application from
// the application's configuration file.
}
}
Мои опасения заключаются в следующем:
Возможно, уже существует класс, интерфейс или другая конструкция, которая делает это, и я просто не наткнулся на это.
Это может быть излишним из-за того, что я хочу сделать. Тем не менее, обратите внимание, что приложение использует как минимум три отдельных сторонних приложения, которые я идентифицировал до сих пор (и большинство из них почти наверняка появятся).
Меня не совсем устраивает название базового класса. Это кажется нечетким и не очень информативным (но я не мог придумать ничего лучшего, учитывая, что приложение уже хорошо определено, зарезервировано платформой и могло бы привести к путанице, если бы я его использовал).
Идея состоит в том, что я хочу иметь возможность сохранять данные конфигурации приложения (его путь и имя исполняемого файла) в файле App.Config и проверять их существование при запуске моего приложения; когда моему программному обеспечению требуется запустить программное обеспечение, я хочу сделать это с помощью одного вызова метода, и у меня нет командных строк построения кода и попытки запустить программное обеспечение вручную (как это происходит в настоящее время).
Итак, я отправляю запрос о помощи, рекомендациях и предложениях. Все, что вы можете сказать, высоко ценится.
P.S. Я спрашиваю об этом здесь, потому что я работаю, как я часто делаю, как единственный разработчик в моей фирме; У меня больше нет никого, кто мог бы отослать эти идеи. Вы, ребята, обладаете огромным опытом в этой области, и было бы глупо с моей стороны не просить вашего совета, поэтому я надеюсь, что вы все будете терпеть меня. Заранее спасибо!