.NET класс рефакторинг дилемма - PullRequest
3 голосов
/ 06 января 2009

Итак, я рефакторинг унаследованной кодовой базы, которую я унаследовал, и в процессе я нашел статический класс, который инкапсулирует логику для запуска сторонних приложений. По сути, это выглядит так (сокращенно для краткости, чтобы показать только одно приложение):

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.
   }

 }

Мои опасения заключаются в следующем:

  1. Возможно, уже существует класс, интерфейс или другая конструкция, которая делает это, и я просто не наткнулся на это.

  2. Это может быть излишним из-за того, что я хочу сделать. Тем не менее, обратите внимание, что приложение использует как минимум три отдельных сторонних приложения, которые я идентифицировал до сих пор (и большинство из них почти наверняка появятся).

  3. Меня не совсем устраивает название базового класса. Это кажется нечетким и не очень информативным (но я не мог придумать ничего лучшего, учитывая, что приложение уже хорошо определено, зарезервировано платформой и могло бы привести к путанице, если бы я его использовал).

  4. Идея состоит в том, что я хочу иметь возможность сохранять данные конфигурации приложения (его путь и имя исполняемого файла) в файле App.Config и проверять их существование при запуске моего приложения; когда моему программному обеспечению требуется запустить программное обеспечение, я хочу сделать это с помощью одного вызова метода, и у меня нет командных строк построения кода и попытки запустить программное обеспечение вручную (как это происходит в настоящее время).

Итак, я отправляю запрос о помощи, рекомендациях и предложениях. Все, что вы можете сказать, высоко ценится.

P.S. Я спрашиваю об этом здесь, потому что я работаю, как я часто делаю, как единственный разработчик в моей фирме; У меня больше нет никого, кто мог бы отослать эти идеи. Вы, ребята, обладаете огромным опытом в этой области, и было бы глупо с моей стороны не просить вашего совета, поэтому я надеюсь, что вы все будете терпеть меня. Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 06 января 2009

Вот еще один способ рефакторинга:

using System.IO;
public class ExternalApplication
{
   public ExternalApplication(string path)
   {
      this.Path = path;
   }

   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 void Execute(string args)
   {
      // Implementation to launch the application
   } 
}

public class AppFactory
{
   public ExternalApplication App1()
   {
      // Implementation to initialize this application from
      // the application's configuration file.
   }

   public ExternalApplication App2()
   {
      // Implementation to initialize this application from
      // the application's configuration file.
   }

   public ExternalApplication AppFromKey(string key)
   {
      // get from somewhere
   } 
 }

В этом случае у вас есть один тип ExternalApplication и фабрика, которая имеет методы, возвращающие правильно сконфигурированное приложение для вас.

0 голосов
/ 06 января 2009

Я должен согласиться с @Grauenwolf, что это кажется разумным.

В зависимости от общности вы можете предоставить механизм инкапсуляции поиска конфигурации (способ извлечения / установки аргументов командной строки) или способ выполнения приложения (Sync или ASync).

  1. Если вы найдете уже существующее, попробуйте обернуть его и продолжить.
  2. Не нужно слишком много усилий для добавления этого дополнительного слоя, и он помогает лучше отдельные заявки касается. Я чувствую, что все в порядке и может помочь улучшить тестируемость с помощью насмешек.
  3. AppLauncherBase или AppExecutorBase? Нет причины почему приложение должно быть внешним. Не самые лучшие имена, когда-либо придуманные, но я постараюсь инкапсулировать назначение класса - запуск / выполнение приложений.
  4. Возможно, вы захотите рассмотреть соглашение, используемое для определения данных конфигурации / информации о пути к приложению в App.Config, а затем реализовать логику для ее получения в базовом классе по умолчанию.

Удачи, и я надеюсь, что это поможет.

0 голосов
/ 06 января 2009

Мне кажется разумным.

Я делал нечто подобное в прошлом, но у меня не было абстрактного базового класса. Вместо этого я передал путь к приложению в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...