Как следовать принципу единой ответственности в совокупности действий - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть приложение-служба Windows, которое читает некоторые файлы, выполняет некоторые изменения и загружает их в веб-API.

Здесь я максимально следовал принципу единой ответственности.

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

class GetFileContent { 
// in here there is a method to return the file content
}

class ApplyBusinessLogic { 
// in here there is a method to get that file content as param and apply business logic
}

class UploadContent {
// get the modified content and upload it
}

Теперь мой вопрос: я добавил новый класс как DoMyActions и создалобъекты вышеупомянутого класса и вызывают методы для выполнения этой задачи, является ли это нарушением принципа единой ответственности?Для ясности из моего вопроса я стараюсь сделать что-то вроде ниже.

class DoMyAction { 

GetFileContent content = new GetFileContent();
// call the method in above class and get the content

ApplyBusinessLogic doMyThing = new ApplyBusinessLogic();
// do my stuff using that file content

UploadContent uploader = new UploadContent();
// upload the content
}

Есть ли лучший подход к этому?

Если я постоянно хочу использовать DoMyAction класс, какследовать принципу единой ответственности?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я думаю, что это большой вопрос, который время от времени беспокоил меня, поэтому вот мои 2 цента

Действия, такие как DoMyAction , которые должны выполнять некоторую оркестровку между многими службами.общего и не существует простого пути их обхода.Тем не менее, очень легко забыть их истинное назначение и добавить дополнительные вещи, которые в идеале должны быть в другом месте.Итак, в духе единоличной ответственности:

  • Не инкапсулируйте построение зависимостей.Это отдельная ответственность сама по себе.Вы можете получить все зависимости от конструктора путем внедрения, как этот ответ проиллюстрировал
  • Следуйте Закону Деметры и придерживайтесь ваших непосредственных зависимостей.Это сведет к минимуму связь вашего действия с его зависимостями.Например, не делайте: getFileContent (). GetRelevantSections (). FormatProperly ()
  • Действие должно работать на абстрактных интерфейсах, чтобы обслуживать файлы различных типов, процессоры и службы загрузки
  • В общем, напомните себе о масштабах своего действия и удалите что-либо кроме оркестровки или что-то еще, что он должен делать
0 голосов
/ 26 ноября 2018

Если процесс класса DoAction не изменяется, вы можете напрямую инкапсулировать GetFileContent, ApplyBusinessLogic, UploadContent в класс DoAction.

Но я бы создал интерфейсы для каждого классачтобы сделать код более гибким.

public interface IFileContent{
    byte[] GetFileContent();
}
public interface IApplyBusinessLogic{
    void ApplyLogic();
}
public interface IUploadContent{
    void Upload();
}

Тогда каждый класс реализует каждый интерфейс, который соответствует его действию.

public class GetFileContent : IFileContent { 
    public  byte[] GetFileContent(){

    }
    // in here there is a method to return the file content
}

public class ApplyBusinessLogic : IApplyBusinessLogic { 
    public void ApplyLogic(){

    }
    // in here there is a method to get that file content as param and apply business logic
}

public class UploadContent : IUploadContent{
    public void Upload(){

    }
    // get the modified content and upload it
}

Тогда я бы использовал инъекцию конструктора для внедрения продолжения, класс позволилкод более гибкий.

public class DoMyAction { 

    IFileContent _content;
    // call the method in above class and get the content

    IApplyBusinessLogic _doMyThing;
    // do my stuff using that file content

    IUploadContent _uploader;
    // upload the content


    public DoMyAction(IFileContent content,IApplyBusinessLogic doMyThing,IUploadContent uploader){
        _content  = content;
        _doMyThing = doMyThing;
        _uploader = uploader;
    }

    public void excuteAPI(){
      //doing something here
    }
}

Вы можете установить логику выполнения в методе excuteAPI из DoMyAction класса.

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