<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kod Kalitesi Archives - Halil Durmus</title>
	<atom:link href="https://www.halildurmus.com/tag/kod-kalitesi-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.halildurmus.com/tag/kod-kalitesi-2/</link>
	<description>Official Website</description>
	<lastBuildDate>Sun, 08 Mar 2026 14:21:04 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.halildurmus.com/wp-content/uploads/2020/06/1-HalilDurmusRetina-150x150.png</url>
	<title>Kod Kalitesi Archives - Halil Durmus</title>
	<link>https://www.halildurmus.com/tag/kod-kalitesi-2/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Gerçek CRM Senaryolarıyla SOLID Prensipleri</title>
		<link>https://www.halildurmus.com/2026/03/08/gercek-crm-senaryolariyla-solid-prensipleri/</link>
					<comments>https://www.halildurmus.com/2026/03/08/gercek-crm-senaryolariyla-solid-prensipleri/#respond</comments>
		
		<dc:creator><![CDATA[Halil Durmuş]]></dc:creator>
		<pubDate>Sun, 08 Mar 2026 14:21:03 +0000</pubDate>
				<category><![CDATA[Bilgisayar]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[Clean Architecture]]></category>
		<category><![CDATA[CRM Mimari]]></category>
		<category><![CDATA[Kod Kalitesi]]></category>
		<category><![CDATA[SOLID Prensipleri]]></category>
		<guid isPermaLink="false">https://www.halildurmus.com/?p=5185</guid>

					<description><![CDATA[<p>Kurumsal projelerde, özellikle CRM, ERP, mikroservis mimarileri ve entegrasyon katmanlarında ölçeklenebilir, sürdürülebilir ve test edilebilir kod yazmak kritik önem taşır. Ayrıca, SOLID prensipleri bunu sağlayan yazılım tasarımının temel taşlarını oluşturur. Bu nedenle, bu yazıda SOLID prensiplerini gerçek CRM ve mikroservis senaryoları üzerinden, hatalı kod → doğru kod örnekleri ile açıklıyorum. Neden Kurumsal CRM Projelerinde SOLID [&#8230;]</p>
<p>The post <a href="https://www.halildurmus.com/2026/03/08/gercek-crm-senaryolariyla-solid-prensipleri/">Gerçek CRM Senaryolarıyla SOLID Prensipleri</a> appeared first on <a href="https://www.halildurmus.com">Halil Durmus</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Kurumsal projelerde, özellikle CRM, ERP, mikroservis mimarileri ve entegrasyon katmanlarında ölçeklenebilir, sürdürülebilir ve test edilebilir kod yazmak kritik önem taşır. Ayrıca, SOLID prensipleri bunu sağlayan yazılım tasarımının temel taşlarını oluşturur. Bu nedenle, bu yazıda SOLID prensiplerini gerçek CRM ve mikroservis senaryoları üzerinden, hatalı kod → doğru kod örnekleri ile açıklıyorum.</p>



<h4 class="wp-block-heading"><strong>Neden Kurumsal CRM Projelerinde SOLID Zorunludur?</strong></h4>



<p>Kurumsal CRM projelerinde kullanıcı sayısı, entegrasyon hacmi ve iş kuralları sürekli büyür. Bu nedenle SOLID prensipleri sadece “iyi uygulama” değildir; değişen iş kurallarına hızlı adapte olabilmek için zorunlu bir mimari disiplindir. Özellikle öğrenci, mezun, bursiyer ve okul gibi hiyerarşik yapılar SOLID uygulanmadığında hızla yönetilemez hâle gelir.</p>



<p></p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="600" height="400" src="https://www.halildurmus.com/wp-content/uploads/2025/12/Adsiz-tasarim.png" alt="" class="wp-image-5207" srcset="https://www.halildurmus.com/wp-content/uploads/2025/12/Adsiz-tasarim.png 600w, https://www.halildurmus.com/wp-content/uploads/2025/12/Adsiz-tasarim-300x200.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></figure>



<p></p>



<h4 class="wp-block-heading"><strong>1) Single Responsibility Principle (SRP)</strong></h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>B<em>ir sınıfın değişmesi için tek bir sebebi olmalı.</em></p>
</blockquote>



<h5 class="wp-block-heading"><strong>Gerçek Senaryo:</strong></h5>



<p>Dynamics 365’ten öğrenci bilgisi çekip CRM’e kaydediyoruz. Ama aynı sınıf içinde hem mapping yapılıyor hem de veri kaydediliyor hem de log atılıyor.</p>



<h6 class="wp-block-heading"><strong>❌ Yanlış Tasarım</strong></h6>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class StudentService
{
    public void SyncStudent(D365Student d365)
    {
        // Mapping
        var student = new Student
        {
            Name = d365.FullName,
            School = d365.SchoolName,
            ScholarshipType = d365.ScholarshipType
        };

        // Save
        Database.Save(student);

        // Log
        File.AppendAllText("log.txt", $"{student.Name} synced");
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">StudentService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SyncStudent</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">D365Student</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">d365</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #7B7F8B">        // Mapping</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> student </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Student</span></span>
<span class="line"><span style="color: #F6F6F4">        {</span></span>
<span class="line"><span style="color: #F6F6F4">            Name </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.FullName,</span></span>
<span class="line"><span style="color: #F6F6F4">            School </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.SchoolName,</span></span>
<span class="line"><span style="color: #F6F6F4">            ScholarshipType </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.ScholarshipType</span></span>
<span class="line"><span style="color: #F6F6F4">        };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">        // Save</span></span>
<span class="line"><span style="color: #F6F6F4">        Database.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(student);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">        // Log</span></span>
<span class="line"><span style="color: #F6F6F4">        File.</span><span style="color: #62E884">AppendAllText</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">log.txt</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">$&quot;</span><span style="color: #F286C4">{</span><span style="color: #F6F6F4">student</span><span style="color: #E7EE98">.</span><span style="color: #F6F6F4">Name</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> synced</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>3 ayrı sorumluluk → değiştiğinde sınıf patlar.</p>



<h6 class="wp-block-heading"><strong>✅ Doğru Tasarım (SRP uygulanmış)</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class StudentMapper
{
    public Student Map(D365Student d365) =>
        new Student
        {
            Name = d365.FullName,
            School = d365.SchoolName,
            ScholarshipType = d365.ScholarshipType
        };
}

public class StudentRepository
{
    public void Save(Student student)
    {
        Database.Save(student);
    }
}

public class Logger
{
    public void Log(string message)
    {
        File.AppendAllText("log.txt", message);
    }
}

public class StudentSyncService
{
    private readonly StudentMapper _mapper;
    private readonly StudentRepository _repo;
    private readonly Logger _logger;

    public StudentSyncService(StudentMapper mapper, StudentRepository repo, Logger logger)
    {
        _mapper = mapper;
        _repo = repo;
        _logger = logger;
    }

    public void Sync(D365Student d365)
    {
        var student = _mapper.Map(d365);
        _repo.Save(student);
        _logger.Log($"{student.Name} synced");
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">StudentMapper</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Student</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Map</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">D365Student</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">d365</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">=&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Student</span></span>
<span class="line"><span style="color: #F6F6F4">        {</span></span>
<span class="line"><span style="color: #F6F6F4">            Name </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.FullName,</span></span>
<span class="line"><span style="color: #F6F6F4">            School </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.SchoolName,</span></span>
<span class="line"><span style="color: #F6F6F4">            ScholarshipType </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> d365.ScholarshipType</span></span>
<span class="line"><span style="color: #F6F6F4">        };</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">StudentRepository</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Student</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">student</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        Database.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(student);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Logger</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Log</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">message</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        File.</span><span style="color: #62E884">AppendAllText</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">log.txt</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, message);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">StudentSyncService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">StudentMapper</span><span style="color: #F6F6F4"> _mapper;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">StudentRepository</span><span style="color: #F6F6F4"> _repo;</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Logger</span><span style="color: #F6F6F4"> _logger;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">StudentSyncService</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">StudentMapper</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">mapper</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1; font-style: italic">StudentRepository</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">repo</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1; font-style: italic">Logger</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">logger</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        _mapper </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> mapper;</span></span>
<span class="line"><span style="color: #F6F6F4">        _repo </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> repo;</span></span>
<span class="line"><span style="color: #F6F6F4">        _logger </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> logger;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Sync</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">D365Student</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">d365</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> student </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> _mapper.</span><span style="color: #62E884">Map</span><span style="color: #F6F6F4">(d365);</span></span>
<span class="line"><span style="color: #F6F6F4">        _repo.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(student);</span></span>
<span class="line"><span style="color: #F6F6F4">        _logger.</span><span style="color: #62E884">Log</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">$&quot;</span><span style="color: #F286C4">{</span><span style="color: #F6F6F4">student</span><span style="color: #E7EE98">.</span><span style="color: #F6F6F4">Name</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> synced</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<h4 class="wp-block-heading"><strong>2) Open/Closed Principle (OCP)</strong></h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Bir sınıf geliştirmeye açık, değişikliğe kapalı olmalı.&#8221;</em></p>
</blockquote>



<h5 class="wp-block-heading"><strong>Gerçek Senaryo:</strong></h5>



<p>Okul → fakülte → bölüm gibi hiyerarşik yapılarda farklı kaynaklardan veri geliyor.<br>Yeni kaynak eklenince servisi değiştirmemek istiyoruz.</p>



<h6 class="wp-block-heading"><strong>❌ Yanlış Tasarım</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class FacultyImporter
{
    public List&lt;Faculty> Import(string sourceType)
    {
        if (sourceType == "D365")
        {
            // Dynamics 365 mapping
        }
        else if (sourceType == "SAP")
        {
            // SAP mapping
        }
        else if (sourceType == "CSV")
        {
            // CSV mapping
        }

        return new List&lt;Faculty>();
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">FacultyImporter</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt; </span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">sourceType</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> (sourceType </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">D365</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        {</span></span>
<span class="line"><span style="color: #7B7F8B">            // Dynamics 365 mapping</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">else</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> (sourceType </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">SAP</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        {</span></span>
<span class="line"><span style="color: #7B7F8B">            // SAP mapping</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">else</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> (sourceType </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">CSV</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        {</span></span>
<span class="line"><span style="color: #7B7F8B">            // CSV mapping</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt;();</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Her yeni kaynakta <code>else if</code> ekleniyor → OCP ihlali.</p>



<h6 class="wp-block-heading"><strong>✅ Doğru Tasarım: Strategy Pattern ile OCP</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public interface IFacultySource
{
    List&lt;Faculty> Import();
}

public class D365FacultySource : IFacultySource
{
    public List&lt;Faculty> Import()
    {
        // Mapping logic
        return new();
    }
}

public class CsvFacultySource : IFacultySource
{
    public List&lt;Faculty> Import()
    {
        // CSV parsing logic
        return new();
    }
}

public class FacultyImporter
{
    private readonly IFacultySource _source;

    public FacultyImporter(IFacultySource source)
    {
        _source = source;
    }

    public List&lt;Faculty> Import() => _source.Import();
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IFacultySource</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt; </span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">D365FacultySource</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IFacultySource</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt; </span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #7B7F8B">        // Mapping logic</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">CsvFacultySource</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IFacultySource</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt; </span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #7B7F8B">        // CSV parsing logic</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">FacultyImporter</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IFacultySource</span><span style="color: #F6F6F4"> _source;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">FacultyImporter</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">IFacultySource</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">source</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        _source </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> source;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">List</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">Faculty</span><span style="color: #F6F6F4">&gt; </span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">() </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> _source.</span><span style="color: #62E884">Import</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Yeni kaynak → Yeni sınıf ekleyip <code>IFacultySource</code> implement etmek yeterlidir.<br><strong>Mevcut kod değişmez.</strong></p>



<h4 class="wp-block-heading"><strong>3) Liskov Substitution Principle (LSP)</strong></h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Türetilmiş sınıflar, temel sınıfın yerine kullanılabilmelidir.&#8221;</em></p>
</blockquote>



<h5 class="wp-block-heading"><strong>Gerçek Senaryo:</strong></h5>



<p>CRM’de <em>Kullanıcı Türü</em> hesaplayan bir servisimiz var:</p>



<ul class="wp-block-list">
<li>Lise Öğrencisi</li>



<li>Üniversite Öğrencisi</li>



<li>Mezun</li>
</ul>



<p>Yanlış kalıtım → alt sınıf davranışı bozuyor.</p>



<h6 class="wp-block-heading"><strong>❌ Yanlış Tasarım</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class UserTypeCalculator
{
    public virtual string CalculateType(User user) 
        => "GeneralUser";
}

public class GraduateUserTypeCalculator : UserTypeCalculator
{
    public override string CalculateType(User user)
    {
        throw new Exception("Graduate user cannot be processed here");
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserTypeCalculator</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">virtual</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">CalculateType</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">) </span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">GeneralUser</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">GraduateUserTypeCalculator</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">UserTypeCalculator</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">override</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">CalculateType</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">throw</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Exception</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Graduate user cannot be processed here</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Ana sınıfın beklediği davranış alt sınıfta bozulmuş.</p>



<h6 class="wp-block-heading"><strong>✅ Doğru Tasarım</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public interface IUserTypeCalculator
{
    string CalculateType(User user);
}

public class GraduateUserTypeCalculator : IUserTypeCalculator
{
    public string CalculateType(User user) 
        => "Graduate";
}

public class StudentUserTypeCalculator : IUserTypeCalculator
{
    public string CalculateType(User user) 
        => "Student";
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IUserTypeCalculator</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">CalculateType</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">GraduateUserTypeCalculator</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IUserTypeCalculator</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">CalculateType</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">) </span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Graduate</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">StudentUserTypeCalculator</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IUserTypeCalculator</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">CalculateType</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">) </span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Student</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Artık tüm sınıflar <strong>aynı kontratı düzgün şekilde</strong> uyguluyor.</p>



<h4 class="wp-block-heading"><strong>4) Interface Segregation Principle (ISP)</strong></h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Kullanmadığın metodu içeren interface&#8217;i implemente etme.&#8221;</em></p>
</blockquote>



<h5 class="wp-block-heading"><strong>Gerçek Senaryo:</strong></h5>



<p>CRM’de kullanıcıya SMS, mail veya push bildirim gönderen bir servis var. Ancak bazı entegre sistemler SMS desteklemiyor, bu yüzden tek bir arayüz tüm ihtiyaçları karşılamıyor.</p>



<h6 class="wp-block-heading">❌ Yanlış Tasarım</h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public interface INotificationService
{
    void SendEmail();
    void SendSms();
    void SendPush();
}

public class EmailService : INotificationService
{
    public void SendEmail() { }
    public void SendSms() => throw new NotImplementedException();
    public void SendPush() => throw new NotImplementedException();
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">INotificationService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendEmail</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendSms</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendPush</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">EmailService</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">INotificationService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendEmail</span><span style="color: #F6F6F4">() { }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendSms</span><span style="color: #F6F6F4">() </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">throw</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">NotImplementedException</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendPush</span><span style="color: #F6F6F4">() </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">throw</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">NotImplementedException</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p><strong>Kullanmadığımız metotları implement etmek zorunda kalıyoruz → ISP ihlali.</strong></p>



<h6 class="wp-block-heading"><strong>✅ Doğru Tasarım</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public interface IEmailNotification
{
    void SendEmail();
}

public interface ISmsNotification
{
    void SendSms();
}

public interface IPushNotification
{
    void SendPush();
}

public class EmailService : IEmailNotification
{
    public void SendEmail() { }
}

public class SmsService : ISmsNotification
{
    public void SendSms() { }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IEmailNotification</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendEmail</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ISmsNotification</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendSms</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IPushNotification</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendPush</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">EmailService</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IEmailNotification</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendEmail</span><span style="color: #F6F6F4">() { }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">SmsService</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">ISmsNotification</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">SendSms</span><span style="color: #F6F6F4">() { }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p><strong>Her servis sadece ihtiyacı olan interface’i implement eder.</strong></p>



<h4 class="wp-block-heading"><strong>5) Dependency Inversion Principle (DIP)</strong></h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Üst seviye sınıflar, alt seviye sınıflara değil soyutlamalara bağlı olmalı.&#8221;</em><br></p>
</blockquote>



<h5 class="wp-block-heading"><strong>Gerçek Senaryo:</strong></h5>



<p>CRM’e veri kaydeden bir servis var; <strong>ancak</strong> repository sınıfı doğrudan concrete bir sınıfa bağımlı olduğu için test yazılamıyor. <strong>Bu nedenle</strong>, yapı hem esnekliğini kaybediyor <strong>hem de</strong> bağımlılıklar artıyor.</p>



<h6 class="wp-block-heading">❌ <strong>Yanlış Tasarım (Test edilemez yapı)</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class UserService
{
    private readonly UserRepository _repo = new UserRepository();

    public void Save(User user)
    {
        _repo.Save(user);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">UserRepository</span><span style="color: #F6F6F4"> _repo </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">UserRepository</span><span style="color: #F6F6F4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        _repo.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(user);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Unit test yazılamaz, <strong>çünkü</strong> yapı doğrudan gerçek database’e bağlıdır; <strong>bu yüzden</strong> test ortamında izole edilemez.</p>



<h6 class="wp-block-heading"><strong>✅ Doğru Tasarım (Mocklanabilir ve test edilebilir)</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public interface IUserRepository
{
    void Save(User user);
}

public class UserRepository : IUserRepository
{
    public void Save(User user)
    {
        // DB logic
    }
}

public class UserService
{
    private readonly IUserRepository _repo;

    public UserService(IUserRepository repo)
    {
        _repo = repo;
    }

    public void Save(User user)
    {
        _repo.Save(user);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IUserRepository</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserRepository</span><span style="color: #F6F6F4"> : </span><span style="color: #97E1F1; font-style: italic">IUserRepository</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #7B7F8B">        // DB logic</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserService</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">readonly</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">IUserRepository</span><span style="color: #F6F6F4"> _repo;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">UserService</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">IUserRepository</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">repo</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        _repo </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> repo;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #FFB86C; font-style: italic">user</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    {</span></span>
<span class="line"><span style="color: #F6F6F4">        _repo.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(user);</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<p>Artık test yazabiliriz:</p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers" data-code-block-pro-font-family="" style="font-size:1rem;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.5rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#282a36"><span style="background:#ebebe6;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#282a36">C#</span></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;Fact&#93;
public void Save_Should_Call_Repository()
{
    var repo = new Mock&lt;IUserRepository>();
    var service = new UserService(repo.Object);

    service.Save(new User());

    repo.Verify(x => x.Save(It.IsAny&lt;User>()), Times.Once);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">&#91;</span><span style="color: #97E1F1; font-style: italic">Fact</span><span style="color: #F6F6F4">&#93;</span></span>
<span class="line"><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">void</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">Save_Should_Call_Repository</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> repo </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Mock</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">IUserRepository</span><span style="color: #F6F6F4">&gt;();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> service </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">UserService</span><span style="color: #F6F6F4">(repo.Object);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    service.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    repo.</span><span style="color: #62E884">Verify</span><span style="color: #F6F6F4">(</span><span style="color: #FFB86C; font-style: italic">x</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=&gt;</span><span style="color: #F6F6F4"> x.</span><span style="color: #62E884">Save</span><span style="color: #F6F6F4">(It.</span><span style="color: #62E884">IsAny</span><span style="color: #F6F6F4">&lt;</span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4">&gt;()), Times.Once);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#282A36;color:#ebebe6;font-size:12px;line-height:1;position:relative">C#</span></div>



<p></p>



<h4 class="wp-block-heading"><strong>SOLID Uygulamasının En Büyük Kazancı</strong></h4>



<p>SOLID uygulandığında kod tabanı öngörülebilir hale gelir. Böylece ekip değiştiğinde veya yeni bir modül eklendiğinde mevcut kodu kırma riski minimuma düşer. Entegrasyon projelerinde bu esneklik, değişiklik maliyetini ciddi şekilde azaltır.</p>



<h4 class="wp-block-heading"><strong>Sonuç</strong></h4>



<p>SOLID prensipleri çoğu zaman teorik başlıklar gibi görünse de CRM yapıları, mikroservisler, entegrasyonlar ve kurumsal projelerde <strong>gerçek sorunları çözen pratik kurallardır</strong>:</p>



<ul class="wp-block-list">
<li>SRP → Kod karmaşasını azaltır</li>



<li>OCP → Yeni özellik eklemeyi güvenli hâle getirir</li>



<li>LSP → Kalıtım kaynaklı hataları engeller</li>



<li>ISP → Sınıfları gereksiz bağımlılıklardan kurtarır</li>



<li>DIP → Test edilebilir, izole edilebilir bir yapı sağlar</li>
</ul>



<p>Bu örneklerle proje kodlarınızı gözden geçirip daha sürdürülebilir bir mimari oluşturabilirsiniz.</p>



<h4 class="wp-block-heading"><strong>Mini Check-List: Projen SOLID mi?</strong></h4>



<p>Bu örnekleri değerlendirirken kendi projenize şu soruları sorabilirsiniz: Bir sınıf tek bir işi mi yapıyor? Yeni bir kaynağı desteklemek için mevcut kodu değiştirmek zorunda kalıyor musunuz? Türeyen sınıflar beklenen davranışı bozuyor mu? Servisler gereksiz metodlara mı bağımlı? Birimi test etmek istediğinizde mock kullanabiliyor musunuz? Bu sorulara “hayır” cevabı verebildiğiniz her alan daha sürdürülebilir bir mimariye yaklaştığınız anlamına gelir.</p>



<p></p>
<p>The post <a href="https://www.halildurmus.com/2026/03/08/gercek-crm-senaryolariyla-solid-prensipleri/">Gerçek CRM Senaryolarıyla SOLID Prensipleri</a> appeared first on <a href="https://www.halildurmus.com">Halil Durmus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.halildurmus.com/2026/03/08/gercek-crm-senaryolariyla-solid-prensipleri/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
