В об'єктно-орієнтованому програмуванні, Null Object або нульовий об'єкт — це об'єкт з визначеною нейтральною (англ. null) поведінкою. Шаблон проєктування Null Object описує використання цих об'єктів та їх поведінки або відсутності таких. Вперше цей шаблон було описано в серії книжок Pattern Languages of Program Design.
Мотивація
У більшості об'єктно-орієнтованих мов програмування, таких як Java або C#, посилання можуть приймати значення null. Це значення говорить про те, що за посиланням не існує реального об'єкту і виклик методів може призвести до численних помилок та краху системи.
Традиційно, методи, що повертають об'єкти (наприклад, методи твірних шаблонів) у випадку невдачі (наприклад, пошук об'єкту в порожній колекції) повинні повертати коректне значення посилання — null
.
Обробка цього результату може бути реалізована простою перевіркою посилання на null
перед викликом методів.
// Приклад на Java class Animal { public void makeSound() { System.out.write("Гав-гав!"); } } ... Animal pet = animalsProvider.getAnimal(); if (pet != null) { pet.makeSound(); } else { /* обробка помилки */ } ...
Проблему обробки null
-посилань і вирішує шаблон Null object.
Треба відзначити, що, наприклад, у мові програмування Objective-C використовується інший підхід до цієї проблеми: всі методи, що викликаються через nil
-посилання (nil
близька за сенсом до null частина Objective-C) повертають також nil
.
Опис
Замість використання null
-посилання для відображення відсутності об'єкту треба використовувати спеціальний об'єкт, який реалізує потрібні інтерфейси, але не має поведінки, тобто має пусті методи. Перевагою цього підходу є те, що реалізація нульового об'єкту завжди передбачувана: вона нічого не робить, а тому не має таких побічних ефектів, які має null
-посилання.
Наприклад, функція повинна прочитати список файлів в директорії та виконати якісь дії з кожним. В випадку, якщо директорія порожня, можна повернути null
або згенерувати виняток. Таким чином, код, що очікує список файлів повинен перевіряти, чи дійсно він отримав список, а це в свою чергу ускладнює структуру програми.
Якщо повертати нульовий об'єкт (наприклад, порожній список), то зникає необхідність перевірок. Викликаючий код може ітерувати список файлів, не зважаючи на можливі помилки і не виконувати ніяких дій при цьому.
Хоча, залишається можливим робити дещо змінену перевірку: «чи дорівнює результат нульовому об'єкту?», та діяти далі за логікою програми.
Також, цей шаблон може використовуватися як заглушка при тестуванні.
Відношення до інших шаблонів
Шаблон може розглядатися як спеціальний випадок шаблонів Стан (англ. State) та Стратегія (англ. Strategy). Він не написаний в книзі GoF, а був запропонований Мартіном Фаулером та Джошуа Керієвскі.
В мовах
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() { } };
Існують ситуації, коли вказівник або посилання на об'єкт класу animal
необхідний, але за ним немає належного об'єкту. Посилання не може бути null
, коли вказівник animal *
— може: такий вказівник можна використовувати для зберігання об'єкту, але неможливо безпосередньо викликати методи. Код a->make_sound()
викличе помилку undefined behavior (укр. невизначена поведінка), якщо a
буде null
-вказівником.
Шаблон Null object вирішує цю проблему, впроваджуючи спеціальний клас null_animal
, який може бути інстанційований та викорстовуватись з вказівником чи посиланням на animal
.
C#
С# є мовою, в якій шаблон Null object можна реалізувати канонічно. В нижче наведеному прикладі, нульовий об'єкт реалізує очікувану порожню поведінку та попереджає проблеми часу виконання програми, а сам виняток Null Reference Exception, який буде згенеровано, якщо відбудеться використання null
-посилання.
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, «все є об'єктом», відсутність якогось об'єкту моделюється об'єктом nil
. В GNU Smalltalk, наприклад, nil
є об'єктом класу UndefinedObject
, прямого нащадка Object
.
Будь-яка операція, яка не змогла повернути потрібний об'єкт може повернути nil
замість нього, таким чином, попереджаючи повернення «об'єкту нема». Цей підхід спрощує програму, позбавляючи від null-посилань, null-вказівників.
Ruby
В Ruby нульовий об’єкт це повноцінний об’єкт класу NilClass. Він специфічним чином працює в логічних виразах: він приймає значення false. Ruby дозволяє розширювати цей клас, тому, якщо ви хочете таку ж поведінку, як у в Objective-C, тоді використовуйте щось на кшталт цього:
class NilClass def method_missing(*) return nil end end
Див. також
Посилання
- Jeffrey Walkers' account of the Null Object Pattern [ 6 червня 2012 у Wayback Machine.]
- Martin Fowlers' description of Special Case, a slightly more general pattern [ 16 травня 2012 у Wayback Machine.]
- Null Object Pattern Revisited [ 10 квітня 2010 у Wayback Machine.]
- Introduce Null Object refactoring [ 30 травня 2012 у Wayback Machine.]
- SourceMaking Tutorial [ 15 червня 2012 у Wayback Machine.]
Примітки
- Woolf, Bobby (1998). Null Object. У Martin, Robert; Riehle, Dirk; Buschmann, Frank (ред.). Pattern Languages of Program Design 3. Addison-Wesley.
- Fowler, Martin (1999). Refactoring. Improving the Design of Existing Code. Addison-Wesley. ISBN .
- (2004). Refactoring To Patterns. Addison-Wesley. ISBN .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V ob yektno oriyentovanomu programuvanni Null Object abo nulovij ob yekt ce ob yekt z viznachenoyu nejtralnoyu angl null povedinkoyu Shablon proyektuvannya Null Object opisuye vikoristannya cih ob yektiv ta yih povedinki abo vidsutnosti takih Vpershe cej shablon bulo opisano v seriyi knizhok Pattern Languages of Program Design MotivaciyaU bilshosti ob yektno oriyentovanih mov programuvannya takih yak Java abo C posilannya mozhut prijmati znachennya null Ce znachennya govorit pro te sho za posilannyam ne isnuye realnogo ob yektu i viklik metodiv mozhe prizvesti do chislennih pomilok ta krahu sistemi Tradicijno metodi sho povertayut ob yekti napriklad metodi tvirnih shabloniv u vipadku nevdachi napriklad poshuk ob yektu v porozhnij kolekciyi povinni povertati korektne znachennya posilannya null Obrobka cogo rezultatu mozhe buti realizovana prostoyu perevirkoyu posilannya na null pered viklikom metodiv Priklad na Java class Animal public void makeSound System out write Gav gav Animal pet animalsProvider getAnimal if pet null pet makeSound else obrobka pomilki Problemu obrobki null posilan i virishuye shablon Null object Treba vidznachiti sho napriklad u movi programuvannya Objective C vikoristovuyetsya inshij pidhid do ciyeyi problemi vsi metodi sho viklikayutsya cherez nil posilannya nil blizka za sensom do null chastina Objective C povertayut takozh nil OpisZamist vikoristannya null posilannya dlya vidobrazhennya vidsutnosti ob yektu treba vikoristovuvati specialnij ob yekt yakij realizuye potribni interfejsi ale ne maye povedinki tobto maye pusti metodi Perevagoyu cogo pidhodu ye te sho realizaciya nulovogo ob yektu zavzhdi peredbachuvana vona nichogo ne robit a tomu ne maye takih pobichnih efektiv yaki maye null posilannya Napriklad funkciya povinna prochitati spisok fajliv v direktoriyi ta vikonati yakis diyi z kozhnim V vipadku yaksho direktoriya porozhnya mozhna povernuti null abo zgeneruvati vinyatok Takim chinom kod sho ochikuye spisok fajliv povinen pereviryati chi dijsno vin otrimav spisok a ce v svoyu chergu uskladnyuye strukturu programi Yaksho povertati nulovij ob yekt napriklad porozhnij spisok to znikaye neobhidnist perevirok Viklikayuchij kod mozhe iteruvati spisok fajliv ne zvazhayuchi na mozhlivi pomilki i ne vikonuvati niyakih dij pri comu Hocha zalishayetsya mozhlivim robiti desho zminenu perevirku chi dorivnyuye rezultat nulovomu ob yektu ta diyati dali za logikoyu programi Takozh cej shablon mozhe vikoristovuvatisya yak zaglushka pri testuvanni Vidnoshennya do inshih shablonivShablon mozhe rozglyadatisya yak specialnij vipadok shabloniv Stan angl State ta Strategiya angl Strategy Vin ne napisanij v knizi GoF a buv zaproponovanij Martinom Faulerom ta Dzhoshua Keriyevski V movahC Mova zi statichno tipizovanimi posilannyami na ob yekti pokazuye yak nulovij ob yekt staye skladnishim shablonom class animal public virtual void make sound 0 class dog public animal void make sound cout lt lt woof lt lt endl class null animal public animal void make sound Isnuyut situaciyi koli vkazivnik abo posilannya na ob yekt klasu animal neobhidnij ale za nim nemaye nalezhnogo ob yektu Posilannya ne mozhe buti null koli vkazivnik animal mozhe takij vkazivnik mozhna vikoristovuvati dlya zberigannya ob yektu ale nemozhlivo bezposeredno viklikati metodi Kod a gt make sound vikliche pomilku undefined behavior ukr neviznachena povedinka yaksho a bude null vkazivnikom Shablon Null object virishuye cyu problemu vprovadzhuyuchi specialnij klas null animal yakij mozhe buti instancijovanij ta vikorstovuvatis z vkazivnikom chi posilannyam na animal C S ye movoyu v yakij shablon Null object mozhna realizuvati kanonichno V nizhche navedenomu prikladi nulovij ob yekt realizuye ochikuvanu porozhnyu povedinku ta poperedzhaye problemi chasu vikonannya programi a sam vinyatok Null Reference Exception yakij bude zgenerovano yaksho vidbudetsya vikoristannya null posilannya 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 lt lt zaminyuye Animal unknown null unknown MakeSound nichogo ne vidbuvayetsya Smalltalk Za principom Smalltalk vse ye ob yektom vidsutnist yakogos ob yektu modelyuyetsya ob yektom nil V GNU Smalltalk napriklad nil ye ob yektom klasu UndefinedObject pryamogo nashadka Object Bud yaka operaciya yaka ne zmogla povernuti potribnij ob yekt mozhe povernuti nil zamist nogo takim chinom poperedzhayuchi povernennya ob yektu nema Cej pidhid sproshuye programu pozbavlyayuchi vid null posilan null vkazivnikiv Ruby V Ruby nulovij ob yekt ce povnocinnij ob yekt klasu NilClass Vin specifichnim chinom pracyuye v logichnih virazah vin prijmaye znachennya false Ruby dozvolyaye rozshiryuvati cej klas tomu yaksho vi hochete taku zh povedinku yak u v Objective C todi vikoristovujte shos na kshtalt cogo class NilClass def method missing return nil end endDiv takozhShabloni proyektuvannya programnogo zabezpechennya Ob yektno oriyentovane programuvannyaPosilannyaJeffrey Walkers account of the Null Object Pattern 6 chervnya 2012 u Wayback Machine Martin Fowlers description of Special Case a slightly more general pattern 16 travnya 2012 u Wayback Machine Null Object Pattern Revisited 10 kvitnya 2010 u Wayback Machine Introduce Null Object refactoring 30 travnya 2012 u Wayback Machine SourceMaking Tutorial 15 chervnya 2012 u Wayback Machine PrimitkiWoolf Bobby 1998 Null Object U Martin Robert Riehle Dirk Buschmann Frank red Pattern Languages of Program Design 3 Addison Wesley Fowler Martin 1999 Refactoring Improving the Design of Existing Code Addison Wesley ISBN 0 201 48567 2 2004 Refactoring To Patterns Addison Wesley ISBN 0 321 21335 1