как правильно поСОЛИть
От: okon  
Дата: 13.01.16 02:52
Оценка: 3 (1)
На примере относительно простой задачи. Допустим мы хотим сделать что-то новомодное в стиле интернет дрищей вещей, и нужно что-то опрашивать сохранять результаты текущего состояния в базу + логировать каждый чих.

Так если написать обычный код то это будет выглядеть так ( код пишу не компилящийся но по сути показывающий алгоритм что делаем, считаем что превдокод похожий на c#

logger.Info("Запрашиваем статус");


var deviceStatus = new HttpClient().GetString("http://iotserver.com/device0001/status")

logger.Info("Получили статус {0}", deviceStatus );


logger.Info("Cохраняем статус в базу");

using( var conn = DBFactory.CreateConnection("ConfigurationName"))
{
    var command = conn.CreateCommand();
    command.Text = "update devicestatus set status=:1 where deviceid=:2";
    command.ExecuteNonQuery();
}

logger.Info("Статус сохранен");



а теперь пробую это по СОЛИТь

public interface IStatusProvider
{
     string GetStatus();
}

public interface IStatusWriter
{
    void SaveStatus( string status );
}


public class LogStatusProviderWrapper : IStatusProvider
{
   private IStatusProvider _provider;
   private ILogger _logger

   public LogStatusProviderWrapper ( IStatusProvider provider , ILogger logger)
   {
      _provider = provider;
      _logger   = logger;
   }

   public string GetStatus()
   {
       _logger.Info("Запрашиваем статус");

    var status = _provider.GetStatus();

       _logger.Info("Получили статус {0}", status);
       return status;
   }
}

public class LogStatusWriterWrapper : IStatusWriter
{
   private IStatusWriter _writer;
   private ILogger _logger

   public LogStatusWriterWrapper ( IStatusWriter writer, ILogger logger)
   {
      _writer = writer;
      _logger   = logger;
   }

   public void SaveStatus(string status)
   {
       _logger.Info("Cохраняем статус");

    _writer.SaveStatus(status);

       _logger.Info("Статус сохранен");
   }
}

public class IoTServerStatusProvider : IStatusProvider
{

   private string url;

   public class IoTServerStatusProvider ( string server, string deviceId )
   {
         url = server + "/device" + deviceId + "/status";
   }

   public string GetStatus()
   {
      return new HttpClient().GetString(url);
   }
}


public class DatabaseStatusWriter : IStatusWriter
{

   private string _configuration;

   public DatabaseStatusWriter ( string configuration, string deviceId )
   {    
    _configuration = configuration;
   }

   public void SaveStatus(string status)
   {
    using( var conn = DBFactory.CreateConnection(_configuration)
    {
        var command = conn.CreateCommand();
        command.Text = "update devicestatus set status=:1 where deviceid=:2";
        command.ExecuteNonQuery();
    }
   }


}


В итоге получаем такую логику

   new LogStatusWriterWrapper(
   new DatabaseStatusWriter("ConfigurationName", "0001"),
   new Log2NetLogger()
   ).WriteStatus(

   new LogStatusProviderWrapper(
            new IoTServerStatusProvider("http://iotserver.com","0001"),
               new Log2NetLogger()
)
    .GetStatus()
    );


Строчек стало больше, прочитать конечную конструкцию можно, но понять что она делает уже не очень, кажется что пересолено. Если скормить такое коллегам которые любят не соленое или наоборот гурманам, то их может стошнить, как бы вы посолили чтобы всем понравилось ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.