Как использовать шаблон нулевого объекта в .NET

автор vadim


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

В этой статье обсуждается, как мы можем реализовать шаблон нулевого объекта в C# с соответствующими примерами кода, где это применимо. Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект консольного приложения в Visual Studio.

Прежде всего, давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что Visual Studio 2022 установлена ​​в вашей системе, выполните шаги, описанные ниже, чтобы создать новый проект консольного приложения .NET Core.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В следующем окне «Настройка нового проекта» укажите имя и местоположение нового проекта.
  6. Нажмите “Далее.
  7. В окне «Дополнительная информация» выберите «.NET 7.0 (Standard Term Support)» в качестве версии Framework, которую вы хотите использовать.
  8. Щелкните Создать.

Мы будем использовать этот проект консольного приложения .NET Core для работы с шаблоном проектирования пустых объектов в последующих разделах этой статьи.

Что такое шаблон нулевого объекта?

Шаблон нулевого объекта — это поведенческий шаблон проектирования программного обеспечения, который используется для инкапсуляции обработки нулевых значений в объектно-ориентированном языке программирования. Он используется для улучшения читабельности и удобства сопровождения кода за счет устранения необходимости в явных проверках на null.

Шаблон нулевого объекта определяет абстрактный класс, который представляет нулевое значение. Затем создается конкретный подкласс, который наследуется от абстрактного класса и предоставляет конкретные реализации для всех методов. Затем этот конкретный подкласс используется во всей кодовой базе всякий раз, когда необходимо представить нулевое значение.

Зачем использовать шаблон нулевого объекта?

Существует ряд причин для использования шаблона нулевого объекта при работе с объектами в C#. Во-первых, это может помочь избежать ошибок нулевой ссылки. Во-вторых, он может сделать код более читабельным, избегая проверок нулевых значений. В-третьих, это может повысить производительность, избегая ненужных вызовов методов и свойств. Наконец, это может упростить код модульного тестирования.

Реализация шаблона нулевого объекта в C#

Чтобы реализовать шаблон нулевого объекта в C#, мы выполним три шага, описанных ниже.

  1. Определите интерфейс или абстрактный класс.
  2. Предоставьте конкретные реализации методов абстрактного класса или интерфейса в классе, который расширяет любой из них.
  3. Определите нулевую реализацию, переопределив методы абстрактного базового класса или интерфейса и вернув соответствующие значения для вашего нулевого объекта.

Создайте абстрактный класс в C#

В созданном ранее консольном проекте создайте класс с именем AbstractProduct, удалите сгенерированный по умолчанию код и введите следующий код.

 
public abstract class AbstractProduct
{
    public abstract int Id { get; set; }
    public abstract string Name { get; set; }
    public abstract string GetProductDetails();
}

Реализовать методы абстрактного класса на C#

Затем создайте еще один новый класс с именем Product в файле с именем Product.cs. Удалите сгенерированный по умолчанию код и введите вместо него следующий код.

 
public class Product : AbstractProduct
{
    public override int Id
    {
        get;
        set;
    }
    public override string Name
    {
        get;
        set;
    }
    public override string GetProductDetails()
    {
        return $"Product Id: {Id}, Product Name: {Name}";
    }
}

Реализуйте класс для обработки нулевых значений в C#.

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

 
public class NullProduct : AbstractProduct
{
    public override int Id
    {
        get;
        set;
    }
    public override string Name
    {
        get;
        set;
    }
    public override string GetProductDetails()
    {
        return $"Product Name: {Name}";
    }
}

Завершите наш пример шаблона нулевого объекта на C#.

Наконец, мы создадим класс ProductRepository, используемый для работы с данными о продуктах нашего примерного приложения. ProductRepository содержит метод с именем GetProduct, который принимает идентификатор продукта в качестве параметра и возвращает либо экземпляр продукта (если продукт найден), либо экземпляр NullProduct, если продукт не найден.

 
public class ProductRepository
{
    List<Product> products = new List<Product>();
    NullProduct? NotFound = new() { Id = -1, Name = "Not Available" };
    public ProductRepository()
    {
        products.Add(
            new Product()
            {
                Id = 1,
                Name = "DELL Laptop"
            });
        products.Add(
            new Product()
            {
                Id = 2,
                Name = "Lenovo Laptop"
            });
    }
    public AbstractProduct GetProduct(int id)
    {
        AbstractProduct product = products.Find(x => x.Id == id);
        return product ?? NotFound;
    }
}

Выполнить приложение

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

 
ProductRepository productRepository = new ProductRepository();
var product = productRepository.GetProduct(1);
Console.WriteLine(product.GetProductDetails());

На рис. 1 показан результат.

Пример шаблона нулевого объекта 01 IDG

Обратите внимание, что поскольку идентификатор продукта (в данном случае 1) доступен в списке продуктов, отображаются сведения о продукте (ноутбук DELL). Теперь давайте передадим несуществующий идентификатор продукта в качестве параметра методу GetProduct, как показано во фрагменте кода, приведенном ниже.

 
ProductRepository productRepository = new ProductRepository();
var product = productRepository.GetProduct(3);
Console.WriteLine(product.GetProductDetails());

На этот раз продукт не будет найден, и в окне консоли отобразится соответствующее сообщение, как показано на рисунке 2.

Пример шаблона нулевого объекта 02 IDG

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

Related Posts

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