Новости

24.03.2021

Книга «Паттерны проектирования для C# и платформы .NET Core»

Грамотное использование паттернов позволяет добиться соответствия любым требованиям и снизить расходы. В этой книге описаны эффективные способы применения паттернов проектирования с учётом специфики языка C# и платформы .NET Core.

Кроме знакомых паттернов проектирования из книги «Банды четырех» вы изучите основы объектно-ориентированного программирования и принципов SOLID. Затем узнаете о функциональных, реактивных и конкурентных паттернах, с помощью которых будете работать с потоками и корутинами. Заключительная часть содержит паттерны для работы с микросервисными, бессерверными и облачно-ориентированными приложениями. Вы также узнаете, как сделать выбор архитектуры, например микросервисной или MVC.

Кому подойдет эта книга


Целевая аудитория — разработчики современных приложений. Поскольку книга содержит много кода, чтобы объяснить, как и где используются паттерны, подразумевается наличие у читателя опыта в разработке ПО. Не стоит рассматривать данную книгу как «программирование для чайников», скорее она отвечает на вопрос «Как программировать лучше». Поэтому издание будет полезно начинающим и опытным программистам, архитекторам приложений и проектировщикам.

Вы научитесь

  • Повышать гибкость кода, используя принципы SOLID.
  • Применять разработку через тестирование (TDD) в ваших проектах на .NET Core.
  • Выполнять эффективную миграцию баз данных, обеспечивать долговременное хранение данных и их тестирование.
  • Преобразовывать консольное приложение в веб-приложение с помощью подходящего MVP.
  • Писать асинхронный, многопоточный и параллельный код.
  • Использовать парадигму MVVM и работать с RxJS и AngularJS для управления изменениями в базах данных.
  • Откроете для себя возможности микросервисов, бессерверного программирования и облачных вычислений.

 

Реактивность и интерфейс IObservable

В предыдущем разделе мы обсудили реактивное программирование и рассмотрели его модель. Здесь мы обсудим его реализацию компанией Microsoft. В ответ на реактивное программирование в .NET Core у нас есть различные интерфейсы, которые обеспечивают способ реализации реактивного программирования в нашем приложении.

Интерфейс IObservable<T> — универсальный, определен в пространстве имен System и объявлен как public interface IObservable<out T>. Здесь T представляет универсальный тип параметра, который дает информацию об уведомлении. Если коротко, то этот интерфейс помогает определить поставщика уведомлений и они могут быть отправлены для получения информации. Паттерн «Наблюдатель» можно использовать при реализации интерфейса IObservable<T> в приложении.

Паттерн «Наблюдатель» — реализация с помощью IObservable<T>


Говоря коротко, подписчик регистрируется у издателя (поставщика), чтобы получать уведомления, связанные с информацией о сообщении. Они уведомляют поставщика о том, что сообщения были доставлены подписчикам. Вдобавок данная информация может быть связана с изменениями в операциях или любыми другими изменениями в самом методе или объекте. Это также известно как изменения состояния.

Паттерн «Наблюдатель» определяет два термина: наблюдатель и наблюдаемое. Второе — это поставщик, также известный как субъект. Наблюдатель регистрируется в типах Observable/Subject/Provider и будет автоматически уведомлен поставщиком о любых изменениях, вызванных заранее определенными критериями/условиями, изменением или событием и т. д.


На рис. 10.16 изображено простое представление модели наблюдателя, где субъект уведомляет двух разных наблюдателей.

Вернитесь к веб-приложению из главы 9, запустите программу Visual Studio и откройте файл FlixOne.sln.

Содержимое панели Solution Explorer (Обозреватель решений) должно выглядеть примерно так, как показано на рис. 10.17.

 

Разверните папку Common на панели Solution Explorer (Обозреватель решений) и добавьте два файла: ProductRecorder.cs и ProductReporter.cs. Они являются реализацией интерфейсов IObservable<T> и IObserver<T>. Нам также нужно добавить новую модель ViewModel, чтобы мы могли сообщать пользователям об актуальных сообщениях. Для этого необходимо открыть папку Models и добавить файл MessageViewModel.cs.

Следующий код показывает наш класс MessageViewModel:

 

Класс MessageViewModel содержит следующее:

  • MsgId — уникальный идентификатор;
  • IsSuccess — показывает, была ли операция успешной;
  • Message — сообщение об успехе или об ошибке, которое зависит от значения IsSuccess;
  • ToString() — переопределенный метод, который возвращает строку после объединения всех сведений.


Теперь обсудим два наших класса; следующий код взят из класса ProductRecorder:

Наш класс ProductRecorder реализует интерфейс IObservable. Если вы вспомните нашу дискуссию о наблюдателе, то узнаете, что этот класс на самом деле является поставщиком, субъектом или наблюдаемым. Интерфейс IObservable<T> имеет метод Subscribe, который мы должны использовать для подписки наших подписчиков или наблюдателей (мы обсудим наблюдателя позже в этом разделе).

Должен существовать критерий или условие, чтобы подписчик мог получать уведомления. В нашем случае метод Record служит этой цели. Рассмотрим следующий код:

Здесь мы видим метод Record. Мы создали его, чтобы продемонстрировать мощь паттерна. Этот метод просто проверяет корректность скидки. Если значение discount rate недопустимо в соответствии с критерием/условием, то данный метод вызовет исключение и передаст название продукта с этим недопустимым значением.

Предыдущий метод проверяет значение discount rate в соответствии с критериями и отправляет уведомление о возникшем исключении подписчику при невыполнении критериев. Взгляните на блок итераций (цикл foreach) и вообразите ситуацию, когда нам нечего повторять, а все подписчики были уведомлены. Можно ли представить, что произойдет в этом случае? Такая же ситуация может возникнуть и для бесконечного цикла. Остановить это поможет нечто завершающее цикл. Для подобных случаев у нас есть метод EndRecording:

Наш метод EndRecoding пропускает через цикл коллекцию _observers и запускает метод OnCompleted(). Наконец, она очистила коллекцию _observers.

Теперь обсудим класс ProductReporter. Он является примером реализации интерфейса IObserver<T>. Рассмотрим код:

В интерфейсе IObserver<T> есть методы OnComplete, OnError, и OnNext, которые мы должны реализовать в классе ProductReporter. Цель метода OnCompleted — уведомить подписчика о выполнении работы и затем отменить его подписку. Кроме того, OnError вызывается при возникновении ошибки во время выполнения, в то время как OnNext предоставляет информацию об очередном элементе в последовательности потока.

В следующем коде метод PrepReportData — дополнение значения, которое предоставляет пользователю форматированный отчет обо всех операциях процесса:

Описанный метод — простое добавление модели к нашей коллекции Reporter, которая представляет собой коллекцию классов MessageViewModel. Обратите внимание: в целях упрощения вы также можете использовать метод ToString() в MessageViewModel.

Следующий фрагмент кода показывает методы Subcribe и Unsubscribe:

Два предыдущих метода сообщают системе, что провайдер существует. Подписчики могут подписаться на провайдера или отказаться от подписки/избавиться от него после завершения операций.

Теперь пришло время продемонстрировать нашу реализацию и увидеть некоторые результаты. Чтобы сделать это, нам нужно внести некоторые изменения в существующую страницу Product Listing и добавить новую страницу представления в проект. Добавьте ссылку на представление Audit Report (Аудиторский отчет) на нашу страницу Index.cshtml:

В предыдущем фрагменте кода мы добавили новую ссылку на страницу Audit Report
(Аудиторский отчет), основанную на нашей реализации метода Report Action,
который мы определили в нашем классе ProductConstroller.

После добавления этого кода наша страница Product Listing (Список продуктов) будет выглядеть следующим образом (рис. 10.18).

С полным содержанием статьи можно ознакомиться на сайте "Хабрахабр":

https://habr.com/ru/company/piter/blog/546492/


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

Пока нет комментариев


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






CAPTCHAОбновить изображение

Наберите текст, изображённый на картинке

Все поля обязательны к заполнению.

Перед публикацией комментарии проходят модерацию.