Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Что лучше: метод класса или метод расширения

#aspnet_mvc #архитектура


Добрый день.
Я начинающий программист, поэтому могут возникать глупые вопросы.
Делаю проект на ASP.MVC, возник вопрос связанный с архитектурой проекта.
У меня есть класс ViewModel, в котором содержатся данные, с которыми будет работать
контроллер и которые будут выводиться на интернет-страницей. Есть класс ViewModelBuilder,
который преобразует объект базы данных во ViewModel и наоборот.
Мне нужно  принять строку, введенную пользователем, обработать ее, вытянуть недостающие
данные из интернета и сформировать ViewModel.
Возник вопрос, в какой класс написать методы, обрабатывающие входные данные (это
не валидация), вытягивающие их сети недостающие данные  и формирующие ViewModel.

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

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


Ответы

Ответ 1



Вижу в вашем вопросе два слоя. Первый -- про производительность методов расширения. По факту, это всего лишь синтаксический сахар для вызова статического метода. Когда компилятор встречает инструкцию вызыва экстеншена -- он генерирует IL-код вызывающий статический класс: void Main() { var message = "Hello Extension Methods"; int counter1 = message.WordCount(); int counter2 = MyExtensions.WordCount(message); } // Define other methods and classes here public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } IL-код одинаковый в обоих случаях: Вы переживаете о возможном падении производительности. Но у вас в приложении есть чтение из БД и парсинг интернета -- намного более долгие операции, в десятки и сотни раз. Вы боитесь потерять, но там экономия на спичках. Второй слой вопроса -- где размещать правильно. Я бы хотел ответить вам в терминах DDD (Domain-driven design): там где у вас находится слой, который называется предметная область. Вот у вас собственно описание этого класса: Мне нужно принять строку, введенную пользователем, обработать ее (и это не валидация), вытянуть недостающие данные из интернета и сформировать ViewModel. Я не знаю вашу предметную область, поэтому могу предложить назвать этот класс *Manager. Это не очень правильно с точки DDD и подход можно критиковать, но архитектурно -- движение в более правильную сторону, всяко лучше чем размещать метод на контроллере (архитектура ТТУК (Толстый тупой уродливый контроллер)) и тем более выносить [бизнес-логику] в слой представления.

Комментариев нет:

Отправить комментарий