{"id":1325,"date":"2019-08-06T20:13:59","date_gmt":"2019-08-06T20:13:59","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=1325"},"modified":"2020-04-05T13:40:51","modified_gmt":"2020-04-05T13:40:51","slug":"solid-2-acik-kapali-prensibi","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/","title":{"rendered":"SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/effectivesoftwaredesign.files.wordpress.com\/2015\/02\/solid.jpg\" alt=\"Image result for solid principles\" width=\"483\" height=\"386\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Merhabalar arkada\u015flar, yaz yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131mda bir s\u00fcre \u00f6nce ba\u015flad\u0131\u011f\u0131m SOLID prensiplerine ili\u015fkin yaz\u0131 serisinin ikincisini sizler ile payla\u015faca\u011f\u0131m (yaz\u0131da sonraki hafta demi\u015fim ama bu birka\u00e7 ay\u0131 buldu, o sebeple kusura bakmay\u0131n :)).\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0130lk yaz\u0131ya a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Ayn\u0131 zamanda SOLID prensipler genel anlamda neye hizmet ediyor ve genel motivasyon i\u00e7in de ilk yaz\u0131ya ba\u015fvurabilirsiniz:<\/span><\/p>\n<ol>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/05\/10\/solid-1-tek-sorumluluk-prensibi\/\">SOLID 1 &#8211; Tek Sorumluluk Prensibi<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\">SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi<\/a><\/strong><\/span><\/li>\n<li><a href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/09\/08\/solid-3-liskovun-yerine-gecme-prensibi\/\"><strong><span style=\"color: #008000;\">SOLID 3 &#8211; &#8220;Liskov Substitution&#8221; Prensibi<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/www.yazilimperver.com\/?p=1430&amp;preview=true\"><span style=\"color: #008000;\"><strong>SOLID 4 &#8211; Aray\u00fcz Ayr\u0131\u015ft\u0131rma Prensibi<\/strong><\/span><\/a><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Bu yaz\u0131m\u0131z\u0131n konusu <strong>A\u00e7\u0131k\/Kapal\u0131 Prensibi (\u201cOpen-Closed Principle\u201d- OCP<\/strong>).\u00a0\u00d6ncelikle sizlere bu prensibe ili\u015fkin k\u0131saca bilgi vermeye \u00e7al\u0131\u015faca\u011f\u0131m, daha sonra da \u00f6rnek bir kod par\u00e7as\u0131 \u00fczerinden bunu nas\u0131l uygulayabilece\u011fimize birlikte bakaca\u011f\u0131z.<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>A\u00e7\u0131k\/Kapal\u0131 Prensibi (Open\/Closed Principle)<\/strong><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Prensibinin amac\u0131n\u0131 tek c\u00fcmle ile a\u015fa\u011f\u0131daki gibi \u00f6zetleyebiliriz:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0\u201cYaz\u0131l\u0131m birimleri (ki bunlar s\u0131n\u0131flar, mod\u00fcller veya fonksiyonlar olabilir) geni\u015flemeye <\/span><b><em>a\u00e7\u0131k<\/em> <\/b><span style=\"font-weight: 400;\">ama modifikasyona <\/span><b><em>kapal\u0131<\/em> <\/b><span style=\"font-weight: 400;\">olmal\u0131d\u0131r.\u201d (Bertrand Meyer).\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu prensip, SOLID prensiplerin aras\u0131nda en \u00f6nemli olanlar\u0131ndan birisidir (Hatta Robert C. Martin taraf\u0131ndan nesne y\u00f6nelimli tasar\u0131m\u0131n en \u00f6nemli prensibi oldu\u011fu ifade edilmi\u015ftir) ve Nesne Y\u00f6nelimli Tasar\u0131m yakla\u015f\u0131m\u0131n\u0131n da tam kalbinde bulunmaktad\u0131r.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Basit bir \u015fekilde ifade etmek gerekirse, her gereksinim de\u011fi\u015fti\u011finde, yazm\u0131\u015f oldu\u011fumuz kabiliyete ili\u015fkin kodlar\u0131 de\u011fi\u015ftirmek zorunda kalmamal\u0131y\u0131z ya da yaz\u0131l\u0131mlar\u0131m\u0131z\u0131 bunu g\u00f6z \u00f6n\u00fcne alarak geli\u015ftirmeliyiz.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Peki yapmazsak ne olur? Bir uygulama tasarlad\u0131n\u0131z ve bu uygulamaya ili\u015fkin de\u011fi\u015fiklikler gerekmekte, e\u011fer bu de\u011fi\u015fiklikler, ilgili mod\u00fcl dahil bir\u00e7ok alt mod\u00fclde de de\u011fi\u015fikli\u011fe neden olup istenmeyen sonu\u00e7lara sebep oluyor ise, bu bize asl\u0131nda \u00e7ok da do\u011fru bir tasar\u0131m yap\u0131lmad\u0131\u011f\u0131n\u0131n ipucunu verebilir. Sonu\u00e7 olarak bu \u015fekilde programlar, idamesi zor, k\u0131r\u0131lgan ve karma\u015f\u0131k bir hale geliyorlar. Ayr\u0131ca bu tarz kabiliyetin kendisine ili\u015fkin yap\u0131lan de\u011fi\u015fiklikler, test eforlar\u0131n\u0131 artt\u0131r\u0131p, yaz\u0131l\u0131m mod\u00fcllerinin tekrar olu\u015fturulmas\u0131 ve dahi konu\u015fland\u0131rma (deployment) maliyetlerini art\u0131r\u0131r.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/miro.medium.com\/max\/875\/1*UwEE6CQvXZH_rL1aLJes6g.png\" width=\"1036\" height=\"380\" \/><\/p>\n<p><span style=\"font-weight: 400;\">\u0130\u015fte a\u00e7\u0131k\/kapal\u0131 prensibi tam olarak bu tarz sonradan ortaya \u00e7\u0131kabilecek sorunlar\u0131 \u00f6nlemek i\u00e7in ortaya konulmu\u015ftur. Bu prensibin do\u011fru bir \u015fekilde uygulanmas\u0131 ile birlikte, olas\u0131 de\u011fi\u015fikliklerde, mevcut yaz\u0131l\u0131m\u0131n\u0131zda ger\u00e7ekle\u015ftirilecek olan de\u011fi\u015fikliklerin minimum seviyede tutulmas\u0131n\u0131 sa\u011fl\u0131yor olacaks\u0131n\u0131z.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Peki bu prensibe riayet eden mod\u00fclleri nas\u0131l ifade edebiliriz:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><em><strong>Geni\u015flemelere a\u00e7\u0131kt\u0131rlar:<\/strong><\/em>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Mod\u00fcl\u00fc sergiledi\u011fi kabiliyet, gereksinim de\u011fi\u015fiklikleri veya yeni gereksinimler \u0131\u015f\u0131\u011f\u0131nda, geni\u015fleyebilir. Burada, yeni kabiliyetler i\u00e7in mod\u00fcl\u00fcn geni\u015fletilmesi zaten onun kodlar\u0131 de\u011fi\u015ftirilmesi anlam\u0131na gelmez mi diye d\u00fc\u015f\u00fcnebilirsiniz ama mevcut s\u0131n\u0131f\u0131 de\u011fi\u015ftirmeden de bunu yapabilmenin y\u00f6ntemleri mevut.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><em><strong>Modifikasyonlara ise kapal\u0131d\u0131rlar:<\/strong><\/em>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Mod\u00fcl\u00fcn kendisine ili\u015fkin kaynak kodlar\u0131n de\u011fi\u015fikli\u011fine ise izin verilmez\/gerek kalmaz. \u00d6rne\u011fin, DLL veya .jar k\u00fct\u00fcphanelerinde bir de\u011fi\u015fiklik yap\u0131lmas\u0131na gerek kalmaz. Tabi burada hata d\u00fczeltmelerini ve dile ili\u015fkin ya da benzeri g\u00fcncellemeleri g\u00f6z ard\u0131 etmemiz gerekiyor.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu konu ile ilgili ifade edilen bir di\u011fer analoji de \u015fu \u015fekilde ki &#8220;Palto giymek i\u00e7in a\u00e7\u0131k g\u00f6\u011f\u00fcs ameliyat\u0131 gerekmez&#8221;, asl\u0131 ise &#8220;Open chest surgery is not required when putting on a coat&#8221;. Bizim i\u00e7in anlam\u0131, yeni bir kabiliyet ekleyece\u011fim diye temek kabiliyetleri ve b\u00fct\u00fcnl\u00fc\u011f\u00fc patlatma riskini g\u00f6ze almamal\u0131y\u0131z.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/miro.medium.com\/max\/875\/1*SpU6T6Zr6OjeD4utxvZzQQ.jpeg\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Peki bu prensipleri nas\u0131l sa\u011flayaca\u011f\u0131z? Bu konuya de\u011finen ilk yazarlar, genelde bu prensibin, miras yolu ile kar\u015f\u0131lanabilece\u011fini ifade etmi\u015flerdi ki, art\u0131k ata s\u0131n\u0131f\u0131n geli\u015ftirme detaylar\u0131na dayanan bir miras bize daha fazla ba\u011f\u0131ml\u0131l\u0131k getirmekte ve genelde ka\u00e7\u0131n\u0131lmaktad\u0131r. Bunun yerine, soyut s\u0131n\u0131flar\/metotlar ya da bir di\u011fer ifade ile aray\u00fczleri (C++\u2019larda \u201c<em>pure abstract<\/em>\u201d s\u0131n\u0131flar ve Java\u2019lar daki <em>Inteface<\/em> s\u0131n\u0131flar bu kategoriye dahil edilebilir) kullanan yakla\u015f\u0131m kabul g\u00f6rmektedir. Bu aray\u00fczler modifikasyona kapal\u0131, fakat geni\u015flemeye a\u00e7\u0131kt\u0131rlar.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Bu sayede elde etti\u011fimiz en \u00f6nemli kazan\u00e7, bu aray\u00fczler sayesinde ek bir soyutlama seviyesi ve gev\u015fek ba\u011fla\u015f\u0131m (t\u00fcrk\u00e7esi biraz garip oldu fark\u0131nday\u0131m. Bahsetti\u011fim kavram &#8220;<em>loose coupling&#8221;<\/em>) elde edilmesidir. Bu aray\u00fczleri ger\u00e7ekleyen s\u0131n\u0131flar\u0131n birbirleri aras\u0131nda herhangi bir kod payla\u015f\u0131m\u0131na da ihtiya\u00e7 olmayacakt\u0131r.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u015eimdi basit bir \u00e7izim kabiliyeti geli\u015ftirdi\u011fimizi d\u00fc\u015f\u00fcnelim. \u00d6ncelikle OCP\u2019yi g\u00f6z \u00f6n\u00fcnde bulundurmad\u0131\u011f\u0131m\u0131z duruma bakal\u0131m. Bu ba\u011flamda, kabiliyetimizi geli\u015ftirirken, sadece \u00e7ember ve kare \u00e7izece\u011fini d\u00fc\u015f\u00fcnd\u00fck ve a\u015fa\u011f\u0131daki gibi s\u0131n\u0131flar\u0131 geli\u015ftirdik.<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n\r\n\/\/ Cizim siniflarimiz\r\n\/\/ Cember ciziminden sorumlu sinifimiz\r\nclass Circle{\r\npublic:\r\n   void draw() const {\r\n\tstd::cout &lt;&lt; \"Drawing circle...\\n\";\r\n   }\r\n};\r\n\r\n\/\/ Kare ciziminden sorumlu sinifimiz\r\nclass Square\r\n{\r\npublic:\r\n   void draw() const {\r\n\tstd::cout &lt;&lt; \"Drawing square...\\n\";\r\n   }\r\n};\r\n\r\n\/\/ Simdi cizimlerden sorumlu sinifimizi yazal\u0131m. Yani asil sorumlu sinifimiz\r\n\/\/ Burada olayi fazla basitlestirmis olabiliriz ama mantik anlaminda ne demek istedigimizin acik oldugunu dusunuyorum\r\nclass Painter\r\n{\r\npublic:\r\n  \/\/ Sekilleri cizdirelim\r\n  void drawShape(const Circle* circle) {\r\n\tif (nullptr != circle)\r\n    circle-&gt;draw();\r\n  }\r\n  \r\n  void drawShape(const Square* square) {\r\n  if (nullptr != square)\r\n    square-&gt;draw();\r\n  }\r\n\r\n};\r\n\r\nint main()\r\n{\r\n   Painter painter;\r\n   \r\n   \/\/ Cizim icin kullanacagimiz cizim sinif nesneleri \r\n   Circle mCircleInstance; \r\n   Square mSquareInstance;\r\n\r\n   painter.drawShape(&amp;mCircleInstance);\r\n   painter.drawShape(&amp;mSquareInstance);\r\n\t\r\n   return 0;\r\n}<\/pre>\n<p>Yaz\u0131l\u0131m\u0131m\u0131z\u0131 geli\u015ftirdik ve her \u015fey g\u00fczel giderken, m\u00fc\u015fteri dikd\u00f6rtgeni de \u015fekiller aras\u0131nda \u00e7izmemizi istedi, ne yapaca\u011f\u0131z? \u00d6ncelikle bir tane dikd\u00f6rtgen s\u0131n\u0131f\u0131 ekledik, \u015fu ana kadar bir s\u0131k\u0131nt\u0131 yok ama\u00a0<em>Painter<\/em> s\u0131n\u0131f\u0131m\u0131z\u0131 da de\u011fi\u015ftirmemiz gerekecek, i\u015fte burada OCP prensibimizin\u00a0<em>closed <\/em>k\u0131sm\u0131 tarumar oldu. Peki bu kabiliyeti,\u00a0<em>Painter<\/em> s\u0131n\u0131f\u0131n\u0131 de\u011fi\u015ftirmeden nas\u0131l ekleyebilirdik?\u00a0<em>Interface\u00a0<\/em>desem, akl\u0131n\u0131za ne gelir? Evet yan\u0131lmad\u0131n\u0131z, bir <em>IShape\u00a0<\/em>ata s\u0131n\u0131f\u0131 ile sanki daha kolay uyarlanabilir bir tasar\u0131m elde edece\u011fiz gibi g\u00f6r\u00fcn\u00fcyor, tabi\u00a0<em>Painter<\/em> s\u0131n\u0131f\u0131na da bir dokunmam\u0131z gerekecek.\u00a0\u00d6ncelikle mevcut s\u0131n\u0131flar\u0131m\u0131z\u0131 bu ba\u011flamda g\u00fcncelleyelim:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n\r\n\/\/ Cizim siniflarimiz\r\n\r\n\/\/ Sekiller icin kullanacagimiz ata sinif\r\nclass IShape{\r\npublic:\r\n   \/\/ Pure abstract metodumuz\r\n   virtual void draw() = 0;\t\r\n};\r\n\r\n\/\/ Cember ciziminden sorumlu sinifimiz\r\nclass Circle\r\n    : public IShape {\r\npublic:\r\n   void draw() override\t{\r\n\tstd::cout &lt;&lt; \"Drawing circle...\\n\";\r\n   }\r\n};\r\n\r\n\/\/ Kare ciziminden sorumlu sinifimiz\r\nclass Square\r\n   : public IShape {\r\npublic:\r\n   void draw() override\t{\r\n\tstd::cout &lt;&lt; \"Drawing square...\\n\";\r\n   }\r\n};\r\n\r\n\/\/ Simdi cizimlerden sorumlu sinifimizi yazal\u0131m. Yani asil sorumlu sinifimiz\r\n\/\/ Burada olayi fazla basitlestirmis olabiliriz ama mantik anlaminda ne demek istedigimizin acik oldugunu dusunuyorum\r\nclass Painter\r\n{\r\npublic:\r\n  \/\/ Sekilleri cizdirelim\r\n  void drawShape(IShape* shapeToDraw) {\r\n  \tif (nullptr != shapeToDraw)\r\n\t\tshapeToDraw-&gt;draw();\r\n  }\r\n};\r\n\r\nint main()\r\n{\r\n   \/\/ Cizim icin kullanacagimiz cizim sinif nesneleri \r\n   Circle mCircleInstance; \r\n   Square mSquareInstance;\r\n   \r\n   Painter painter;\r\n   painter.drawShape(&amp;mCircleInstance);\r\n   painter.drawShape(&amp;mSquareInstance);\r\n\t\r\n   return 0;\r\n}<\/pre>\n<p>\u015eimdi bu noktada dikd\u00f6rtgen s\u0131n\u0131f\u0131n\u0131 ekledi\u011fimizde neler de\u011fi\u015fecekti? Asl\u0131nda bakarsan\u0131z, a\u015fa\u011f\u0131daki gibi\u00a0<em>Painter\u00a0<\/em>s\u0131n\u0131f\u0131na art\u0131k dokunmam\u0131za gerek bile kalmayacak. Hemen bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true \">...\r\n\r\n\/\/ Dikdortgen ciziminden sorumlu sinifimiz\r\nclass Rectangle\r\n    : public IShape {\r\npublic:\r\n   void draw() override\t{\r\n\tstd::cout &lt;&lt; \"Drawing rectangle...\\n\";\r\n   }\r\n};\r\n\r\n...\r\n\r\nint main()\r\n{\r\n   \/\/ Cizim icin kullanacagimiz cizim sinif nesneleri \r\n   Circle mCircleInstance; \r\n   Square mSquareInstance;\r\n   Rectangle mRectangleInstance;\r\n\r\n   Painter painter;\r\n   painter.drawShape(&amp;mCircleInstance);\r\n   painter.drawShape(&amp;mSquareInstance);\r\n   painter.drawShape(&amp;mRectangleInstance);\r\n\t\r\n   return 0;\r\n}<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere ufak dokunu\u015flar ile ilk yazd\u0131\u011f\u0131m\u0131z kodu OCP prensibine uygun ve daha geni\u015fleyebilir bir hale getirmi\u015f olduk; <em>Painter\u00a0<\/em>s\u0131n\u0131f\u0131nda bir de\u011fi\u015fiklik yapmad\u0131k ama kabiliyet anlam\u0131nda geni\u015flettik.<\/p>\n<p><span style=\"font-weight: 400;\">Burada de\u011finmek istedi\u011fim bir di\u011fer nokta da \u015fu, yaz\u0131l\u0131mlar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc s\u00fcresince baz\u0131 de\u011fi\u015fikliklerin olabilece\u011fi her zaman g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131y\u0131z. Yani bir di\u011fer ifade ile gereksinimlerin veya ihtiya\u00e7lar\u0131n hi\u00e7bir zaman de\u011fi\u015fmeyece\u011fini kabul ederek, yaz\u0131l\u0131m tasarlay\u0131p, geli\u015ftirmenin, g\u00fcn\u00fcm\u00fcz \u015fartlar\u0131 i\u00e7in pek bir ge\u00e7erlili\u011fi olmad\u0131\u011f\u0131n\u0131 ifade etmemiz laz\u0131m (elbette kapsama\/projeye g\u00f6re bu de\u011fi\u015febilir). Yaz\u0131l\u0131mlar\u0131m\u0131z\u0131 asgari de\u011fi\u015fikliklere etkin bir \u015fekilde cevap verecek \u015fekilde geli\u015ftirmeliyiz. Ama bu mevzuyu da \u00e7ok ileri bir noktaya ta\u015f\u0131y\u0131p, gere\u011finden karma\u015f\u0131k yaz\u0131l\u0131m tasar\u0131mlar\u0131ndan da ka\u00e7\u0131nmal\u0131y\u0131z. Tabi buradaki anahtar kelime \u201cagari\u201d neye g\u00f6re, kime g\u00f6re? \u0130\u015fte bu noktada, yaz\u0131l\u0131m \u00fcr\u00fcn hatlar\u0131 (in\u015fallah ileride bu konuya da de\u011finece\u011fim) i\u00e7in \u00f6nemli bir ad\u0131m olan <em>alan analizinin<\/em> uygulanmas\u0131n\u0131 tavsiye edece\u011fim. Bu analiz ile birlikte ilgili kabiliyete ili\u015fkin asl\u0131nda kapsam ve olas\u0131 ortak ve de\u011fi\u015fkenlik g\u00f6steren nitelikler ve \u00f6zellikler belirlenmektedir. Bu sayede de bu alan i\u00e7erisinde, olas\u0131 gelebilecek de\u011fi\u015fiklikleri belirleyerek ve bunlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurabilirsiniz.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Sonu\u00e7 olarak, bu prensibin ba\u015far\u0131l\u0131 bir \u015fekilde uygulanmas\u0131 ile birlikte yaz\u0131l\u0131mlar\u0131n\u0131za de\u011fi\u015fiklikleri daha kolay ve kontroll\u00fc bir \u015fekilde yapabileceksiniz. Ayn\u0131 zamanda yeni kabiliyet eklemelerini de mevcut kod \u00fczerinde minimum de\u011fi\u015fiklik ile ger\u00e7ekle\u015ftirebileceksiniz. Son olarak, soyutlaman\u0131n OCP anlam\u0131nda kritik oldu\u011funu ve yaz\u0131l\u0131mlar\u0131 geli\u015ftirirken yukar\u0131dakilere ek olarak \u00e7ok de\u011fi\u015febilecek k\u0131s\u0131mlar ile de\u011fi\u015fmeyecek k\u0131s\u0131mlar\u0131n ayr\u0131lmas\u0131n\u0131n da \u00f6nemli oldu\u011funu ifade etmek istiyorum. Kaynaklarda, OCP prensibine ili\u015fkin daha detayl\u0131 bilgi ve farkl\u0131 kullan\u0131m \u00f6rneklerini bulabilirsiniz. Bir sonraki SOLID prensibi yaz\u0131s\u0131nda g\u00f6r\u00fc\u015fmek dile\u011fiyle bol kod&#8217;lu g\u00fcnler \ud83d\ude42<\/span><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar:<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"http:\/\/joelabrahamsson.com\/the-openclosed-principle-a-real-world-example\/\"><span style=\"font-weight: 400;\"><span style=\"color: #339966;\"><strong>http:\/\/joelabrahamsson.com\/the-openclosed-principle-a-real-world-example<\/strong><\/span><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.oodesign.com\/open-close-principle.html\"><strong><span style=\"color: #339966;\">https:\/\/www.oodesign.com\/open-close-principle.html<\/span><\/strong><\/a><\/li>\n<li><strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/www.youtube.com\/watch?v=t86v3N4OshQ\">https:\/\/www.youtube.com\/watch?v=t86v3N4OshQ<\/a><\/span><\/strong><\/li>\n<li><strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/www.youtube.com\/watch?v=JLURCz3dDtY\">https:\/\/www.youtube.com\/watch?v=JLURCz3dDtY<\/a><\/span><\/strong><\/li>\n<li><a href=\"https:\/\/scotch.io\/bar-talk\/s-o-l-i-d-the-first-five-principles-of-object-oriented-design\"><span style=\"color: #339966;\"><strong>https:\/\/scotch.io\/bar-talk\/s-o-l-i-d-the-first-five-principles-of-object-oriented-design<\/strong><\/span><\/a><\/li>\n<li><strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/www.coursera.org\/lecture\/design-patterns\/2-3-2-open-closed-principle-hYSeT\">https:\/\/www.coursera.org\/lecture\/design-patterns\/2-3-2-open-closed-principle-hYSeT<\/a><\/span><\/strong><\/li>\n<li><span style=\"color: #339966;\"><strong>https:\/\/www.slideshare.net\/PaulBlundell2\/open-closedprinciple-kata<\/strong><\/span><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Merhabalar arkada\u015flar, yaz yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131mda bir s\u00fcre \u00f6nce ba\u015flad\u0131\u011f\u0131m SOLID prensiplerine ili\u015fkin yaz\u0131 serisinin ikincisini sizler ile payla\u015faca\u011f\u0131m (yaz\u0131da sonraki hafta demi\u015fim ama bu birka\u00e7 ay\u0131 buldu, o sebeple kusura bakmay\u0131n :)).\u00a0 \u0130lk yaz\u0131ya a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Ayn\u0131 zamanda SOLID prensipler genel anlamda neye hizmet ediyor ve genel motivasyon i\u00e7in de ilk&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1162,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[41,188],"tags":[535,533,532,531,442,441,530,448,447,440,534],"class_list":["post-1325","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-modern-c","category-yazilim-muhendisligi","tag-bertrand-meyer","tag-nesne-yonelimli-tasarim","tag-nesne-yonelimli-yazilim-gelistirme","tag-ocp","tag-ood","tag-oop","tag-open-closed-principle","tag-robert-c-martin","tag-software-design","tag-solid","tag-tek-sorumluluk-prensibi-coupling"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhabalar arkada\u015flar, yaz yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131mda bir s\u00fcre \u00f6nce ba\u015flad\u0131\u011f\u0131m SOLID prensiplerine ili\u015fkin yaz\u0131 serisinin ikincisini sizler ile payla\u015faca\u011f\u0131m (yaz\u0131da sonraki hafta demi\u015fim ama bu birka\u00e7 ay\u0131 buldu, o sebeple kusura bakmay\u0131n :)).\u00a0 \u0130lk yaz\u0131ya a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Ayn\u0131 zamanda SOLID prensipler genel anlamda neye hizmet ediyor ve genel motivasyon i\u00e7in de ilk... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-06T20:13:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-04-05T13:40:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/05\/img_5cd5e44cbe99e.png\" \/>\n\t<meta property=\"og:image:width\" content=\"182\" \/>\n\t<meta property=\"og:image:height\" content=\"84\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi\",\"datePublished\":\"2019-08-06T20:13:59+00:00\",\"dateModified\":\"2020-04-05T13:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\"},\"wordCount\":1464,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"Bertrand Meyer\",\"Nesne Y\u00f6nelimli Tasar\u0131m\",\"Nesne Y\u00f6nelimli Yaz\u0131l\u0131m Geli\u015ftirme\",\"OCP\",\"OOD\",\"OOP\",\"Open\/Closed Principle\",\"Robert C. Martin\",\"software design\",\"SOLID\",\"Tek Sorumluluk Prensibi. coupling\"],\"articleSection\":[\"Modern C++\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\",\"name\":\"[:tr]SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-08-06T20:13:59+00:00\",\"dateModified\":\"2020-04-05T13:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhabalar arkada\u015flar, yaz yaz\u0131lar\u0131m\u0131za devam ediyoruz. Bu yaz\u0131mda bir s\u00fcre \u00f6nce ba\u015flad\u0131\u011f\u0131m SOLID prensiplerine ili\u015fkin yaz\u0131 serisinin ikincisini sizler ile payla\u015faca\u011f\u0131m (yaz\u0131da sonraki hafta demi\u015fim ama bu birka\u00e7 ay\u0131 buldu, o sebeple kusura bakmay\u0131n :)).\u00a0 \u0130lk yaz\u0131ya a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Ayn\u0131 zamanda SOLID prensipler genel anlamda neye hizmet ediyor ve genel motivasyon i\u00e7in de ilk... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-08-06T20:13:59+00:00","article_modified_time":"2020-04-05T13:40:51+00:00","og_image":[{"width":182,"height":84,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/05\/img_5cd5e44cbe99e.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi","datePublished":"2019-08-06T20:13:59+00:00","dateModified":"2020-04-05T13:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/"},"wordCount":1464,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["Bertrand Meyer","Nesne Y\u00f6nelimli Tasar\u0131m","Nesne Y\u00f6nelimli Yaz\u0131l\u0131m Geli\u015ftirme","OCP","OOD","OOP","Open\/Closed Principle","Robert C. Martin","software design","SOLID","Tek Sorumluluk Prensibi. coupling"],"articleSection":["Modern C++","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/","name":"[:tr]SOLID 2 - A\u00e7\u0131k\/Kapal\u0131 Prensibi[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-08-06T20:13:59+00:00","dateModified":"2020-04-05T13:40:51+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/06\/solid-2-acik-kapali-prensibi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"SOLID 2 &#8211; A\u00e7\u0131k\/Kapal\u0131 Prensibi"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1325"}],"version-history":[{"count":9,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1325\/revisions"}],"predecessor-version":[{"id":1761,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1325\/revisions\/1761"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/1162"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}