Как устранить метод побочных эффектов? - PullRequest
0 голосов
/ 18 июня 2019

Когда я пишу коды, я стараюсь соблюдать принципы SOLID и чистого кода. Когда я смотрю на свои функции, я думаю, что попадаю в ошибку побочного эффекта.

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

   //when I call the method, process starts
    public void TriggerProcess()
    {
       GetInformationsFromService();
    }

    public void GetInformationsFromService()
    {
       var informations = exampleService.GetInformations();

       InsertInformations(informations);
    }

    public void InsertInformations(informations)
    {
       insertThemToDb(informations);
    }

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

Тем не менее, если я вызову методы, как показано ниже ..

  public void TriggerProcess()
    {
       var informations = GetInformationsFromService();
       InsertInformations(informations);
    }

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

  public void RepresentativeMethod()
     {
        method1();
        method2();
        method3();
        //...
     }

Как мне избежать побочного эффекта? Какой шаблон я могу использовать для хорошей реализации?

1 Ответ

1 голос
/ 19 июня 2019

Обновление / вставка данных в базу данных из данных другой службы и просто просмотр данных - это два разных варианта использования / процесса. Не пытайтесь повторно использовать GetInformationsFromService(), потому что у него другое назначение. На самом деле, вы должны переименовать его примерно как SyncInformation(), и у вас будет другой метод с именем GetInformation() только для просмотра данных.

Вот что вы можете сделать, исключив TriggerProcess(), потому что SyncInformation() уже процесс, просто вызовите его напрямую:

Этот вариант использования / процесс также должен быть включен в уровень домена :

Вариант использования синхронизации информации:

public void SyncInformation() {
  var informations = exampleService.GetInformations();

  informationRepository.insertInformation(informations);
}

Получить информацию Вариант использования:

public List<Information> GetInformation() {
  return exampleService.getInformation();
}

Выборка и сохранение данных должны быть в вашем слое данных :

ExampleService:

public List<Information> getInformation() {
  // logic to fetch from another service, eg: API
}

InformationRepository:

public void insertInformation(informations)
{
   // insert to database logic
}

Здесь мы следуем разделению интересов , потому что мы разделяем его на два слоя: домен и данные. Уровень домена обрабатывает всю прикладную / бизнес-логику, например, шаги по синхронизации информации. Он знает, КОГДА он должен сохранять данные, но он не знает, КАК . Уровень данных знает, КАК читать и сохранять данные, но он не знает, КОГДА это должно произойти.

...