Нормально ли с точки зрения чистоты кода наличие большого количества хелперов?

217
29 апреля 2018, 19:44

Под хелпером понимается static класс с набором static методов, объединенных между собой какой-то некой тематикой. Непример хелпер по работе с файлами, хелпер по работе с базой и т.п.
У меня очень много подобных хелперов. Делая какую-либо задачу понимаешь, что часть методов повторно где-то еще будут использованы, поэтому они преобразуются в статические и выносятся в хелпер. В итоге получается ситуация, когда по всему солюшену (с множеством проектов внутри) разбросаны разного рода хелперы. Нормально ли такое положение с точки зрения чистоты кода или же так делать плохо? Если плохо, то как делать правильно?

Answer 1

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

Гораздо лучше вместо хелперов использовать "сервисы" которые могут быть синглтонами если нужно хранить глобальное состояние. И пробрасывать как зависимость через конструктор.

Выглядит это примерно так:

    public interface IFileService //Сервис вместо хелпера
    {
        IEnumerable<string> ReadLines(string fileName);
    }
    public class FileService : IFileService //Реализация файлового сервиса
    {
        public IEnumerable<string> ReadLines(string fileName)
        {
            using (var reader = new StreamReader(fileName))
            {
                while (!reader.EndOfStream)
                    yield return reader.ReadLine();
            }
        }
    }
    public interface IFileParser
    {
        IEnumerable<decimal> Parse(string fileName);
    }
    public class FileParser : IFileParser//Класс в котором требуется работа с файлами
    {
        private readonly IFileService fileService;
        public FileParser(IFileService fileService)
        {
            this.fileService = fileService;
        }
        public IEnumerable<decimal> Parse(string fileName)
        {
            foreach (var line in fileService.ReadLines(fileName))
                if (decimal.TryParse(line, out var number))
                    yield return number;
        }
    }

Так как вы передаете в класс зависимость по интерфейсу, то в некоторых случаях вы можете передавать другую реализацию файлового сервиса, например XMLFileService а при юнит тестировании FileParser можете передавать сгенерированную заглушку IFileService

READ ALSO
Как расшифровать RijndaelManaged

Как расшифровать RijndaelManaged

Подскажите как расшифровать данные после их шифрование?!

194
Проблема с cookie в WebRequest

Проблема с cookie в WebRequest

Не могу понять, как получать cookie от сервера через WebRequestПросто не устанавливает и не видит их

217
Не возвращается большой объем данных request WebBrowser

Не возвращается большой объем данных request WebBrowser

Есть winform приложение на C#, которое формирует html-файл (форма ввода сведений: 5 полей для ввода текста и кнопка submit)На форме расположен WebBrowser,...

192
Combobox с CheckBox,как можно сделать?

Combobox с CheckBox,как можно сделать?

Необходимо сделать такой элемент,при помощи каких средств это делается?

214