{"id":31626,"date":"2025-10-12T02:31:09","date_gmt":"2025-10-11T23:31:09","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/"},"modified":"2025-10-12T02:31:09","modified_gmt":"2025-10-11T23:31:09","slug":"c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/","title":{"rendered":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m"},"content":{"rendered":"<p><body><\/p>\n<p>\n        Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP&#8217;nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\n    <\/p>\n<p>\n        Yaz\u0131l\u0131m mimarinizin uzun \u00f6m\u00fcrl\u00fc ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131 i\u00e7in, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, temel tasar\u0131m prensiplerine uymak bir zorunluluktur. LSP, tam da bu s\u00fcrd\u00fcr\u00fclebilirli\u011fi hedefleyen, davran\u0131\u015fsal tutarl\u0131l\u0131\u011f\u0131 garanti alt\u0131na alan bir k\u0131lavuz sunar. Temel olarak, bir temel tipin kullan\u0131ld\u0131\u011f\u0131 her yerde, onun t\u00fcretilmi\u015f bir tipinin de sorunsuz bir \u015fekilde kullan\u0131labilece\u011fini savunur. Bu, sadece metod imzalar\u0131n\u0131n de\u011fil, ayn\u0131 zamanda beklenen davran\u0131\u015flar\u0131n da uyumlu olmas\u0131 gerekti\u011fi anlam\u0131na gelir. E\u011fer bu prensibi g\u00f6z ard\u0131 edersek, sistemdeki de\u011fi\u015fiklikler domino etkisi yaratarak beklenmedik yan etkilere ve hataya a\u00e7\u0131k kodlara yol a\u00e7abilir. Bu makalede, bu kavramlar\u0131 hem teorik hem de pratik \u00f6rneklerle ele alacak, b\u00f6ylece yaz\u0131l\u0131m\u0131n\u0131z\u0131n sadece \u00e7al\u0131\u015fmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda gelecekteki de\u011fi\u015fikliklere de kolayca adapte olabilmesini sa\u011flayaca\u011f\u0131z. Haz\u0131rsan\u0131z, bu \u00f6nemli prensibin derinliklerine dalal\u0131m ve C# kodunuzu daha g\u00fc\u00e7l\u00fc hale getirme yolculu\u011funa ba\u015flayal\u0131m.\n    <\/p>\n<h2>Liskov Substitution Prensibi Nedir ve Neden Bu Kadar \u00d6nemli?<\/h2>\n<p>\n        Liskov Substitution Prensibi (LSP), bilgisayar bilimcisi Barbara Liskov taraf\u0131ndan 1987 y\u0131l\u0131nda ortaya konulan ve daha sonra Robert C. Martin (Uncle Bob) taraf\u0131ndan SOLID prensiplerinin bir par\u00e7as\u0131 olarak pop\u00fclerle\u015ftirilen temel bir nesne tabanl\u0131 tasar\u0131m prensibidir. K\u0131saca, &#8220;S program\u0131n\u0131n her nesnesi i\u00e7in, T tipinde bir o nesnesi varsa, S tipindeki bir o&#8217;1 nesnesi ile de\u011fi\u015ftirildi\u011finde, program\u0131n do\u011frulu\u011fu bozulmamal\u0131d\u0131r.&#8221; \u015feklinde ifade edilir. Daha basit bir dille s\u00f6ylemek gerekirse, t\u00fcretilmi\u015f s\u0131n\u0131flar (alt tipler), temel s\u0131n\u0131flar\u0131n (\u00fcst tipler) yerine ge\u00e7ebilmeli ve bunu yaparken istemci kodunun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmemelidir. Yani, bir s\u0131n\u0131f\u0131n miras\u00e7\u0131s\u0131, temel s\u0131n\u0131f\u0131n &#8220;s\u00f6zle\u015fmesini&#8221; asla ihlal etmemelidir. Bu s\u00f6zle\u015fme, sadece metod imzalar\u0131n\u0131 de\u011fil, metodlar\u0131n beklenen davran\u0131\u015flar\u0131n\u0131, f\u0131rlatt\u0131\u011f\u0131 istisnalar\u0131 ve d\u00f6nd\u00fcrd\u00fc\u011f\u00fc de\u011ferleri de kapsar.\n    <\/p>\n<p>\n        LSP&#8217;nin \u00f6nemi, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k yaz\u0131l\u0131m sistemlerinde, kodun esnekli\u011fini, bak\u0131m\u0131n\u0131 ve geni\u015fletilebilirli\u011fini do\u011frudan etkilemesinden gelir. E\u011fer bir t\u00fcretilmi\u015f s\u0131n\u0131f, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde farkl\u0131 davran\u0131yorsa, temel s\u0131n\u0131f\u0131 kullanan her yerde \u00f6zel kontroller eklemek zorunda kal\u0131rs\u0131n\u0131z. Bu durum, kodun i\u00e7 i\u00e7e girmi\u015f if-else bloklar\u0131yla dolmas\u0131na, okunabilirli\u011finin d\u00fc\u015fmesine ve yeni \u00f6zellikler eklemenin veya mevcutlar\u0131 de\u011fi\u015ftirmenin zorla\u015fmas\u0131na neden olur. LSP&#8217;ye uyulmad\u0131\u011f\u0131nda ortaya \u00e7\u0131kan en belirgin sorunlardan biri &#8220;kare-dikd\u00f6rtgen problemi&#8221;dir. Bir dikd\u00f6rtgen s\u0131n\u0131f\u0131ndan bir kare s\u0131n\u0131f\u0131 t\u00fcretti\u011finizde, karenin en ve boy de\u011ferleri birbirine e\u015fit olmak zorundad\u0131r. Ancak dikd\u00f6rtgen s\u0131n\u0131f\u0131n\u0131n <code>SetEn<\/code> ve <code>SetBoy<\/code> metodlar\u0131 ayr\u0131 ayr\u0131 en ve boyu de\u011fi\u015ftirmeye izin veriyorsa, bir kare nesnesini bir dikd\u00f6rtgen gibi kulland\u0131\u011f\u0131n\u0131zda, karenin temel \u00f6zelli\u011fini (en=boy) bozmu\u015f olursunuz. Bu durum, LSP ihlalinin klasik bir \u00f6rne\u011fidir.\n    <\/p>\n<p>\n        Bu prensibi uygulamak, yaz\u0131l\u0131m tasar\u0131m\u0131n\u0131z\u0131 \u00e7ok daha sa\u011flam hale getirir. Herhangi bir istemci (client) kodu, sadece temel s\u0131n\u0131f aray\u00fcz\u00fcne (interface) veya soyut s\u0131n\u0131fa ba\u011f\u0131ml\u0131 kalarak, hangi somut t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n kullan\u0131ld\u0131\u011f\u0131n\u0131 bilmeden do\u011fru bir \u015fekilde \u00e7al\u0131\u015fabilir. Bu, gelecekte yeni t\u00fcretilmi\u015f s\u0131n\u0131flar ekledi\u011finizde mevcut istemci kodunu de\u011fi\u015ftirmek zorunda kalmayaca\u011f\u0131n\u0131z anlam\u0131na gelir. Bu sayede, &#8220;A\u00e7\u0131k\/Kapal\u0131 Prensibi&#8221; (Open\/Closed Principle &#8211; OCP) ile de g\u00fc\u00e7l\u00fc bir ba\u011flant\u0131 kurar: kodunuzu geni\u015fletmeye a\u00e7\u0131k, ancak de\u011fi\u015ftirmeye kapal\u0131 hale getirirsiniz. LSP, ayn\u0131 zamanda test edilebilirlik a\u00e7\u0131s\u0131ndan da b\u00fcy\u00fck avantajlar sunar. Temel s\u0131n\u0131f\u0131n davran\u0131\u015fsal s\u00f6zle\u015fmesini anlad\u0131\u011f\u0131n\u0131zda, t\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n da bu s\u00f6zle\u015fmeye uyaca\u011f\u0131n\u0131 varsayarak daha basit ve etkili testler yazabilirsiniz. Sonu\u00e7 olarak, LSP&#8217;ye uymak, yaz\u0131l\u0131m\u0131n uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahip olan temiz, s\u00fcrd\u00fcr\u00fclebilir ve esnek bir mimari olu\u015fturman\u0131n temelini atar.\n    <\/p>\n<h3>LSP&#8217;yi Anlamak \u0130\u00e7in Temel Kavramlar Nelerdir?<\/h3>\n<p>\n        Liskov Yerine Ge\u00e7me Prensibi&#8217;ni tam olarak kavrayabilmek i\u00e7in nesne tabanl\u0131 programlaman\u0131n (OOP) baz\u0131 temel yap\u0131 ta\u015flar\u0131n\u0131 ve kavramlar\u0131n\u0131 iyi anlamam\u0131z gerekir. Bu kavramlar, LSP&#8217;nin ard\u0131ndaki mant\u0131\u011f\u0131 ve neden belirli tasar\u0131m kal\u0131plar\u0131n\u0131n tercih edildi\u011fini a\u00e7\u0131klar. \u0130\u015fte LSP ile do\u011frudan ili\u015fkili temel kavramlar:\n    <\/p>\n<ul>\n<li>\n            <strong>Kal\u0131t\u0131m (Inheritance):<\/strong> OOP&#8217;nin en bilinen \u00f6zelliklerinden biridir. Bir s\u0131n\u0131f\u0131n (t\u00fcretilmi\u015f s\u0131n\u0131f), ba\u015fka bir s\u0131n\u0131f\u0131n (temel s\u0131n\u0131f) \u00f6zelliklerini ve davran\u0131\u015flar\u0131n\u0131 miras almas\u0131n\u0131 sa\u011flar. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve s\u0131n\u0131flar aras\u0131nda &#8220;bir &#8230; t\u00fcr\u00fcd\u00fcr&#8221; (is-a) ili\u015fkisi kurar. LSP, bu &#8220;is-a&#8221; ili\u015fkisinin sadece yap\u0131sal de\u011fil, ayn\u0131 zamanda davran\u0131\u015fsal olarak da tutarl\u0131 olmas\u0131n\u0131 gerektirir. Yani, t\u00fcretilmi\u015f s\u0131n\u0131f, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde &#8220;hala ayn\u0131 \u015fey&#8221; gibi davranmal\u0131d\u0131r.\n        <\/li>\n<li>\n            <strong>Polimorfizm (Polymorphism):<\/strong> Yunanca &#8220;\u00e7ok bi\u00e7imlilik&#8221; anlam\u0131na gelir. OOP&#8217;de, farkl\u0131 s\u0131n\u0131flardaki nesnelerin ayn\u0131 aray\u00fcz\u00fc payla\u015farak veya ayn\u0131 temel tipten t\u00fcreyerek farkl\u0131 \u015fekillerde davranabilme yetene\u011fidir. LSP, polimorfizmin do\u011fru ve g\u00fcvenli bir \u015fekilde kullan\u0131lmas\u0131n\u0131 sa\u011flamay\u0131 ama\u00e7lar. E\u011fer bir t\u00fcretilmi\u015f s\u0131n\u0131f, polimorfik bir \u00e7a\u011fr\u0131 s\u0131ras\u0131nda temel s\u0131n\u0131f\u0131n beklenen davran\u0131\u015f\u0131ndan saparsa, bu bir LSP ihlalidir ve polimorfizmin g\u00fcc\u00fc olumsuz etkilenir.\n        <\/li>\n<li>\n            <strong>Soyutlama (Abstraction):<\/strong> Karma\u015f\u0131k sistemlerin detaylar\u0131n\u0131 gizleyerek, yaln\u0131zca ilgili veya gerekli bilgiyi ortaya \u00e7\u0131karma i\u015flemidir. Soyut s\u0131n\u0131flar (abstract classes) ve aray\u00fczler (interfaces) soyutlaman\u0131n temel ara\u00e7lar\u0131d\u0131r. LSP, \u00f6zellikle soyutlaman\u0131n sa\u011flad\u0131\u011f\u0131 &#8220;s\u00f6zle\u015fme&#8221; mekanizmas\u0131yla yak\u0131ndan ili\u015fkilidir. Temel bir s\u0131n\u0131f veya aray\u00fcz, belirli bir davran\u0131\u015f\u0131 taahh\u00fct eden bir s\u00f6zle\u015fme g\u00f6revi g\u00f6r\u00fcr ve t\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n bu s\u00f6zle\u015fmeye uymas\u0131 beklenir.\n        <\/li>\n<li>\n            <strong>S\u00f6zle\u015fme (Contract):<\/strong> Bir s\u0131n\u0131f\u0131n veya metodun, d\u0131\u015f d\u00fcnya ile kurdu\u011fu \u00f6rt\u00fcl\u00fc veya a\u00e7\u0131k bir anla\u015fmad\u0131r. Bu s\u00f6zle\u015fme, metodun beklenen girdilerini (preconditions), \u00e7\u0131kt\u0131lar\u0131n\u0131 (postconditions), f\u0131rlatabilece\u011fi istisnalar\u0131 ve korudu\u011fu de\u011fi\u015fmezleri (invariants) i\u00e7erir. LSP&#8217;nin temel mesaj\u0131, t\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n temel s\u0131n\u0131f\u0131n s\u00f6zle\u015fmesini asla ihlal etmemesi gerekti\u011fidir. E\u011fer bir t\u00fcretilmi\u015f s\u0131n\u0131f, temel s\u0131n\u0131f\u0131n beklentilerini kar\u015f\u0131lamazsa, o zaman bu t\u00fcretilmi\u015f s\u0131n\u0131f temel s\u0131n\u0131f\u0131n yerine ge\u00e7emez. \u00d6rne\u011fin, bir temel s\u0131n\u0131f bir metodun belirli bir t\u00fcrde istisna f\u0131rlatmayaca\u011f\u0131n\u0131 taahh\u00fct ediyorsa, t\u00fcretilmi\u015f s\u0131n\u0131f bu metotta bu istisnay\u0131 f\u0131rlatmamal\u0131d\u0131r. Bu, istemci kodunun temel s\u0131n\u0131fla \u00e7al\u0131\u015f\u0131rken sahip oldu\u011fu beklentilerin t\u00fcretilmi\u015f s\u0131n\u0131fla \u00e7al\u0131\u015f\u0131rken de ge\u00e7erli olmas\u0131n\u0131 sa\u011flar.\n        <\/li>\n<\/ul>\n<p>\n        Bu kavramlar\u0131 bir arada d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fczde, LSP&#8217;nin sadece teorik bir prensip olmaktan \u00f6te, sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131m mimarileri in\u015fa etmek i\u00e7in pratik bir yol g\u00f6sterici oldu\u011funu g\u00f6r\u00fcr\u00fcz. T\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n temel s\u0131n\u0131f\u0131n s\u00f6zle\u015fmesine sad\u0131k kalmas\u0131n\u0131 sa\u011flayarak, sistemin geneline yay\u0131lm\u0131\u015f g\u00fcvenilirli\u011fi ve \u00f6ng\u00f6r\u00fclebilirli\u011fi art\u0131r\u0131r\u0131z.\n    <\/p>\n<p class=\"expert-tip\">\n        Uzman \u0130pucu: LSP&#8217;yi do\u011fru uygulayabilmek i\u00e7in, &#8220;is-a&#8221; ili\u015fkisini sadece yap\u0131sal olarak de\u011fil, davran\u0131\u015fsal olarak da d\u00fc\u015f\u00fcn\u00fcn. Bir t\u00fcretilmi\u015f s\u0131n\u0131f, ger\u00e7ekten temel s\u0131n\u0131f\u0131n beklenen her davran\u0131\u015f\u0131n\u0131 sergiliyorsa, o zaman LSP&#8217;ye uyuyordur. Aksi takdirde, muhtemelen farkl\u0131 bir tasar\u0131m yakla\u015f\u0131m\u0131na (\u00f6rne\u011fin kompozisyon) ihtiya\u00e7 duyulur.\n    <\/p>\n<h2>C#&#8217;ta LSP \u0130hlallerini Nas\u0131l Tespit Ederiz?<\/h2>\n<p>\n        Liskov Substitution Prensibi&#8217;ni ihlal eden kodlar\u0131 tespit etmek, bazen ilk bak\u0131\u015fta kolay olmayabilir. Ancak baz\u0131 yayg\u0131n anti-kal\u0131plar ve i\u015faretler, LSP ihlalinin g\u00fc\u00e7l\u00fc g\u00f6stergeleridir. Bu ihlaller, genellikle temel s\u0131n\u0131f\u0131n bekledi\u011fi bir davran\u0131\u015f\u0131n t\u00fcretilmi\u015f s\u0131n\u0131fta farkl\u0131 bir \u015fekilde ele al\u0131nmas\u0131ndan kaynaklan\u0131r. \u0130\u015fte C# kod taban\u0131n\u0131zda LSP ihlallerini belirlemenize yard\u0131mc\u0131 olacak anahtar noktalar:\n    <\/p>\n<ol>\n<li>\n            <strong><code>NotImplementedException<\/code> veya Benzeri \u0130stisnalar F\u0131rlatmak:<\/strong> Bir t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n, temel s\u0131n\u0131ftan miras ald\u0131\u011f\u0131 bir metodu ge\u00e7ersiz k\u0131l\u0131p (override) i\u00e7inde <code>NotImplementedException<\/code> veya benzeri bir istisna f\u0131rlatmas\u0131, en bariz LSP ihlallerinden biridir. Bu, t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n temel s\u0131n\u0131f\u0131n t\u00fcm &#8220;s\u00f6zle\u015fmesini&#8221; yerine getiremedi\u011fini g\u00f6sterir. Temel s\u0131n\u0131f, bu metodun bir i\u015flevi yerine getirece\u011fini varsayarken, t\u00fcretilmi\u015f s\u0131n\u0131f bunu yapamay\u0131p bir hata f\u0131rlat\u0131r.<\/p>\n<pre><code>\npublic abstract class Cihaz\n{\n    public abstract void Calistir();\n    public abstract void Kapat();\n    public virtual void Resetle() \/\/ Temel cihazlar\u0131n resetlenebilir oldu\u011funu varsay\u0131yoruz\n    {\n        Console.WriteLine(\"Cihaz resetleniyor...\");\n    }\n}\n\npublic class AkilliTelefon : Cihaz\n{\n    public override void Calistir()\n    {\n        Console.WriteLine(\"Ak\u0131ll\u0131 telefon ba\u015flat\u0131l\u0131yor.\");\n    }\n\n    public override void Kapat()\n    {\n        Console.WriteLine(\"Ak\u0131ll\u0131 telefon kapat\u0131l\u0131yor.\");\n    }\n    \/\/ Resetle metodunu ge\u00e7ersiz k\u0131lmak zorunda de\u011fil, temel davran\u0131\u015f yeterli\n}\n\npublic class TasKagitMakasOyunu : Cihaz \/\/ LSP ihlali: \"is-a\" ili\u015fkisi yok, ancak kal\u0131t\u0131m kullan\u0131lm\u0131\u015f\n{\n    public override void Calistir()\n    {\n        Console.WriteLine(\"Ta\u015f Ka\u011f\u0131t Makas oyunu ba\u015flat\u0131l\u0131yor.\");\n    }\n\n    public override void Kapat()\n    {\n        Console.WriteLine(\"Ta\u015f Ka\u011f\u0131t Makas oyunu kapat\u0131l\u0131yor.\");\n    }\n\n    public override void Resetle()\n    {\n        \/\/ Bir oyunun \"cihaz\" gibi resetlenmesi anlams\u0131z.\n        \/\/ Bu, Cihaz'\u0131n Resetle metodunun s\u00f6zle\u015fmesini ihlal eder.\n        throw new NotImplementedException(\"Ta\u015f Ka\u011f\u0131t Makas oyunu resetlenemez.\");\n    }\n}\n\n\/\/ \u0130stemci kodu\nCihaz telefon = new AkilliTelefon();\nCihaz oyun = new TasKagitMakasOyunu();\n\ntelefon.Calistir(); \/\/ \u00c7al\u0131\u015f\u0131r\ntelefon.Resetle();  \/\/ \u00c7al\u0131\u015f\u0131r\n\noyun.Calistir();    \/\/ \u00c7al\u0131\u015f\u0131r\n\/\/ oyun.Resetle();   \/\/ Hata f\u0131rlat\u0131r! LSP ihlali!\n            <\/pre>\n<p><\/code><\/p>\n<p>\n                Yukar\u0131daki \u00f6rnekte, <code>TasKagitMakasOyunu<\/code> s\u0131n\u0131f\u0131 bir <code>Cihaz<\/code> de\u011fildir ve <code>Resetle<\/code> metodunu uygulamak anlams\u0131z oldu\u011fu i\u00e7in <code>NotImplementedException<\/code> f\u0131rlat\u0131r. Bu, <code>Cihaz<\/code> tipini kullanan istemci kodunun, <code>TasKagitMakasOyunu<\/code> ile kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda beklenmedik bir hatayla kar\u015f\u0131la\u015fmas\u0131na neden olur.\n            <\/p>\n<\/li>\n<li>\n            <strong>Davran\u0131\u015fsal De\u011fi\u015fiklikler ve G\u00fc\u00e7l\u00fc \u00d6nko\u015fullar, Zay\u0131f Artko\u015fullar:<\/strong> T\u00fcretilmi\u015f s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n bir metodunu ge\u00e7ersiz k\u0131ld\u0131\u011f\u0131nda, metodun beklenen davran\u0131\u015f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde de\u011fi\u015ftirmesi de bir ihlaldir. \u00d6rne\u011fin, bir metot temel s\u0131n\u0131fta her zaman pozitif bir say\u0131 d\u00f6nd\u00fcr\u00fcrken, t\u00fcretilmi\u015f s\u0131n\u0131fta negatif bir say\u0131 d\u00f6nd\u00fcrebilmesi. Ya da temel s\u0131n\u0131f\u0131n bir metodu belirli bir \u00f6nko\u015fula sahipken (\u00f6rn. giri\u015fin bo\u015f olmamas\u0131), t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n daha g\u00fc\u00e7l\u00fc bir \u00f6nko\u015ful eklemesi (\u00f6rn. giri\u015fin sadece say\u0131 i\u00e7ermesi). Benzer \u015fekilde, temel s\u0131n\u0131f\u0131n bir metodu belirli bir artko\u015fulu (\u00f6rn. bir liste eleman say\u0131s\u0131n\u0131n artmas\u0131) garanti ederken, t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n bu artko\u015fulu zay\u0131flatmas\u0131 da bir ihlaldir.\n        <\/li>\n<li>\n            <strong>Tip Kontrolleri (<code>is<\/code> veya <code>as<\/code>) \u0130\u00e7eren \u0130stemci Kodu:<\/strong> E\u011fer temel s\u0131n\u0131f\u0131 kullanan istemci kodunuzda, belirli bir t\u00fcretilmi\u015f s\u0131n\u0131f t\u00fcr\u00fc i\u00e7in \u00f6zel mant\u0131k y\u00fcr\u00fctmek amac\u0131yla <code>is<\/code> operat\u00f6r\u00fc veya <code>as<\/code> anahtar kelimesi ile tip kontrolleri yap\u0131yorsan\u0131z, bu genellikle bir LSP ihlalinin habercisidir. \u0130stemci, belirli bir alt tipe \u00f6zel olarak davranmak zorunda kal\u0131yorsa, bu, temel s\u0131n\u0131f\u0131n aray\u00fcz\u00fcn\u00fcn yeterli olmad\u0131\u011f\u0131n\u0131 veya t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n temel s\u0131n\u0131f\u0131n yerine ge\u00e7emedi\u011fini g\u00f6sterir.<\/p>\n<pre><code>\n\/\/ LSP ihlaline yol a\u00e7an istemci kodu\npublic void IslemYap(Cihaz cihaz)\n{\n    if (cihaz is AkilliTelefon telefon)\n    {\n        telefon.AramaYap(); \/\/ Sadece AkilliTelefon'a \u00f6zg\u00fc bir davran\u0131\u015f\n    }\n    else if (cihaz is TasKagitMakasOyunu oyun)\n    {\n        oyun.SkorlariGoster(); \/\/ Sadece Oyuna \u00f6zg\u00fc bir davran\u0131\u015f\n    }\n    else\n    {\n        cihaz.Calistir();\n    }\n}\n            <\/pre>\n<p><\/code><\/p>\n<p>\n                Bu durum, OCP'yi (Open\/Closed Principle) de ihlal eder, \u00e7\u00fcnk\u00fc yeni bir cihaz t\u00fcr\u00fc ekledi\u011finizde bu <code>IslemYap<\/code> metodunu de\u011fi\u015ftirmek zorunda kal\u0131rs\u0131n\u0131z.\n            <\/p>\n<\/li>\n<li>\n            <strong>Yeni \u0130stisnalar F\u0131rlatmak:<\/strong> T\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n f\u0131rlatmad\u0131\u011f\u0131, ancak istemcinin de beklemedi\u011fi yeni istisnalar f\u0131rlatmas\u0131 da LSP ihlalidir. \u0130stemci, temel s\u0131n\u0131f\u0131n metodunu \u00e7a\u011f\u0131r\u0131rken belirli istisna tiplerini yakalamay\u0131 bekleyebilir; ancak t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n farkl\u0131 bir istisna f\u0131rlatmas\u0131, istemci kodunun \u00e7\u00f6kmesine neden olabilir.\n        <\/li>\n<\/ol>\n<p>\n        Bu i\u015faretler, LSP'yi ihlal eden bir tasar\u0131m\u0131n varl\u0131\u011f\u0131n\u0131 g\u00fc\u00e7l\u00fc bir \u015fekilde g\u00f6sterir. Bu t\u00fcr ihlallerle kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, genellikle tasar\u0131m\u0131n\u0131z\u0131 yeniden d\u00fc\u015f\u00fcnmeniz ve belki de farkl\u0131 bir kal\u0131t\u0131m hiyerar\u015fisi, aray\u00fczler veya kompozisyon gibi alternatif yakla\u015f\u0131mlar kullanman\u0131z gerekebilir.\n    <\/p>\n<h2>LSP'ye Uyumlu Kod Tasar\u0131m\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\n        Liskov Substitution Prensibi'ne uygun bir kod tasar\u0131m\u0131 yapmak, yaz\u0131l\u0131m\u0131n\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Bu, sadece do\u011fru ara\u00e7lar\u0131 (aray\u00fczler, soyut s\u0131n\u0131flar) kullanmakla kalmaz, ayn\u0131 zamanda s\u0131n\u0131flar aras\u0131ndaki \"is-a\" ili\u015fkisini davran\u0131\u015fsal olarak da do\u011fru anlamay\u0131 gerektirir. \u0130\u015fte LSP'ye uyumlu bir tasar\u0131m yapmak i\u00e7in izleyebilece\u011finiz ad\u0131mlar ve pratik yakla\u015f\u0131mlar:\n    <\/p>\n<h3>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<ol>\n<li>\n            <strong>S\u00f6zle\u015fmeye Odaklan\u0131n:<\/strong> Bir temel s\u0131n\u0131f veya aray\u00fcz tasarlarken, onun \"s\u00f6zle\u015fmesini\" \u00e7ok iyi tan\u0131mlay\u0131n. Bu s\u00f6zle\u015fme, metodlar\u0131n ne yapaca\u011f\u0131n\u0131, hangi parametreleri alaca\u011f\u0131n\u0131, ne d\u00f6nd\u00fcrece\u011fini, hangi ko\u015fullarda ba\u015far\u0131l\u0131 olaca\u011f\u0131n\u0131 (artko\u015fullar) ve hangi ko\u015fullar\u0131n kar\u015f\u0131lanmas\u0131 gerekti\u011fini (\u00f6nko\u015fullar) a\u00e7\u0131k\u00e7a belirtmelidir. T\u00fcretilmi\u015f s\u0131n\u0131flar, bu s\u00f6zle\u015fmeyi asla ihlal etmemelidir. Bu, hem metod imzalar\u0131n\u0131 hem de davran\u0131\u015flar\u0131n\u0131 kapsar.\n        <\/li>\n<li>\n            <strong>Kal\u0131t\u0131m Yerine Kompozisyon:<\/strong> E\u011fer bir s\u0131n\u0131f\u0131n di\u011ferinin davran\u0131\u015flar\u0131n\u0131 \"ger\u00e7ekten bir t\u00fcr\u00fc de\u011fil\" ise, kal\u0131t\u0131m yerine kompozisyonu (Composition over Inheritance) tercih edin. Kompozisyon, s\u0131n\u0131flar\u0131n ba\u015fka s\u0131n\u0131flar\u0131n nesnelerini i\u00e7ermesini ve bu nesnelerin davran\u0131\u015flar\u0131n\u0131 kullanmas\u0131n\u0131 sa\u011flar. Bu, daha esnek tasar\u0131mlar sunar ve LSP ihlallerini \u00f6nlemenin g\u00fc\u00e7l\u00fc bir yoludur. \u00d6rne\u011fin, bir motorun bir araban\u0131n \"bir par\u00e7as\u0131\" olmas\u0131 gibi.<\/p>\n<pre><code>\n\/\/ LSP ihlalini \u00e7\u00f6zen bir yakla\u015f\u0131m: Kompozisyon\npublic interface IHareketEdebilir\n{\n    void HareketEt();\n}\n\npublic class Motor : IHareketEdebilir\n{\n    public void HareketEt()\n    {\n        Console.WriteLine(\"Motor \u00e7al\u0131\u015f\u0131yor ve hareket sa\u011fl\u0131yor.\");\n    }\n}\n\npublic class Kanat : IHareketEdebilir\n{\n    public void HareketEt()\n    {\n        Console.WriteLine(\"Kanatlar \u00e7\u0131rp\u0131l\u0131yor ve y\u00fckselme sa\u011fl\u0131yor.\");\n    }\n}\n\npublic class Arac\n{\n    private readonly IHareketEdebilir _hareketMekatizmasi;\n\n    public Arac(IHareketEdebilir hareketMekatizmasi)\n    {\n        _hareketMekatizmasi = hareketMekatizmasi;\n    }\n\n    public void S\u00fcr()\n    {\n        _hareketMekatizmasi.HareketEt();\n        Console.WriteLine(\"Ara\u00e7 ilerliyor.\");\n    }\n}\n\n\/\/ Kullan\u0131m\n\/\/ Arac araba = new Arac(new Motor());\n\/\/ araba.S\u00fcr(); \/\/ Motor \u00e7al\u0131\u015f\u0131yor ve hareket sa\u011fl\u0131yor. Ara\u00e7 ilerliyor.\n\n\/\/ Arac ucagi = new Arac(new Kanat());\n\/\/ ucagi.S\u00fcr(); \/\/ Kanatlar \u00e7\u0131rp\u0131l\u0131yor ve y\u00fckselme sa\u011fl\u0131yor. Ara\u00e7 ilerliyor.\n            <\/pre>\n<p><\/code><\/p>\n<p>\n                Bu \u00f6rnekte, bir <code>Arac<\/code>'\u0131n nas\u0131l hareket etti\u011fini belirten <code>IHareketEdebilir<\/code> aray\u00fcz\u00fcn\u00fc kullanarak, farkl\u0131 hareket mekanizmalar\u0131n\u0131 (Motor, Kanat) kolayca birle\u015ftirebiliriz. Bu, kal\u0131t\u0131m hiyerar\u015filerindeki potansiyel LSP ihlallerini ortadan kald\u0131r\u0131r.\n            <\/p>\n<\/li>\n<li>\n            <strong>Aray\u00fczlerin G\u00fcc\u00fcn\u00fc Kullan\u0131n:<\/strong> C#'taki aray\u00fczler, LSP'ye uyumlu tasar\u0131mlar i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Aray\u00fczler, sadece metod imzalar\u0131n\u0131 tan\u0131mlayarak bir s\u00f6zle\u015fme olu\u015fturur ve bu s\u00f6zle\u015fmeyi uygulayan her s\u0131n\u0131f\u0131n belirli davran\u0131\u015flar\u0131 garanti etmesini sa\u011flar. Bir s\u0131n\u0131f\u0131n birden fazla aray\u00fcz\u00fc uygulayabilmesi, daha esnek ve par\u00e7alanabilir bir tasar\u0131m sunar. Bir istemci, sadece ihtiya\u00e7 duydu\u011fu aray\u00fcze ba\u011f\u0131ml\u0131 kalarak (Interface Segregation Principle - ISP) daha az de\u011fi\u015fime maruz kal\u0131r.\n        <\/li>\n<li>\n            <strong>Davran\u0131\u015fsal Alt Tipleme:<\/strong> Barbara Liskov'un tan\u0131m\u0131, davran\u0131\u015fsal alt tiplemeye odaklan\u0131r. Bu, bir t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n beklenen t\u00fcm davran\u0131\u015flar\u0131n\u0131, istemci kodu i\u00e7in fark yaratmayacak \u015fekilde sa\u011flamas\u0131 gerekti\u011fi anlam\u0131na gelir. Bir t\u00fcretilmi\u015f s\u0131n\u0131f, temel s\u0131n\u0131f\u0131n metodlar\u0131n\u0131 ge\u00e7ersiz k\u0131ld\u0131\u011f\u0131nda, bu metodlar\u0131n f\u0131rlatt\u0131\u011f\u0131 istisnalar, d\u00f6nd\u00fcrd\u00fc\u011f\u00fc de\u011ferler ve genel ama\u00e7lar\u0131 temel s\u0131n\u0131fla tutarl\u0131 olmal\u0131d\u0131r.\n        <\/li>\n<li>\n            <strong>Yan Etkilere Dikkat Edin:<\/strong> Bir metodun \u00e7a\u011fr\u0131lmas\u0131, o metodun a\u00e7\u0131k\u00e7a belirtilen g\u00f6revi d\u0131\u015f\u0131nda sistemin ba\u015fka bir yerinde beklenmedik de\u011fi\u015fikliklere neden olmamal\u0131d\u0131r. T\u00fcretilmi\u015f s\u0131n\u0131flar, temel s\u0131n\u0131f\u0131n yaratt\u0131\u011f\u0131 yan etkileri (veya yaratmad\u0131\u011f\u0131 yan etkileri) de\u011fi\u015ftirmemeli, temel s\u0131n\u0131f\u0131n \u00f6ng\u00f6rd\u00fc\u011f\u00fc yan etkileri aynen uygulamal\u0131d\u0131r.\n        <\/li>\n<li>\n            <strong>Test Odakl\u0131 Geli\u015ftirme (TDD):<\/strong> TDD, LSP'ye uyumlu kod yazman\u0131za yard\u0131mc\u0131 olabilir. Bir s\u0131n\u0131f\u0131n davran\u0131\u015f\u0131n\u0131 testlerle tan\u0131mlad\u0131\u011f\u0131n\u0131zda, o s\u0131n\u0131f\u0131n t\u00fcrevlerinin de ayn\u0131 testleri ge\u00e7mesini beklersiniz. E\u011fer bir t\u00fcretilmi\u015f s\u0131n\u0131f bu testleri ge\u00e7emiyorsa, bu bir LSP ihlalinin g\u00fc\u00e7l\u00fc bir g\u00f6stergesi olabilir.\n        <\/li>\n<\/ol>\n<p>\n        Bu ilkeleri uygulayarak, sadece LSP'ye de\u011fil, ayn\u0131 zamanda di\u011fer SOLID prensiplerine de uygun, daha sa\u011flam, esnek ve bak\u0131m\u0131 kolay C# uygulamalar\u0131 geli\u015ftirebilirsiniz. Unutmay\u0131n, iyi bir tasar\u0131m, gelecekteki de\u011fi\u015fikliklere a\u00e7\u0131k ve mevcut kodu de\u011fi\u015ftirmeye kapal\u0131 olmal\u0131d\u0131r.\n    <\/p>\n<h2>Geli\u015fmi\u015f Senaryolar ve Ger\u00e7ek D\u00fcnya Uygulamalar\u0131<\/h2>\n<p>\n        Liskov Substitution Prensibi (LSP), sadece teorik bir kavram olmaktan \u00f6te, ger\u00e7ek d\u00fcnya yaz\u0131l\u0131m projelerinde kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131k sorunlara pratik \u00e7\u00f6z\u00fcmler sunar. \u00d6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve mod\u00fcler sistemlerde, farkl\u0131 bile\u015fenlerin uyumlu bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in LSP'ye uyum hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte LSP'nin etkin bir \u015fekilde kullan\u0131labilece\u011fi baz\u0131 geli\u015fmi\u015f senaryolar ve ger\u00e7ek d\u00fcnya uygulamalar\u0131:\n    <\/p>\n<h3>\u00d6deme Sistemleri: G\u00fcvenilir ve Geni\u015fletilebilir Tasar\u0131m<\/h3>\n<p>\n        Bir \u00f6deme sistemi, LSP'nin faydalar\u0131n\u0131 en net g\u00f6rebilece\u011fimiz alanlardan biridir. Bir e-ticaret uygulamas\u0131nda veya hizmet tabanl\u0131 bir platformda birden fazla \u00f6deme y\u00f6ntemi (kredi kart\u0131, PayPal, banka havalesi, mobil \u00f6deme vb.) sunmak isteyebilirsiniz. Her \u00f6deme y\u00f6nteminin kendine \u00f6zg\u00fc entegrasyonu ve i\u015f ak\u0131\u015f\u0131 olmas\u0131na ra\u011fmen, istemci kodunun bu farkl\u0131l\u0131klar\u0131 bilmeden \u00f6deme i\u015flemlerini ba\u015flatabilmesi gerekir.\n    <\/p>\n<pre><code>\npublic interface IOdemeIslemci\n{\n    bool OdemeyiYap(decimal tutar, string referansNo);\n    bool IadeEt(decimal tutar, string referansNo);\n    string IslemDurumuSorgula(string referansNo);\n}\n\npublic class KrediKartiIslemci : IOdemeIslemci\n{\n    public bool OdemeyiYap(decimal tutar, string referansNo)\n    {\n        Console.WriteLine($\"Kredi kart\u0131 ile {tutar} TL \u00f6deme yap\u0131ld\u0131. Referans: {referansNo}\");\n        \/\/ Ger\u00e7ek \u00f6deme API \u00e7a\u011fr\u0131lar\u0131 burada yer al\u0131r.\n        return true;\n    }\n\n    public bool IadeEt(decimal tutar, string referansNo)\n    {\n        Console.WriteLine($\"Kredi kart\u0131 \u00f6demesi i\u00e7in {tutar} TL iade edildi. Referans: {referansNo}\");\n        return true;\n    }\n\n    public string IslemDurumuSorgula(string referansNo)\n    {\n        Console.WriteLine($\"Kredi kart\u0131 i\u015flemi {referansNo} durumu sorguland\u0131.\");\n        return \"Basarili\";\n    }\n}\n\npublic class PayPalIslemci : IOdemeIslemci\n{\n    public bool OdemeyiYap(decimal tutar, string referansNo)\n    {\n        Console.WriteLine($\"PayPal ile {tutar} TL \u00f6deme yap\u0131ld\u0131. Referans: {referansNo}\");\n        \/\/ PayPal API \u00e7a\u011fr\u0131lar\u0131\n        return true;\n    }\n\n    public bool IadeEt(decimal tutar, string referansNo)\n    {\n        Console.WriteLine($\"PayPal \u00f6demesi i\u00e7in {tutar} TL iade edildi. Referans: {referansNo}\");\n        return true;\n    }\n\n    public string IslemDurumuSorgula(string referansNo)\n    {\n        Console.WriteLine($\"PayPal i\u015flemi {referansNo} durumu sorguland\u0131.\");\n        return \"Tamamlandi\";\n    }\n}\n\npublic class OdemeServisi\n{\n    private readonly IOdemeIslemci _islemci;\n\n    public OdemeServisi(IOdemeIslemci islemci)\n    {\n        _islemci = islemci;\n    }\n\n    public void OdemeIsleminiBaslat(decimal tutar, string referansNo)\n    {\n        if (_islemci.OdemeyiYap(tutar, referansNo))\n        {\n            Console.WriteLine(\"\u00d6deme i\u015flemi ba\u015far\u0131yla tamamland\u0131.\");\n        }\n        else\n        {\n            Console.WriteLine(\"\u00d6deme i\u015flemi ba\u015far\u0131s\u0131z oldu.\");\n        }\n    }\n\n    \/\/ Di\u011fer metodlar...\n}\n\n\/\/ \u0130stemci kullan\u0131m\u0131\n\/\/ OdemeServisi krediKartiOdeme = new OdemeServisi(new KrediKartiIslemci());\n\/\/ krediKartiOdeme.OdemeIsleminiBaslat(100.0m, \"REF001\");\n\n\/\/ OdemeServisi payPalOdeme = new OdemeServisi(new PayPalIslemci());\n\/\/ payPalOdeme.OdemeIsleminiBaslat(250.50m, \"REF002\");\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Bu \u00f6rnekte, <code>IOdemeIslemci<\/code> aray\u00fcz\u00fc, t\u00fcm \u00f6deme y\u00f6ntemleri i\u00e7in ortak bir s\u00f6zle\u015fme tan\u0131mlar. <code>KrediKartiIslemci<\/code> ve <code>PayPalIslemci<\/code> s\u0131n\u0131flar\u0131 bu aray\u00fcz\u00fc uygulayarak kendi \u00f6deme mant\u0131klar\u0131n\u0131 sa\u011flarlar. <code>OdemeServisi<\/code> s\u0131n\u0131f\u0131 ise somut uygulamalar\u0131 bilmeden sadece <code>IOdemeIslemci<\/code> aray\u00fcz\u00fcne ba\u011f\u0131ml\u0131d\u0131r. Bu sayede, yeni bir \u00f6deme y\u00f6ntemi (\u00f6rne\u011fin \"MobilOdemeIslemci\") eklendi\u011finde, mevcut <code>OdemeServisi<\/code> kodunu de\u011fi\u015ftirmeye gerek kalmaz, sadece yeni bir uygulama sa\u011flan\u0131r. Bu, LSP'nin ve dolay\u0131s\u0131yla OCP'nin m\u00fckemmel bir uygulamas\u0131d\u0131r.\n    <\/p>\n<h3>Mobil Uygulama Geli\u015ftirmede LSP'nin Rol\u00fc<\/h3>\n<p>\n        Mobil uygulama geli\u015ftirirken, farkl\u0131 cihazlar, ekran boyutlar\u0131 ve platformlar i\u00e7in uyumlu bir kullan\u0131c\u0131 deneyimi sa\u011flamak \u00f6nemlidir. LSP, burada do\u011frudan kod yap\u0131s\u0131n\u0131 etkilemese de, tasar\u0131m felsefesi olarak \"farkl\u0131 platformlar\/cihazlar ayn\u0131 temel i\u015flevselli\u011fi sa\u011flamal\u0131d\u0131r\" ilkesini g\u00fc\u00e7lendirir. \u00d6rne\u011fin, bir bildirim servisi tasarlarken:\n    <\/p>\n<pre><code>\npublic interface IBildirimGonderici\n{\n    void BildirimGonder(string alici, string mesaj);\n    void DurumGuncelle(string bildirimId, string yeniDurum);\n}\n\npublic class EmailBildirimGonderici : IBildirimGonderici\n{\n    public void BildirimGonder(string alici, string mesaj)\n    {\n        Console.WriteLine($\"E-posta ile '{mesaj}' g\u00f6nderildi: {alici}\");\n    }\n\n    public void DurumGuncelle(string bildirimId, string yeniDurum)\n    {\n        Console.WriteLine($\"E-posta bildirimi {bildirimId} durumu {yeniDurum} olarak g\u00fcncellendi.\");\n    }\n}\n\npublic class PushBildirimGonderici : IBildirimGonderici\n{\n    public void BildirimGonder(string alici, string mesaj)\n    {\n        Console.WriteLine($\"Push bildirimi ile '{mesaj}' g\u00f6nderildi: {alici} (cihaz ID)\");\n    }\n\n    public void DurumGuncelle(string bildirimId, string yeniDurum)\n    {\n        Console.WriteLine($\"Push bildirimi {bildirimId} durumu {yeniDurum} olarak g\u00fcncellendi.\");\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Burada da <code>IBildirimGonderici<\/code> aray\u00fcz\u00fc sayesinde, uygulaman\u0131z hangi bildirim y\u00f6ntemini kullan\u0131rsa kullans\u0131n, ayn\u0131 aray\u00fcz \u00fczerinden i\u015flem yapabilir. Bu, gelecekte SMS veya ba\u015fka bir bildirim y\u00f6ntemi ekledi\u011finizde mevcut kodunuzu de\u011fi\u015ftirmeden yeni entegrasyonlar yapabilmenizi sa\u011flar.\n    <\/p>\n<p>\n        Mobil uyumlu HTML ve CSS tasar\u0131m\u0131 da benzer bir felsefeyi benimser. Farkl\u0131 ekran boyutlar\u0131 i\u00e7in ayn\u0131 temel i\u00e7eri\u011fin tutarl\u0131 bir \u015fekilde g\u00f6r\u00fcnt\u00fclenmesi beklenir. CSS'in media query'leri, bu esnekli\u011fi sa\u011flaman\u0131n bir yoludur:\n    <\/p>\n<pre><code class=\"language-css\">\n<style>\n  \/* Varsay\u0131lan stil: K\u00fc\u00e7\u00fck ekranlar i\u00e7in *\/\n  .container {\n    width: 100%;\n    padding: 15px;\n    box-sizing: border-box; \/* padding'in geni\u015fli\u011fi etkilememesini sa\u011flar *\/\n    font-size: 16px;\n  }\n\n  \/* Orta boy ekranlar (tabletler) i\u00e7in stiller *\/\n  @media (min-width: 768px) {\n    .container {\n      max-width: 750px; \/* Geni\u015fli\u011fi s\u0131n\u0131rl\u0131yoruz *\/\n      margin: auto;     \/* Ortalamak i\u00e7in *\/\n      padding: 20px;\n      font-size: 18px;\n    }\n  }\n\n  \/* B\u00fcy\u00fck ekranlar (masa\u00fcst\u00fc) i\u00e7in stiller *\/\n  @media (min-width: 992px) {\n    .container {\n      max-width: 970px;\n      padding: 25px;\n      font-size: 20px;\n    }\n  }\n<\/style>\n    <\/pre>\n<p><\/code><\/p>\n<p>\n        Yukar\u0131daki CSS \u00f6rne\u011fi, farkl\u0131 ekran boyutlar\u0131na g\u00f6re <code>.container<\/code> elementinin nas\u0131l davranmas\u0131 gerekti\u011fini tan\u0131mlar. Bu, LSP'nin mant\u0131\u011f\u0131na benzer \u015fekilde, farkl\u0131 \"ba\u011flamlarda\" (farkl\u0131 ekran boyutlar\u0131), temel bir elementin (container) tutarl\u0131 ancak optimize edilmi\u015f bir \u015fekilde \"yerine ge\u00e7mesini\" sa\u011flar. HTML yap\u0131s\u0131 ayn\u0131 kal\u0131r, ancak g\u00f6r\u00fcn\u00fcm\u00fc cihaz\u0131n \u00f6zelliklerine g\u00f6re adapte olur, bu da mobil uyumlu tasar\u0131m\u0131n temelini olu\u015fturur. Bu, LSP'nin do\u011frudan kod kal\u0131t\u0131m\u0131yla ilgili olmasa da, farkl\u0131 varyasyonlar\u0131n temel bir aray\u00fcz\u00fc veya beklentiyi korudu\u011fu geni\u015f sistem tasar\u0131m prensipleriyle paralellik g\u00f6sterir.\n    <\/p>\n<p class=\"expert-tip\">\n        Uzman \u0130pucu: Karma\u015f\u0131k i\u015f mant\u0131klar\u0131nda LSP'ye uyum, sistemin genel tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve gelecekteki de\u011fi\u015fikliklerin olas\u0131 yan etkilerini minimize eder. \u00d6zellikle da\u011f\u0131t\u0131k sistemlerde veya mikroservis mimarilerinde, her servisin kendi s\u00f6zle\u015fmesine sad\u0131k kalmas\u0131, sistemin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak i\u00e7in hayati \u00f6nem ta\u015f\u0131r.\n    <\/p>\n<h2>Sonu\u00e7: LSP ile Daha G\u00fc\u00e7l\u00fc ve Esnek Kod Yazman\u0131n Anahtar\u0131<\/h2>\n<p>\n        Liskov Substitution Prensibi (LSP), SOLID prensiplerinin temel ta\u015flar\u0131ndan biri olarak, C# ba\u015fta olmak \u00fczere nesne tabanl\u0131 programlama dillerinde esnek, sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131m mimarileri olu\u015fturmak i\u00e7in vazge\u00e7ilmez bir rehberdir. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, LSP sadece kal\u0131t\u0131m hiyerar\u015filerinde metod imzalar\u0131n\u0131n uyumlulu\u011funu de\u011fil, ayn\u0131 zamanda temel s\u0131n\u0131flar\u0131n ve t\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n davran\u0131\u015fsal s\u00f6zle\u015fmelerinin tutarl\u0131l\u0131\u011f\u0131n\u0131 da garanti eder. Bir t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde istemci kodunun beklentilerini de\u011fi\u015ftirmemesi gerekti\u011fi ilkesi, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecindeki bir\u00e7ok ba\u015f a\u011fr\u0131s\u0131n\u0131 \u00f6nler.\n    <\/p>\n<p>\n        LSP'ye uyum sa\u011flamak, yaz\u0131l\u0131m\u0131n\u0131za bir\u00e7ok avantaj sunar: kod tekrar\u0131n\u0131 azalt\u0131r, sistemin geni\u015fletilebilirli\u011fini art\u0131r\u0131r (Open\/Closed Principle ile yak\u0131n ili\u015fki), test edilebilirli\u011fi kolayla\u015ft\u0131r\u0131r ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr. Yanl\u0131\u015f tasarlanm\u0131\u015f kal\u0131t\u0131m hiyerar\u015filerinin veya davran\u0131\u015fsal tutars\u0131zl\u0131klar\u0131n yol a\u00e7t\u0131\u011f\u0131 <code>NotImplementedException<\/code>'lar, gereksiz tip kontrolleri veya beklenmedik \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131 gibi sorunlardan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar. Bu prensibi uygulamak i\u00e7in aray\u00fczleri etkin kullanmak, kal\u0131t\u0131m yerine kompozisyonu tercih etmek ve s\u0131n\u0131flar\u0131n davran\u0131\u015fsal s\u00f6zle\u015fmelerini net bir \u015fekilde tan\u0131mlamak \u00f6nemlidir.\n    <\/p>\n<p>\n        Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, \u00f6deme sistemleri veya bildirim servisleri gibi \u00f6rneklerde LSP'nin nas\u0131l daha mod\u00fcler ve geni\u015fletilebilir yap\u0131lar olu\u015fturdu\u011funu g\u00f6rd\u00fck. Bu, yeni \u00f6zellikler eklerken veya mevcut entegrasyonlar\u0131 de\u011fi\u015ftirirken mevcut kodu bozma riskini minimize eder. \u00d6zetle, LSP, sadece \"nas\u0131l kod yaz\u0131l\u0131r\" sorusuna de\u011fil, ayn\u0131 zamanda \"nas\u0131l daha iyi, daha d\u00fc\u015f\u00fcnceli ve gelece\u011fe d\u00f6n\u00fck kod tasarlan\u0131r\" sorusuna da g\u00fc\u00e7l\u00fc bir yan\u0131t sunar. Bu prensibi benimsemek, her C# geli\u015ftiricisinin kod kalitesini ve mimari olgunlu\u011funu bir \u00fcst seviyeye ta\u015f\u0131yacak anahtarlardan biridir.\n    <\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>LSP sadece kal\u0131t\u0131mla m\u0131 ilgilidir?<\/dt>\n<dd>Hay\u0131r, LSP yaln\u0131zca kal\u0131t\u0131m hiyerar\u015fileriyle s\u0131n\u0131rl\u0131 de\u011fildir. Daha geni\u015f anlamda, polimorfizm kullan\u0131lan her yerde ge\u00e7erlidir. Yani, bir temel s\u0131n\u0131f, soyut s\u0131n\u0131f veya aray\u00fcz ile tan\u0131mlanm\u0131\u015f bir \"s\u00f6zle\u015fme\" oldu\u011funda ve bu s\u00f6zle\u015fmenin farkl\u0131 uygulamalar\u0131 (t\u00fcretilmi\u015f s\u0131n\u0131flar) oldu\u011funda LSP devreye girer. As\u0131l vurgu, alt tiplerin \u00fcst tipin yerine ge\u00e7ebilmesi ve istemci kodu i\u00e7in davran\u0131\u015fsal olarak tutarl\u0131 kalmas\u0131d\u0131r.<\/dd>\n<dt>LSP ile \"kompozisyon yerine kal\u0131t\u0131m\" prensibi aras\u0131ndaki ili\u015fki nedir?<\/dt>\n<dd>Bu iki prensip birbiriyle yak\u0131ndan ili\u015fkilidir. LSP, bir \"is-a\" (bir t\u00fcr\u00fcd\u00fcr) ili\u015fkisi kurdu\u011funuzda davran\u0131\u015fsal tutarl\u0131l\u0131\u011f\u0131 sa\u011flaman\u0131z\u0131 ister. E\u011fer bu tutarl\u0131l\u0131\u011f\u0131 sa\u011flamakta zorlan\u0131yorsan\u0131z, bu genellikle yanl\u0131\u015f bir kal\u0131t\u0131m ili\u015fkisi kurdu\u011funuzun i\u015faretidir. \u0130\u015fte bu noktada \"kompozisyon yerine kal\u0131t\u0131m\" prensibi devreye girer. E\u011fer bir s\u0131n\u0131f, ba\u015fka bir s\u0131n\u0131f\u0131n \"bir par\u00e7as\u0131d\u0131r\" (has-a) veya \"bir \u015fey yapar\" (delegates-to) ise, kal\u0131t\u0131m yerine kompozisyonu tercih etmek, LSP ihlallerini \u00f6nlemenin ve daha esnek, par\u00e7alanabilir tasar\u0131mlar olu\u015fturman\u0131n g\u00fc\u00e7l\u00fc bir yoludur.<\/dd>\n<dt>LSP'yi ihlal etmek her zaman k\u00f6t\u00fc m\u00fcd\u00fcr?<\/dt>\n<dd>\u00c7o\u011fu durumda LSP'yi ihlal etmek, kod kalitesini d\u00fc\u015f\u00fcr\u00fcr, bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r ve sistemde beklenmedik hatalara yol a\u00e7ar. Ancak \u00e7ok nadir ve \u00f6zel durumlarda, performans gibi kritik fakt\u00f6rler i\u00e7in bilin\u00e7li olarak k\u00fc\u00e7\u00fck bir ihlal yap\u0131labilir. Ancak bu t\u00fcr durumlarda bile, riskler ve potansiyel yan etkiler dikkatlice de\u011ferlendirilmeli ve karar\u0131n dok\u00fcmante edilmesi gerekmektedir. Genel kural olarak, LSP'ye uymak en iyi uygulamad\u0131r.<\/dd>\n<dt>Aray\u00fczler LSP'yi sa\u011flaman\u0131n tek yolu mudur?<\/dt>\n<dd>Hay\u0131r, aray\u00fczler LSP'yi sa\u011flaman\u0131n g\u00fc\u00e7l\u00fc ve etkili bir yoludur ancak tek yolu de\u011fildir. Soyut s\u0131n\u0131flar da LSP'ye uyumlu tasar\u0131mlar olu\u015fturmak i\u00e7in kullan\u0131labilir. \u00d6nemli olan, temel tipin veya aray\u00fcz\u00fcn tan\u0131mlad\u0131\u011f\u0131 s\u00f6zle\u015fmeye (davran\u0131\u015fsal beklentilere) t\u00fcretilmi\u015f s\u0131n\u0131flar\u0131n tam olarak uymas\u0131d\u0131r. Aray\u00fczler, \u00f6zellikle birden fazla kal\u0131t\u0131m k\u0131s\u0131tlamas\u0131n\u0131n oldu\u011fu dillerde (C# gibi), esnek s\u00f6zle\u015fmeler tan\u0131mlamak i\u00e7in daha uygun bir ara\u00e7 olabilir.<\/dd>\n<dt>LSP'yi ihlal eden kodu nas\u0131l refakt\u00f6r edebilirim?<\/dt>\n<dd>\n            LSP ihlallerini refakt\u00f6r etmek i\u00e7in birka\u00e7 yayg\u0131n strateji vard\u0131r:<\/p>\n<ul>\n<li><strong>Yeni bir temel aray\u00fcz\/s\u0131n\u0131f tan\u0131mlay\u0131n:<\/strong> E\u011fer temel s\u0131n\u0131f \u00e7ok genel hale geldiyse, daha \u00f6zelle\u015fmi\u015f alt aray\u00fczler veya soyut s\u0131n\u0131flar olu\u015fturarak sorumluluklar\u0131 ay\u0131rabilirsiniz.<\/li>\n<li><strong>Kompozisyonu kullan\u0131n:<\/strong> E\u011fer \"is-a\" ili\u015fkisi davran\u0131\u015fsal olarak do\u011fru de\u011filse, kal\u0131t\u0131m\u0131 kald\u0131r\u0131p ilgili davran\u0131\u015f\u0131 ba\u015fka bir s\u0131n\u0131f\u0131n \u00f6rne\u011fi olarak (kompozisyon) dahil edin.<\/li>\n<li><strong>\u0130stemciyi daralt\u0131lm\u0131\u015f bir aray\u00fcze ba\u011f\u0131ml\u0131 hale getirin:<\/strong> E\u011fer istemci, t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n yerine ge\u00e7emedi\u011fi metodlara ihtiya\u00e7 duymuyorsa, istemciyi yaln\u0131zca ihtiya\u00e7 duydu\u011fu metodlar\u0131 i\u00e7eren daha k\u00fc\u00e7\u00fck bir aray\u00fcze ba\u011f\u0131ml\u0131 hale getirin (Interface Segregation Principle).<\/li>\n<li><strong>Ortak davran\u0131\u015f\u0131 \u00fcst s\u0131n\u0131fa ta\u015f\u0131y\u0131n:<\/strong> E\u011fer bir metodun t\u00fcretilmi\u015f s\u0131n\u0131flarda farkl\u0131 davranmas\u0131n\u0131n nedeni, temel s\u0131n\u0131f\u0131n yetersiz soyutlamas\u0131 ise, ortak davran\u0131\u015f\u0131 temel s\u0131n\u0131fa ta\u015f\u0131yarak veya bir strateji deseni kullanarak \u00e7\u00f6zebilirsiniz.<\/li>\n<\/ul>\n<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[228],"tags":[],"class_list":{"0":"post-31626","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP&#039;nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP&#039;nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T23:31:09+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m\",\"datePublished\":\"2025-10-11T23:31:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\"},\"wordCount\":4356,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C#\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\",\"name\":\"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-11T23:31:09+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP'nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP'nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","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:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/","og_locale":"tr_TR","og_type":"article","og_title":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP'nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-11T23:31:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m","datePublished":"2025-10-11T23:31:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/"},"wordCount":4356,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C#"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/","url":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/","name":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-11T23:31:09+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, yazd\u0131\u011f\u0131m\u0131z kodun yaln\u0131zca \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 yetmez; ayn\u0131 zamanda esnek, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmas\u0131 da hayati \u00f6nem ta\u015f\u0131r. Ancak bazen, her \u015feyin yolunda gitti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz anlarda bile, bir s\u0131n\u0131f\u0131 de\u011fi\u015ftirdi\u011fimizde veya mevcut bir sisteme yeni bir \u00f6zellik ekledi\u011fimizde beklenmedik hatalar veya garip davran\u0131\u015flarla kar\u015f\u0131la\u015f\u0131r\u0131z. Bu durum, \u00f6zellikle nesne tabanl\u0131 programlaman\u0131n (OOP) temel ta\u015flar\u0131ndan olan kal\u0131t\u0131m\u0131 kullan\u0131rken s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kabilir. Peki, t\u00fcretilmi\u015f bir s\u0131n\u0131f\u0131n, temel s\u0131n\u0131f\u0131n yerine ge\u00e7ti\u011finde neden sorunlar ya\u015far\u0131z ve bu sorunlar\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte tam da bu noktada, SOLID prensiplerinin \u00f6nemli bir par\u00e7as\u0131 olan Liskov Yerine Ge\u00e7me Prensibi (LSP) devreye girer. Bu makale boyunca, LSP'nin ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve C# projelerinizde daha sa\u011flam, esnek tasar\u0131mlar olu\u015fturmak i\u00e7in nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/c-liskov-prensibi-yazilimda-esnek-ve-saglam-tasarim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C# Liskov Prensibi: Yaz\u0131l\u0131mda Esnek ve Sa\u011flam Tasar\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31626"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31626\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}