Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
22 Июн 2024
5 мин
346

Паттерны проектирования: гид для разработчиков C# и .NET

Работа с паттернами проектирования — важный шаг для любого программиста на C# и .NET.

Работа с паттернами проектирования — важный шаг для любого программиста на C# и .NET. В этой статье — основные аспекты паттернов проектирования, их определение и структура.

Что такое паттерн

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

У паттернов — на три основные категории:

  1. Порождающие паттерны (Creational Patterns): фокусируются на процессах создания объектов без логики их создания.
  2. Структурные паттерны (Structural Patterns): касаются композиции объектов и классов, чтобы формировать крупные структуры.
  3. Поведенческие паттерны (Behavioral Patterns): связаны с взаимодействием и распределением обязанностей между объектами.

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

Как описывают паттерны

У каждого паттерна проектирования есть своя структура. Основные компоненты всех шаблонов:

🟢 Имя (Name). Краткое описание паттерна, с ним проще документировать решения в разработке.

🟢 Задача (Intent). Описание проблемы, которую решает паттерн, и контекста, в котором он применяется.

🟢 Мотивация (Motivation). Описание, зачем применять паттерн, его типичные сценарии и примеры использования.

🟢 Структура (Structure). Графическое и текстовое описание классов и объектов, которые участвуют в паттерне, и их взаимосвязей.

🟢 Участники (Participants). Описание ролей и обязанностей для каждого класса или объекта внутри паттерна.

🟢 Взаимодействия (Collaborations). Описание, как участники паттерна взаимодействуют, чтобы выполнить задачи.

🟢 Последствия (Consequences). Обзор плюсов и минусов паттерна, его влияния на гибкость, производительность и поддержку кода.

🟢 Реализация (Implementation). Рекомендации, как использовать паттерн на практике.

🟢 Примеры кода (Sample Code). Обычно на языке C#. Помогают разработчикам эффективнее применить паттерн в своей работе.

🟢 Связанные паттерны (Related Patterns). Описание других паттернов, которые можно использовать вместе или как замену текущему.

5 популярных паттернов для проектирования

Паттерны проектирования помогают решать общие проблемы в работе и улучшать архитектуру кода. Рассмотрим пять наиболее популярных паттернов, которые часто используют разработчики на C# и .NET.

Singleton (Одиночка)

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

Пример — класс конфигурации, который дает доступ к настройкам приложения.

public class ConfigurationManager
{
private static ConfigurationManager _instance;
private static readonly object _lock = new object();

private ConfigurationManager() { }

public static ConfigurationManager Instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = new ConfigurationManager();
}
return _instance;
}
}
}
}

Factory Method (Фабричный метод)

Паттерн определяет интерфейс для создания объекта и позволяет подклассам изменять тип объекта. Так код получается более гибким и расширяемым.

Пример — проектирование различных типов документов (PDF, Word) в зависимости от входных данных.

public abstract class Document
{
public abstract void Print();
}

public class PdfDocument : Document
{
public override void Print() => Console.WriteLine(«Printing PDF document»);
}

public class WordDocument : Document
{
public override void Print() => Console.WriteLine(«Printing Word document»);
}

public abstract class DocumentFactory
{
public abstract Document CreateDocument();
}

public class PdfDocumentFactory : DocumentFactory
{
public override Document CreateDocument() => new PdfDocument();
}

public class WordDocumentFactory : DocumentFactory
{
public override Document CreateDocument() => new WordDocument();
}

Observer (Наблюдатель)

Паттерн определяет зависимость типа «один ко многим» между объектами. Когда меняется состояние одного объекта, все зависимые обновляются автоматически.

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

public interface IObserver
{
void Update(string message);
}

public class NewsSubscriber : IObserver
{
private string _name;
public NewsSubscriber(string name) => _name = name;

public void Update(string message) => Console.WriteLine($»{_name} received news: {message}»);
}

public class NewsPublisher
{
private List _subscribers = new List();

public void Subscribe(IObserver observer) => _subscribers.Add(observer);
public void Unsubscribe(IObserver observer) => _subscribers.Remove(observer);

public void Notify(string message)
{
foreach (var subscriber in _subscribers)
{
subscriber.Update(message);
}
}
}

Decorator (Декоратор)

Паттерн добавляет новые возможности, которых нет в оригинальном объекте. Так его можно менять, а код оставлять таким же.

Пример — текстовый редактор, куда добавили проверку орфографии и форматирование.

public abstract class TextComponent
{
public abstract string GetText();
}

public class PlainText : TextComponent
{
private string _text;
public PlainText(string text) => _text = text;
public override string GetText() => _text;
}

public abstract class TextDecorator : TextComponent
{
protected TextComponent _component;
public TextDecorator(TextComponent component) => _component = component;
}

public class SpellCheckDecorator : TextDecorator
{
public SpellCheckDecorator(TextComponent component) : base(component) { }

public override string GetText() => $»{_component.GetText()} (spell-checked)»;
}

public class HtmlFormatDecorator : TextDecorator
{
public HtmlFormatDecorator(TextComponent component) : base(component) { }

public override string GetText() => $»{_component.GetText()}»;
}

Strategy (Стратегия)

Паттерн определяет семейство алгоритмов и делает их взаимозаменяемыми. С ним можно выбирать конкретный алгоритм, когда программа запущена.

Пример — система расчета стоимости доставки, где используются различные варианты в зависимости от выбранного способа.

public interface IShippingStrategy
{
double CalculateShippingCost(Order order);
}

public class RegularShipping : IShippingStrategy
{
public double CalculateShippingCost(Order order) => order.Weight * 0.5;
}

public class ExpressShipping : IShippingStrategy
{
public double CalculateShippingCost(Order order) => order.Weight * 1.5;
}

public class Order
{
public double Weight { get; set; }
}

public class ShippingContext
{
private IShippingStrategy _strategy;
public ShippingContext(IShippingStrategy strategy) => _strategy = strategy;

public double CalculateCost(Order order) => _strategy.CalculateShippingCost(order);
}

Научиться применять паттерны программирования можно на курсе «Java-разработчик» от онлайн-университета Skypro. Вы пройдете все этапы обучения и получите нужные навыки, чтобы найти работу после курса.

Главное о паттернах программирования

🟦 Паттерны программирования — это проверенное и устоявшееся решение в разработке, шаблон, который помогает структурировать и улучшать код.

🟦 Такие шаблоны нужны, чтобы стандартизировать решение типичных проблем разработки, улучшать архитектуру кода, облегчать его сопровождение и расширение.

🟦 У паттерна программирования есть имя, задача, мотивация, структура, участники, взаимодействия, последствия, реализация, примеры кода и связанные паттерны.

Добавить комментарий