﻿
{"id":23075,"date":"2021-09-25T20:33:19","date_gmt":"2021-09-25T20:33:19","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23075"},"modified":"2021-09-25T20:33:19","modified_gmt":"2021-09-25T20:33:19","slug":"null-object-design-pattern-nedir-nasil-uygulanir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/null-object-design-pattern-nedir-nasil-uygulanir\/","title":{"rendered":"Null Object Design Pattern Nedir? Nas\u0131l Uygulan\u0131r?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde; C#, Java, Python vs. gibi OOP dillerinde <code>null<\/code> olabilen referanslar\u0131n getirisi olan olas\u0131 hata durumlar\u0131yla kontrol yap\u0131lar\u0131ndan ziyade daha tasar\u0131msal olarak ba\u015fa \u00e7\u0131kabilmenin bir yolu olan <em>Null Object Design Pattern<\/em>&#8216;\u0131 inceliyor olaca\u011f\u0131z.<\/p>\n<p><strong><em>Null Object Design Pattern<\/em><\/strong>, bir nevi nesnelerin kullan\u0131m\u0131n\u0131 ve davran\u0131\u015flar\u0131n\u0131 a\u00e7\u0131klayan ve <code>null<\/code> durumlara istinaden ekstradan \u00f6zel kontrollere gerek kalmaks\u0131z\u0131n yaz\u0131l\u0131m\u0131n ak\u0131\u015f\u0131n\u0131 sa\u011flayan bir tasar\u0131m desenidir. \u015eimdi gelin bu tasar\u0131m\u0131n tam anatomisini inceleyelim.<\/p>\n<h5>Null Durumlar\u0131n\u0131n Kritikli\u011fi?<\/h5>\n<p>Bir probleme odakl\u0131 hususi algoritma geli\u015ftirilirken yahut mimarisel \u00e7al\u0131\u015fmalar yaparken genellikle kullan\u0131lan objelerin <code>null<\/code> olup olmad\u0131\u011f\u0131 bizler i\u00e7in \u00f6nemlidir! Misal vermemiz gerekirse;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Obj\r\n    {\r\n        \/\/...\r\n    }\r\n<\/pre>\n<p>yukar\u0131da tan\u0131mlanan &#8216;Obj&#8217; isimli model \u00fczerinden a\u015fa\u011f\u0131daki referans\u0131 de\u011ferlendirirsek e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Obj o = null;\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code>null<\/code> de\u011fer bar\u0131nd\u0131rmaktad\u0131r. Yani bu referans \u00f6z\u00fcnde de\u011fersizdir. Daha teknik konu\u015fmak gerekirse bellekte herhangi bir nesneyi i\u015faretlememektedir. Dolay\u0131s\u0131yla bizler bu referansa olan ihtiyaca istinaden \u00f6ncelikli olarak bu referans\u0131n bir nesneyi i\u015faret edip etmedi\u011finden emin olmal\u0131 ard\u0131ndan kullan\u0131ma odaklanmal\u0131y\u0131z. \u00d6yle de\u011fil mi?<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Obj o = null;\r\n            if (o != null)\r\n            {\r\n                \/\/E\u011fer o referans\u0131 null de\u011filse(yani bir nesneyi referans ediyorsa\r\n                \/\/o zaman i\u015flem yap!\r\n            }\r\n<\/pre>\n<p>Yukar\u0131dakine koda bakarsan\u0131z, \u00e7al\u0131\u015fma hayat\u0131n\u0131z boyunca benzerine \u00e7ok \u015fahit oldu\u011funuza eminim diyebilirim. <em><strong>Peki bizler neden bu kontrol\u00fc yap\u0131yoruz?<\/strong><\/em> diye sordu\u011fumuzda cevab\u0131 basit! Olmayan yani teknik olarak <code>null<\/code> olan bir referans \u00fczerinden herhangi bir i\u015flem yapmaya \u00e7al\u0131\u015fmak olduk\u00e7a tutars\u0131z bir durumdur. \u0130\u015fte bu durumda yaz\u0131l\u0131msal olarak hataya sebep olacakt\u0131r.<\/p>\n<p>Mesela yukar\u0131daki kodu \u015f\u00f6yle kullan\u0131rsak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Obj o = null;\r\n            o.ToString();\r\n<\/pre>\n<p><code>null<\/code> olan &#8216;o&#8217; referans\u0131 \u00fczerinden(yani olmayan bir nesne \u00fczerinde) bir i\u015flem yap\u0131lmaya \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131 i\u00e7in hi\u00e7 yabanc\u0131 olmad\u0131\u011f\u0131m\u0131z <code style=\"color:red;font-size:13px;\">NullReferenceException<\/code> hatas\u0131yla kar\u015f\u0131laca\u011f\u0131z. \u0130\u015fte bu y\u00fczden \u00f6ncelikle bu nesnenin <code>null<\/code> olup olmad\u0131\u011f\u0131ndan emin olmam\u0131z gerekmektedir.<\/p>\n<p><strong><em>\u0130yi de hoca! Bu referans\u0131n <code>null<\/code> oldu\u011fu zaten a\u015fikar!<\/em><\/strong> dedi\u011finizi duyar gibiyim. Evet, haliyle benim de \u00f6rnek olsun diye bu referans\u0131 kulland\u0131\u011f\u0131m a\u015fikar \ud83d\ude42 Keza burada dikkatinizi \u00e7ekmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m husus bu tarz kontrollerin referanslarla \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131 s\u00fcrece ka\u00e7\u0131n\u0131lmaz olmas\u0131 \u00fczerinedir. Nihayetinde ger\u00e7ek d\u00fcnyada elde edilen objeler genellikle metotlardan ya da propertylerden geldikleri i\u00e7in ilgili objelerin <code>null<\/code> olup olmamalar\u0131 a\u015fikarl\u0131ktan ziyade me\u00e7hul olmaktad\u0131r.<\/p>\n<h5>Null Object Design Pattern&#8217;\u0131n Amac\u0131 Nedir?<\/h5>\n<p>Yukar\u0131da konu\u015ftu\u011fumuz gibi bir referans bo\u015f yani <code>null<\/code> olabilir. Ancak bizler bu <code>null<\/code> durumu, kodu if\/else yap\u0131lar\u0131na bo\u011fmaks\u0131z\u0131n hi\u00e7bir \u015fey yapmadan \u015feffaf bir \u015fekilde nas\u0131l ele alabiliriz sorusunu sorarak yola \u00e7\u0131kaca\u011f\u0131z! Bunun i\u00e7in <em><strong>Null Object<\/strong><\/em> diye bir kavram \u00fcretece\u011fiz.<\/p>\n<blockquote><p><em style=\"color:green;\">Null Object; bir referans\u0131n <code>null<\/code> durumunu ifade eden ve herhangi bir davran\u0131\u015f\u0131 olmayan n\u00f6tr bir nesnedir.<\/em><\/p><\/blockquote>\n<p>B\u00f6ylece bir referans\u0131n bo\u015f olmas\u0131 durumlar\u0131nda <code>null<\/code> yerine varsay\u0131lan olarak hi\u00e7bir davran\u0131\u015f sergilemeyen Null Object&#8217;i kullanarak <code>null<\/code>&#8216;dan kaynakl\u0131 olas\u0131 hatalara kar\u015f\u0131 if\/else kontrollerinden kodu ar\u0131nd\u0131rabilecek ve k\u0131smi olarak <code>null<\/code> durumunu kaps\u00fclleyerek ak\u0131\u015f\u0131n temiz bir \u015fekilde seyretmesini m\u00fcmk\u00fcn k\u0131labilece\u011fiz.<\/p>\n<blockquote><p><em style=\"color:purple;\">Null Object Design Pattern; de\u011feri\/nesnesi olmayan bir referans\u0131n <code>null<\/code> yerine herhangi bir davran\u0131\u015f\u0131 olmayan n\u00f6tr bir nesneyi(Null Object) temsil ederek kodu kontrol yap\u0131lar\u0131ndan ar\u0131nd\u0131rma stratejisidir.<\/em><\/p><\/blockquote>\n<h5>Null Object Design Pattern Teoride Nas\u0131l Kullan\u0131l\u0131r?<\/h5>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-300x184.gif\" alt=\"Null Object Design Pattern Nedir? Nas\u0131l Uygulan\u0131r?\" width=\"300\" height=\"184\" class=\"alignleft size-medium wp-image-23086\" \/><\/a>Bir nesneye Null Object Design Pattern&#8217;\u0131 uygulayabilmek i\u00e7in \u00f6ncelikle bu kontrol\u00fcn yap\u0131laca\u011f\u0131 t\u00fcre ait i\u015fbirlik\u00e7i(collaborator) s\u0131n\u0131flar olu\u015fturmam\u0131z gerekmektedir. <em><strong>Neden i\u015fbirlik\u00e7i s\u0131n\u0131f?<\/strong><\/em> diye sorarsan\u0131z e\u011fer ilgili nesnenin <code>null<\/code> durumu yerine herhangi bir \u015fey yapmayan ve ihtiya\u00e7 duyulmayan, o nesnenin <code>null<\/code> durumuna kar\u015f\u0131l\u0131k gelen ama yine de bellekte bir kar\u015f\u0131l\u0131\u011f\u0131 olan hali olarak d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p>Misal, \u00fcstteki \u015femaya g\u00f6z atarsan\u0131z e\u011fer uygulamada kullan\u0131lacak esas nesne &#8216;RealOperation&#8217; nesnesiyken, bu nesnenin <code>null<\/code> durumunda kullan\u0131lacak nesne ise &#8216;NullOperation&#8217; nesnesidir. &#8216;RealOperation&#8217; nesnesi i\u00e7erisinde &#8216;request&#8217; metodunda gerekli operasyonu\/i\u015fi ger\u00e7ekle\u015ftirmektedir. Lakin &#8216;NullOperation&#8217; nesnesi ise birebir &#8216;RealOperation&#8217; nesnesiyle ayn\u0131 i\u00e7eri\u011fe sahip olsa dahi i\u00e7erisindeki &#8216;request&#8217; metodunda herhangi bir i\u015flem y\u00fcr\u00fctmemektedir. Yani bo\u015ftur. Davran\u0131\u015f\u0131 yoktur. N\u00f6tr davran\u0131\u015f sergiler. Tek gayesi &#8216;RealOperation&#8217; nesnesinin <code>null<\/code> durumunu ifade etmektir.<\/p>\n<p>&#8216;Client&#8217; yapm\u0131\u015f oldu\u011fu i\u015flem s\u00fcrecinde &#8216;RealOperation&#8217; nesnesine ihtiya\u00e7 duydu\u011funda ve ilgili nesnenin \u00fcretilmedi\u011fi ya da olmad\u0131\u011f\u0131 durumda <code>null<\/code> yerine &#8216;NullOperation&#8217; nesnesi elde edecek ve herhangi bir if\/else kontrol\u00fcne gerek duymaks\u0131z\u0131n &#8216;request&#8217; metodunu tetikleyebilecektir. \u00c7\u00fcnk\u00fc art\u0131k k\u00e2h &#8216;RealOperation&#8217; k\u00e2h &#8216;NullOperation&#8217; olmak \u00fczere kesinlikle bir nesne gelecektir. Burada her iki nesnenin de client taraf\u0131ndan kar\u015f\u0131lanabilmesi i\u00e7in &#8216;AbstractOperation&#8217; ismi verilen base class ile refere edildi\u011fine dikkatinizi \u00e7ekerim.<\/p>\n<p>\u015eimdi gelin, Null Object Design Pattern&#8217;\u0131n akt\u00f6rlerini daha net kavramsalla\u015ft\u0131rarak ele alal\u0131m;<\/p>\n<ul>\n<li><strong><em>Abstract Object<\/em><\/strong><br \/>\nClient&#8217;\u0131n kullanaca\u011f\u0131 aray\u00fcz\u00fc temsil eder. Real Object ile Null Object&#8217;in t\u00fcreyece\u011fi s\u0131n\u0131ft\u0131r. Yukar\u0131daki \u015femada &#8216;AbstractOperation&#8217;a kar\u015f\u0131l\u0131k gelmektedir.\n<\/li>\n<li><strong><em>Real Object<\/em><\/strong><br \/>\nClient&#8217;\u0131n bekledi\u011fi davran\u0131\u015f\u0131 sa\u011flayan somut s\u0131n\u0131ft\u0131r. \u015eemada &#8216;RealOperation&#8217;a kar\u015f\u0131l\u0131k gelmektedir.\n<\/li>\n<li><strong><em>Null Object<\/em><\/strong><br \/>\nHi\u00e7bir \u015fey yapmayan, herhangi bir davran\u0131\u015f sergilemeyen somut s\u0131n\u0131ft\u0131r. Real Object&#8217;in <code>null<\/code> halidir. Hi\u00e7bir \u015fey yapmaman\u0131n tam olarak ne anlama geldi\u011fi, client&#8217;\u0131n ne t\u00fcr bir davran\u0131\u015f bekledi\u011fine ba\u011fl\u0131d\u0131r. Dolay\u0131s\u0131yla hi\u00e7bir \u015fey yapmaman\u0131n birden fazla yolu olabilece\u011finden dolay\u0131 birden fazla Null Object s\u0131n\u0131f\u0131 olu\u015fturulabilir. \u015eemada &#8216;NullOperation&#8217;a kar\u015f\u0131l\u0131k gelmektedir.\n<\/li>\n<\/ul>\n<blockquote><p><em>Null Object Design Pattern, null durumlar\u0131n\u0131n i\u015flenmesinin client&#8217;tan soyutlanmas\u0131 i\u00e7in kullan\u0131l\u0131r!<\/em><\/p><\/blockquote>\n<h5>Null Object Design Pattern&#8217;\u0131n Pratik \u00d6rne\u011fini Yapal\u0131m<\/h5>\n<p>Evet, t\u00fcm bu tan\u0131mlamalara istinaden konuyu daha da netle\u015ftirecek bir \u00f6rnek yapal\u0131m. \u00d6rne\u011fimizde bir <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-repository-design-patternrepository-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Repository<\/a>&#8216;den gelecek olan &#8216;Employee&#8217; nesnesinin Null Object Design Pattern e\u015fli\u011finde in\u015fas\u0131n\u0131 inceleyelim.<\/p>\n<ul>\n<li><strong>1. Ad\u0131m<\/strong><br \/>\n\u0130lk olarak client&#8217;\u0131n kullanaca\u011f\u0131 Abstract Object aray\u00fcz\u00fcne kar\u015f\u0131l\u0131k gelecek olan &#8216;AbstractEmployee&#8217; modelini olu\u015fturarak ba\u015flayal\u0131m. Bu model ister interface isterseniz de abstract class olarak tan\u0131mlanabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Abstract Object\r\n    abstract class AbstractEmployee\r\n    {\r\n        public abstract int Id { get; set; }\r\n        public abstract string Name { get; set; }\r\n        public abstract string Surname { get; set; }\r\n        public abstract void GetFullName();\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong>2. Ad\u0131m<\/strong><br \/>\nArd\u0131ndan bu aray\u00fczden t\u00fcreyecek olan &#8216;Employee&#8217; isimli Real Object nesnesini olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Real Object\r\n    class Employee : AbstractEmployee\r\n    {\r\n        public override int Id { get; set; }\r\n        public override string Name { get; set; }\r\n        public override string Surname { get; set; }\r\n\r\n        public override void GetFullName()\r\n            =&gt; Console.WriteLine($&quot;{Name} {Surname}&quot;);\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong>3. Ad\u0131m<\/strong><br \/>\nVe &#8216;Employee&#8217; nesnesinin i\u015fbirlik\u00e7i(collaborator) nesnesi olan &#8216;NullEmployee&#8217; isimli Null Object nesnesini in\u015fa edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    \/\/Null Object\r\n    class NullEmployee : AbstractEmployee\r\n    {\r\n        private NullEmployee() { }\r\n        static NullEmployee nullEmployee;\r\n        public static NullEmployee Nil =&gt; nullEmployee ?? (nullEmployee = new());\r\n\r\n        public override int Id { get; set; }\r\n        public override string Name { get; set; }\r\n        public override string Surname { get; set; }\r\n        public override void GetFullName()\r\n            =&gt; Console.WriteLine(&quot;Employee not found!&quot;);\r\n    }\r\n<\/pre>\n<p>Null Object nesnesinin <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-singleton-design-patternsingleton-tasarim-deseni\/\" rel=\"noopener\" target=\"_blank\">Singleton<\/a> olarak tasarland\u0131\u011f\u0131na dikkatinizi \u00e7ekerim.<\/p>\n<p>Ayr\u0131ca bu nesnenin &#8216;Employee&#8217; nesnesiyle ayn\u0131 i\u00e7eri\u011fe sahip oldu\u011funa lakin hi\u00e7bir \u015fey sergilemedi\u011fine de dikkatinizi \u00e7ekerim&#8230;\n<\/li>\n<li><strong>4. Ad\u0131m<\/strong><br \/>\nKurgu gere\u011fi formaliteden bir repository s\u0131n\u0131f\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class EmployeeRepository\r\n    {\r\n        \/\/Veri kayna\u011f\u0131 misali...\r\n        List&lt;AbstractEmployee&gt; employeeList = new()\r\n        {\r\n            new Employee() { Id = 1, Name = &quot;Ahmet&quot;, Surname = &quot;Y\u0131ld\u0131z&quot; },\r\n            new Employee() { Id = 2, Name = &quot;Mehmet&quot;, Surname = &quot;Y\u0131ld\u0131z&quot; },\r\n            new Employee() { Id = 3, Name = &quot;Sebahattin&quot;, Surname = &quot;Y\u0131ld\u0131z&quot; },\r\n            new Employee() { Id = 4, Name = &quot;Malko\u00e7&quot;, Surname = &quot;Y\u0131ld\u0131z&quot; },\r\n            new Employee() { Id = 5, Name = &quot;Cuma&quot;, Surname = &quot;Y\u0131ld\u0131z&quot; },\r\n        };\r\n\r\n        public List&lt;AbstractEmployee&gt; GetWhere(Func&lt;AbstractEmployee, bool&gt; method)\r\n            =&gt; employeeList.Where(method).ToList();\r\n        public AbstractEmployee GetSingle(Func&lt;AbstractEmployee, bool&gt; method)\r\n            =&gt; employeeList.FirstOrDefault(method);\r\n    }\r\n<\/pre>\n<\/li>\n<li><strong>5. Ad\u0131m<\/strong><br \/>\nVe bu repository s\u0131n\u0131f\u0131n\u0131 kullanan bir servis olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class EmployeeService\r\n    {\r\n        readonly EmployeeRepository _employeeRepository;\r\n        public EmployeeService(EmployeeRepository employeeRepository)\r\n            =&gt; _employeeRepository = employeeRepository;\r\n        public AbstractEmployee GetEmployeeByName(string name)\r\n            =&gt; _employeeRepository.GetSingle(e =&gt; e.Name == name).NullCheck();\r\n    }\r\n<\/pre>\n<p>7. sat\u0131r\u0131n sonunda \u00e7a\u011fr\u0131lan &#8216;NullCheck&#8217; fonksiyonuna g\u00f6z atarsan\u0131z e\u011fer bu ilgili nesnenin <code>null<\/code> olup olmama durumuna g\u00f6re geriye gelen &#8216;Employee&#8217; nesnesini ya da &#8216;NullEmployee&#8217; nesnesini d\u00f6nd\u00fcren taraf\u0131m\u0131zca extension haz\u0131rlanm\u0131\u015f bir fonksiyondur.\n<\/li>\n<li><strong>6. Ad\u0131m<\/strong><br \/>\n\u0130lgili &#8216;NullCheck&#8217; extension metodunu haz\u0131rlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static class Extensions\r\n    {\r\n        public static AbstractEmployee NullCheck(this AbstractEmployee instance)\r\n            =&gt; instance ?? NullEmployee.Nil;\r\n    }\r\n<\/pre>\n<\/li>\n<\/ul>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Null Object Design Pattern&#8217;\u0131n uygulanmas\u0131 olduk\u00e7a basit. Olu\u015fturulan bu tasar\u0131m\u0131 a\u015fa\u011f\u0131daki gibi kulland\u0131\u011f\u0131m\u0131zda nas\u0131l sonu\u00e7 verdi\u011fini gelin hep beraber inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            EmployeeService employeeService = new(new());\r\n            AbstractEmployee e = employeeService.GetEmployeeByName(&quot;Ahmet&quot;);\r\n            e.GetFullName();\r\n            e = employeeService.GetEmployeeByName(&quot;Mehmet&quot;);\r\n            e.GetFullName();\r\n            e = employeeService.GetEmployeeByName(&quot;Muiddin&quot;);\r\n            e.GetFullName();\r\n        }\r\n<\/pre>\n<div id=\"attachment_23099\" style=\"width: 169px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23099\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir.png\" alt=\"Null Object Design Pattern Nedir Nas\u0131l Uygulan\u0131r\" width=\"159\" height=\"55\" class=\"size-full wp-image-23099\" \/><\/a><p id=\"caption-attachment-23099\" class=\"wp-caption-text\">Null Object Design Pattern \u00d6rnek \u00c7al\u0131\u015fma \u00c7\u0131kt\u0131s\u0131<\/p><\/div>\n<p><strong><em>Peki biz Null Object Design Pattern ile neyi sa\u011flam\u0131\u015f olduk?<\/em><\/strong> bu soruyu \u00f6nceden cevapland\u0131rmaya \u00e7al\u0131\u015fm\u0131\u015f olsam da san\u0131r\u0131m tekrar sordu\u011funuzu duyar gibiyim&#8230; O halde yukar\u0131da yap\u0131lan tasar\u0131m\u0131n olmad\u0131\u011f\u0131 bir senaryoda client&#8217;\u0131n nas\u0131l bir kullan\u0131ma maruz kalaca\u011f\u0131n\u0131 a\u015fa\u011f\u0131da zahiren g\u00f6rmenizde fayda olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-1.png\" alt=\"Null Object Design Pattern Nedir Nas\u0131l Uygulan\u0131r\" width=\"883\" height=\"395\" class=\"aligncenter size-full wp-image-23101\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-1.png 883w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-1-300x134.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Null-Object-Design-Pattern-Nedir-Nasil-Uygulanir-1-768x344.png 768w\" sizes=\"auto, (max-width: 883px) 100vw, 883px\" \/><\/a>\u0130\u015fte, ortaya koyulan fark ilgili nesnenin <code>null<\/code> kontrol\u00fc yap\u0131larak kodun a\u015f\u0131r\u0131 \u015fi\u015firilmesini ortadan kald\u0131rm\u0131\u015f olmam\u0131zd\u0131r.<\/p>\n<p><em style=\"color:red;font-size:13px;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/unlem.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/unlem.png\" alt=\"\" width=\"32\" height=\"32\" class=\"alignleft size-full wp-image-23109\" \/><\/a>Null Object Design Pattern&#8217;da stratejisinde, nesnenin herhangi bir davran\u0131\u015f sergilemeyen <code>null<\/code> halini olu\u015fturman\u0131n(Null Object), client a\u00e7\u0131s\u0131ndan in\u015fa edilen kodun daha az \u00f6ng\u00f6r\u00fclebilir bir durum ortaya \u00e7\u0131kard\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Nihayetinde client <code>null<\/code> yerine Null Object nesnesinin gelece\u011fini bilemeyebilir yahut herhangi bir d\u00f6k\u00fcmandan beslenmedi\u011fi s\u00fcrece her daim <code>null<\/code>&#8216;un gelmeyece\u011finin garanti olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnemeyebilir. \u0130\u015fte b\u00f6yle bir durumda if\/else kontrol\u00fc uygulayarak algoritman\u0131n seyrinde farkl\u0131 hatalara sebebiyet verilebilir. \u0130\u015fte bu durum d\u00f6k\u00fcmantasyon ve domain uzmanlar\u0131yla do\u011fru etkile\u015fim neticesinde atlat\u0131labilecek nazik bir haldir. Onun d\u0131\u015f\u0131nda ekstradan yan etki yaratabilece\u011fine dair bir durum yoktur.<\/em><\/p>\n<h5>C#&#8217;da Null Durumlar\u0131na Kar\u015f\u0131 Ba\u015fka Hangi Refleksler \u00dcretilebilir?<\/h5>\n<ul>\n<li><strong><em>Extension Metotlar<\/em><\/strong><br \/>\nC# programlama dilinde <code>null<\/code> olan bir referans \u00fczerinden herhangi bir member&#8217;a eri\u015fim yap\u0131lamaz. Yap\u0131ld\u0131\u011f\u0131 taktirde <code style=\"color:red;font-size:13px;\">NullReferenceException<\/code> hatas\u0131yla kar\u015f\u0131la\u015f\u0131l\u0131r. Bu durumdan daha \u00f6nceki sat\u0131rlar\u0131m\u0131zda bahsetmi\u015ftik. Lakin <code>null<\/code> olan bir referans \u00fczerinden <a href=\"https:\/\/www.gencayyildiz.com\/blog\/extension-metod-yazilisi-ve-kullanimi\/\" rel=\"noopener\" target=\"_blank\">extension metotlara<\/a> eri\u015febilmekteyiz. Bunun nedeni extension metotlar\u0131n static olarak tan\u0131mlanarak bir nesneye ihtiya\u00e7 duymamalar\u0131ndand\u0131r. Dolay\u0131s\u0131yla <code>null<\/code> referanslar\u0131 kontrol etmek i\u00e7in ayriyetten extension metotlar tercih edilebilir.<\/p>\n<p>\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static class Extension\r\n    {\r\n        public static bool IsNull&lt;T&gt;(this T instance)\r\n            =&gt; instance == null;\r\n        public static bool IsNotNull&lt;T&gt;(this T instance)\r\n            =&gt; instance != null;\r\n    }\r\n<\/pre>\n<p>Ya da bu yap\u0131y\u0131 yukar\u0131da ger\u00e7ekle\u015ftirdi\u011fimiz pratik \u00f6rne\u011fin 6. ad\u0131m\u0131ndaki &#8216;NullCheck&#8217; metodu gibi in\u015fa edebilir ve <code>null<\/code> durumunda geriye Null Object d\u00f6nebilirsiniz.\n<\/li>\n<li><strong><em>Null Conditional Operat\u00f6r\u00fc<\/em><\/strong><br \/>\nC# programlama dilinde <code>null<\/code> referanslara kar\u015f\u0131 if\/else yap\u0131s\u0131yla yap\u0131lan kompleks kontrollerin yerine 6.0 versiyonunda <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-null-conditional-operators\/\" rel=\"noopener\" target=\"_blank\">Null Conditional Operators<\/a> \u00f6zelli\u011fi gelmi\u015f bulunmaktad\u0131r. Bu operat\u00f6r sayesinde if\/else kontrollerine gerek kalmaks\u0131z\u0131n nesneleri a\u015fa\u011f\u0131daki gibi kontrol edebilir ve varsa e\u011fer member&#8217;lar\u0131na eri\u015fim sa\u011flayabiliriz.<\/p>\n<p style=\"text-align: center;\"><span style=\"color: #800080;\"><em><strong>var x = {Eleman1}<span style=\"color: #ff6600;\">?.<\/span>{Eleman2}<span style=\"color: #ff6600;\">?.<\/span>{Eleman3}\u2026<\/strong><\/em><\/span><\/p>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her bir <span style=\"color: #ff6600;\">?<\/span> operat\u00f6r\u00fc e\u015fli\u011finde ilgili objenin <code>null<\/code> olup olmad\u0131\u011f\u0131 kontrol edilmekte ve e\u011fer <code>null<\/code> de\u011filse <span style=\"color: #ff6600;\">.(nokta)<\/span> operat\u00f6r\u00fc ile member&#8217;\u0131 tetiklenmektedir.<\/p>\n<p>\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Obj\r\n    {\r\n        \/\/...\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Obj o = null;\r\n            o?.ToString();\r\n        }\r\n<\/pre>\n<\/li>\n<\/ul>\n<blockquote><p><em style=\"color:#e83e8c;\">Null Object Design Pattern her ne kadar ad\u0131nda Design Pattern etiketini ta\u015f\u0131sada \u00f6z\u00fcnde bir tasar\u0131m deseni de\u011fil <u>Refactoring<\/u> tekni\u011fidir!<\/em><\/p><\/blockquote>\n<p><em style=\"color:#2980B9;font-size:13px;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/info.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/info.png\" alt=\"\" width=\"32\" height=\"32\" class=\"alignleft size-full wp-image-23142\" \/><\/a>Bazen Null Object&#8217;ler a\u015f\u0131r\u0131 basit ve dummy data olarak g\u00f6r\u00fclebilmektedirler. Ancak ger\u00e7ekte Null Object&#8217;ler di\u011fer nesnelerle etkile\u015fime girmeden ne yap\u0131lmas\u0131 gerekti\u011fini her zaman tam olarak bildi\u011finden dolay\u0131 esas\u0131nda \u00e7ok ak\u0131ll\u0131 nesnelerdir!<\/em><\/p>\n<h5>Genel Kurallar<\/h5>\n<ul>\n<li>Null Object s\u0131n\u0131flar\u0131 genellikle singleton olarak uygulan\u0131rlar. \u00c7\u00fcnk\u00fc bu s\u0131n\u0131flar uygulamada tek bir nesnenin <code>null<\/code> durumunu ifade edeceklerinden dolay\u0131 her ihtiya\u00e7 oldu\u011funda tekrar tekrar \u00fcretmektense ve genellikle herhangi bir de\u011fi\u015fecek state&#8217;leri olmad\u0131\u011f\u0131ndan bir\u00e7ok instance&#8217;\u0131 ayn\u0131 olaca\u011f\u0131ndan singleton olarak tasarlamak maliyet a\u00e7\u0131s\u0131ndan daha elveri\u015fli olacakt\u0131r.<\/li>\n<li>Baz\u0131 client&#8217;lar Null Object&#8217;in farkl\u0131 \u015fekillerde hi\u00e7bir \u015fey yapmamas\u0131n\u0131 bekleyebilir. Misal olarak, kimi Null Object loglama yap\u0131yorken kimisi mail g\u00f6nderebilir. Ya da bir ba\u015fkas\u0131 hakkaten hi\u00e7bir \u015fey yapmayabilir. \u0130\u015fte bu durumlar i\u00e7in birden fazla Null Object s\u0131n\u0131f\u0131 gerekli olacakt\u0131r.<\/li>\n<li>Uygulamalarda demo\/deneme s\u00fcr\u00fcmleri i\u00e7in ziyaret\u00e7iler a\u00e7\u0131s\u0131ndan genellikle Null Object&#8217;ler kullan\u0131labilir.<\/li>\n<\/ul>\n<h5>Di\u011fer Kal\u0131plarla \u0130li\u015fkisi<\/h5>\n<ul>\n<li><strong>Proxy<\/strong> <span style=\"font-size:12px;color:green;\">\u0130li\u015fki durumu : <span style=\"color:orange;\">Benzerlik<\/span><\/span><br \/>\nProxy, i\u015f yapan ger\u00e7ek bir nesneye dolayl\u0131 olarak kontroll\u00fc bir \u015fekilde eri\u015febilmemizi sa\u011flar. Null Object ise ger\u00e7ek bir nesneyi gizlemez ve ona vekillik yapmaz! Direkt ger\u00e7ek nesnenin yerini al\u0131r.<\/p>\n<p>Proxy, ger\u00e7ek bir nesne gibi davranabilmek ve \u00f6zne olabilmek i\u00e7in mutasyona u\u011frar lakin Null Object ise ger\u00e7ek davran\u0131\u015f\u0131 sa\u011flamak i\u00e7in herhangi bir mutasyona u\u011framaks\u0131z\u0131n her zaman hi\u00e7bir \u015fey yapmama davran\u0131\u015f\u0131 sergiler.<\/p>\n<p>\u0130\u015fte bu durumda Null Object Design Pattern, Proxy Design Pattern&#8217;a benziyor olabilir.\n<\/li>\n<li><strong>Strategy<\/strong> <span style=\"font-size:12px;color:green;\">\u0130li\u015fki durumu : <span style=\"color:orange;\">\u00d6zel durumu olabilir<\/span><\/span><br \/>\nStrategy, bir i\u015fi ger\u00e7ekle\u015ftirmek i\u00e7in farkl\u0131 yakla\u015f\u0131mlar olarak birka\u00e7 concrete strategy nesnesi olu\u015fturur. Bu yakla\u015f\u0131mlardan biri s\u00fcrekli olarak hi\u00e7bir \u015fey yapmamaksa e\u011fer i\u015fte o concrete strategy nesnesi \u00f6z\u00fcnde bir Null Object nesnesi mahiyetindedir. Bu durumda Null Object Design Pattern, Strategy Design Pattern&#8217;\u0131n \u00f6zel bir durumu olabilir.\n<\/li>\n<li><strong>State<\/strong> <span style=\"font-size:12px;color:green;\">\u0130li\u015fki durumu : <span style=\"color:orange;\">\u00d6zel durumu olabilir<\/span><\/span><br \/>\nState tasar\u0131m deseninde, her bir concrete state nesnesinde belli ba\u015fl\u0131 metotlar farkl\u0131 durumlarda i\u015f yapmak i\u00e7in uyguland\u0131\u011f\u0131ndan baz\u0131 metotlar hi\u00e7bir davran\u0131\u015f g\u00f6stermezler. Salt olarak bo\u015fturlar. Ancak bir concrete state nesnesi vard\u0131r ki o duruma \u00f6zel t\u00fcm metotlar hi\u00e7bir \u015fey yapmaks\u0131z\u0131n in\u015fa edilir. Haliyle bu durumda Null Object Design Pattern, State Design Pattern&#8217;\u0131n \u00f6zel bir durumu olabilir.\n<\/li>\n<\/ul>\n<h5>Ele\u015ftiriler<\/h5>\n<p>Null Object Design Pattern, program ak\u0131\u015f\u0131nda olu\u015fan hatalar\u0131n normal program y\u00fcr\u00fctmesi gibi g\u00f6r\u00fcnmesine neden olaca\u011f\u0131ndan dolay\u0131 dikkat edilmesi gereken tasar\u0131md\u0131r. Ayr\u0131ca \u00f6nceki paragraflarda de\u011finmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131 gibi client taraf\u0131ndan ilgili yap\u0131ya Null Object tasar\u0131m\u0131n\u0131n uyguland\u0131\u011f\u0131 bilinmeyebilir ve b\u00f6ylece if\/else ile <code>null<\/code> kontrol\u00fc uygulanarak mant\u0131ksal hatalara sebebiyet verebilme ihtimali vard\u0131r. Haliyle bu y\u00f6nlerinden dolay\u0131 hem dikkatli kullan\u0131lmal\u0131d\u0131r hem de client a\u00e7\u0131s\u0131ndan d\u00f6k\u00fcmantasyon ve domain expert&#8217;lerle ili\u015fki olduk\u00e7a \u00f6nem kazanmaktad\u0131r. Ayr\u0131ca sadece bo\u015f kontrollerden ka\u00e7\u0131nmak ve kodu daha okunabilir k\u0131lmak i\u00e7in bu kal\u0131b\u0131 uygulamaya \u00f6zen g\u00f6sterilmesi gerekmektedir.<\/p>\n<blockquote><p><em>Her \u015fey bir nesnedir! Bir nesnenin yoklu\u011fu ba\u015fka bir nesne taraf\u0131ndan modellenir.<\/p>\n<div style=\"text-align:right;font-size:11px;\">Smalltalk \u0130lkesi<\/div>\n<p><\/em><\/p><\/blockquote>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde; C#, Java, Python vs. gibi OOP dillerinde null olabilen referanslar\u0131n getirisi olan olas\u0131 hata durumlar\u0131yla kontrol yap\u0131lar\u0131ndan ziyade daha tasar\u0131msal olarak ba\u015fa \u00e7\u0131kabilmenin bir yolu olan Null Object Design Pattern&#8216;\u0131 inceliyor&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":23086,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[750,4404,4405,4403,4406],"class_list":["post-23075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-design-pattern","tag-null-object","tag-null-object-d-p","tag-null-object-design-pattern","tag-refactoring"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=23075"}],"version-history":[{"count":77,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23075\/revisions"}],"predecessor-version":[{"id":23157,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23075\/revisions\/23157"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23086"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}