Null object (шаблон проєктування)В об'єктно-орієнтованому програмуванні, Null Object або нульовий об'єкт — це об'єкт з визначеною нейтральною (англ. null) поведінкою. Шаблон проєктування Null Object описує використання цих об'єктів та їх поведінки або відсутності таких. Вперше цей шаблон було описано в серії книжок Pattern Languages of Program Design.[1] МотиваціяУ більшості об'єктно-орієнтованих мов програмування, таких як Java або C#, посилання можуть приймати значення null. Це значення говорить про те, що за посиланням не існує реального об'єкту і виклик методів може призвести до численних помилок та краху системи. Традиційно, методи, що повертають об'єкти (наприклад, методи твірних шаблонів) у випадку невдачі (наприклад, пошук об'єкту в порожній колекції) повинні повертати коректне значення посилання — Обробка цього результату може бути реалізована простою перевіркою посилання на // Приклад на Java
class Animal {
public void makeSound() { System.out.write("Гав-гав!"); }
}
...
Animal pet = animalsProvider.getAnimal();
if (pet != null) {
pet.makeSound();
} else {
/* обробка помилки */
}
...
Проблему обробки Треба відзначити, що, наприклад, у мові програмування Objective-C використовується інший підхід до цієї проблеми: всі методи, що викликаються через ОписЗамість використання Наприклад, функція повинна прочитати список файлів в директорії та виконати якісь дії з кожним. В випадку, якщо директорія порожня, можна повернути Якщо повертати нульовий об'єкт (наприклад, порожній список), то зникає необхідність перевірок. Викликаючий код може ітерувати список файлів, не зважаючи на можливі помилки і не виконувати ніяких дій при цьому. Хоча, залишається можливим робити дещо змінену перевірку: «чи дорівнює результат нульовому об'єкту?», та діяти далі за логікою програми. Також, цей шаблон може використовуватися як заглушка при тестуванні. Відношення до інших шаблонівШаблон може розглядатися як спеціальний випадок шаблонів Стан (англ. State) та Стратегія (англ. Strategy). Він не написаний в книзі GoF, а був запропонований Мартіном Фаулером[2] та Джошуа Керієвскі[3]. В мовахC++Мова зі статично типізованими посиланнями на об'єкти показує, як нульовий об'єкт стає складнішим шаблоном. class animal {
public:
virtual void make_sound() = 0;
};
class dog : public animal {
void make_sound() { cout << "woof!" << endl; }
};
class null_animal : public animal {
void make_sound() { }
};
Існують ситуації, коли вказівник або посилання на об'єкт класу Шаблон Null object вирішує цю проблему, впроваджуючи спеціальний клас C#С# є мовою, в якій шаблон Null object можна реалізувати канонічно. В нижче наведеному прикладі, нульовий об'єкт реалізує очікувану порожню поведінку та попереджає проблеми часу виконання програми, а сам виняток Null Reference Exception, який буде згенеровано, якщо відбудеться використання using System;
interface Animal
{
void MakeSound();
}
class Dog : Animal
{
public void MakeSound()
{
Console.WriteLine("Woof!");
}
}
class NullAnimal : Animal
{
public void MakeSound()
{
}
}
static class Program
{
static void Main()
{
Animal dog = new Dog();
dog.MakeSound(); //
Animal unknown = new NullAnimal(); //<< замінює: Animal unknown = null;
unknown.MakeSound(); // нічого не відбувається
}
}
SmalltalkЗа принципом Smalltalk, «все є об'єктом», відсутність якогось об'єкту моделюється об'єктом Будь-яка операція, яка не змогла повернути потрібний об'єкт може повернути RubyВ Ruby нульовий об’єкт це повноцінний об’єкт класу NilClass. Він специфічним чином працює в логічних виразах: він приймає значення false. Ruby дозволяє розширювати цей клас, тому, якщо ви хочете таку ж поведінку, як у в Objective-C, тоді використовуйте щось на кшталт цього: class NilClass
def method_missing(*)
return nil
end
end
Див. такожПосилання
Примітки
|
Portal di Ensiklopedia Dunia