Gereksinimler ve Ön Hazırlık
Uygulamamızı geliştirmek için modern bir geliştirme ortamına ihtiyacımız var. 2026 yılı standartlarında, .NET 9 veya üzeri bir sürüm kullanmanızı öneririm. Aşağıdaki araçların yüklü olduğundan emin olun:
- Visual Studio 2022 veya Visual Studio Code (C# Dev Kit eklentisi ile).
- .NET SDK (Software Development Kit) kurulumu.
- Temel C# sözdizimi bilgisi.
Projeyi başlatmak için terminalinizde dotnet new console -n KutuphaneYonetimSistemi komutunu çalıştırarak temel dosya yapısını oluşturabilirsiniz.
Temel Sınıfların Tasarımı: Kitap ve Üye Modelleri
Nesne tabanlı programlamada ilk adım, gerçek dünyadaki varlıkları sınıflara dönüştürmektir. Bir kütüphane sisteminde en temel iki varlık "Kitap" ve "Üye"dir. Kapsülleme prensibine uygun olarak, verileri doğrudan erişim yerine özellikler (properties) üzerinden yöneteceğiz.
public class Kitap
{
public string ISBN { get; set; }
public string Baslik { get; set; }
public string Yazar { get; set; }
public bool OduncAlindiMi { get; private set; }
public Kitap(string isbn, string baslik, string yazar)
{
ISBN = isbn;
Baslik = baslik;
Yazar = yazar;
OduncAlindiMi = false;
}
public void OduncVer() => OduncAlindiMi = true;
public void IadeAl() => OduncAlindiMi = false;
}
Burada OduncAlindiMi özelliğini private set yaparak, dışarıdan doğrudan değiştirilmesini engelledik. Bu, verinin bütünlüğünü korumak için kritik bir güvenlik önlemidir.
Kalıtım ile Kütüphane Öğelerini Genişletme
Kütüphanede sadece kitaplar bulunmaz; dergiler, makaleler veya dijital medya içerikleri de olabilir. Kalıtım kullanarak kod tekrarını önleyebilir ve ortak özellikleri tek bir taban sınıfta toplayabiliriz.
public abstract class KutuphaneOgeleri
{
public string Id { get; set; }
public string Baslik { get; set; }
}
public class Dergi : KutuphaneOgeleri
{
public int SayiNo { get; set; }
}
KutuphaneOgeleri sınıfını abstract (soyut) olarak tanımladık, çünkü kütüphanede doğrudan "Kütüphane Ögesi" diye bir nesne bulunmaz; her zaman daha spesifik bir tür (Kitap veya Dergi) vardır.
Polimorfizm ve Yönetim Sınıfı
Polimorfizm, farklı nesnelerin aynı arayüz üzerinden işlem görmesini sağlar. Kütüphane yönetim sınıfımız, tüm ögeleri ortak bir liste üzerinde tutabilir.
public class KutuphaneYonetici
{
private List _kitaplar = new List();
public void KitapEkle(Kitap kitap)
{
if (_kitaplar.Any(k => k.ISBN == kitap.ISBN))
throw new Exception("Bu ISBN numarasına sahip kitap zaten mevcut.");
_kitaplar.Add(kitap);
}
}
Bu yapıda Any metodunu kullanarak mükerrer kayıtları engelledik. Bu, veritabanı işlemlerinde karşılaşabileceğiniz hataları kod seviyesinde önlemek için önemli bir pratiktir.
Kapsülleme ve Veri Güvenliği
Kullanıcı verilerini yönetirken, özellikle şifreleme ve yetkilendirme süreçlerinde dikkatli olunmalıdır. Nesnelerinizin iç yapısını dışarıya tamamen açmayın.
Güvenlik Uyarısı: Üye şifrelerini asla düz metin (plain text) olarak saklamayın. .NET içerisinde
BCryptveyaArgon2gibi modern hashleme algoritmalarını kullanın. Veritabanı ile çalışırken her zaman parametreli sorgular (Entity Framework Core veya Dapper gibi ORM araçları) kullanarak SQL Injection saldırılarını önleyin.
Nesne Tabanlı Yaklaşım Karşılaştırma Tablosu
| Prensipler | Avantajı | Dezavantajı |
|---|---|---|
| Kapsülleme | Veri güvenliği ve kontrolü sağlar. | Daha fazla kod yazımı gerektirir. |
| Kalıtım | Kodun yeniden kullanılabilirliğini artırır. | Sıkı bağlılık (tight coupling) oluşturabilir. |
| Polimorfizm | Esnek ve genişletilebilir yapı sunar. | Hata ayıklama süreci karmaşıklaşabilir. |
Sıkça Sorulan Sorular
Interface (Arayüz) ile Abstract Class arasındaki fark nedir?
Abstract class'lar ortak bir kimlik ve temel işlevsellik sunarken, interface'ler bir nesnenin "ne yapabileceğini" tanımlayan bir sözleşmedir. Birden fazla interface implemente edebilirken, sadece bir sınıftan kalıtım alabilirsiniz.
Kütüphane sisteminde veritabanı bağlantısı nasıl kurulur?
Modern C# uygulamalarında Entity Framework Core kullanarak nesnelerinizi veritabanı tablolarıyla eşleştirebilirsiniz. Bu sayede SQL kodları yazmadan nesneler üzerinden veri yönetimi yapabilirsiniz.
Neden private set kullanıyoruz?
Verinin dışarıdan değiştirilmesini kontrol altına almak için. Bir nesnenin durumunu sadece o nesne içindeki metodlar değiştirmelidir.
Hata yönetimi (Exception Handling) nasıl yapılmalı?
Kullanıcı girişleri ve veritabanı işlemleri için try-catch bloklarını kullanın. Ancak, iş mantığı hatalarını (örneğin kitap bulunamadı) özel Exception sınıfları ile yönetmek daha temiz bir mimari sunar.
Bu yapı 2026 standartlarına uygun mu?
Evet, kullanılan özellikler (properties), lambda ifadeleri ve LINQ (Language Integrated Query) 2026 yılındaki C# geliştirme süreçlerinde en verimli yöntemlerdir.
Gelişmiş Sorgulama ve LINQ Entegrasyonu
Kütüphane sistemimizde bulunan kitap koleksiyonu büyüdükçe, veriler üzerinde filtreleme ve arama işlemleri yapmak için döngüler yerine LINQ kullanmak performansı ve okunabilirliği ciddi oranda artırır. Aşağıdaki örnek, belirli bir yazara ait kitapları veya ödünç alınmış kitapları dinamik olarak nasıl listeleyeceğimizi göstermektedir.
using System.Linq;
public class LibraryService
{
private List _books = new List();
public List GetBooksByAuthor(string authorName)
{
// LINQ ile sorgulama
return _books.Where(b => b.Author.Equals(authorName, StringComparison.OrdinalIgnoreCase))
.ToList();
}
public List GetOverdueBooks()
{
// Lambda ifadeleri ile tarih karşılaştırması
return _books.Where(b => b.IsBorrowed && b.DueDate < DateTime.Now)
.ToList();
}
}
Birim Testleri (Unit Testing) ile Kod Güvenilirliğini Sağlama
Nesne tabanlı sistemlerde her metodun beklenen davranışı sergilediğinden emin olmak için xUnit veya NUnit gibi kütüphanelerle test yazmak kritik öneme sahiptir. Özellikle ödünç alma mantığı gibi iş kurallarını test etmek, sistemin gelecekteki güncellemelerde bozulmasını engeller.
Örnek Test Senaryosu
Aşağıdaki kod bloğu, bir kitabın ödünç alınabilir olup olmadığını kontrol eden basit bir birim testi örneğidir:
[Fact]
public void BorrowBook_ShouldSetIsBorrowedToTrue()
{
// Arrange
var book = new Book { Title = "C# Rehberi", IsBorrowed = false };
// Act
book.Borrow();
// Assert
Assert.True(book.IsBorrowed);
}
Sistem Performansını Optimize Etme İpuçları
Büyük ölçekli kütüphane uygulamalarında bellek yönetimi ve işlem hızı ön plana çıkar. Performansı optimize etmek için şu stratejileri uygulayabilirsiniz:
- Lazy Loading: Kitap detaylarını veya üye geçmişini sadece ihtiyaç duyulduğunda yükleyerek başlangıç süresini kısaltın.
- Caching (Önbellekleme): Sık erişilen "En Çok Okunanlar" listesini bellekte tutarak veritabanı yükünü azaltın.
- Asenkron İşlemler: Veritabanı okuma/yazma işlemlerinde
asyncveawaitkullanarak kullanıcı arayüzünün donmasını engelleyin.
public async Task GetAllBooksAsync()
{
return await Task.Run(() => _books.ToList());
}
Deployment ve Dağıtım Stratejileri
Uygulamanızı canlıya alırken, nesne tabanlı yapının getirdiği modülerliği kullanarak bağımlılıkları (dependencies) yönetmek için Dependency Injection (DI) desenini kullanmalısınız. Bu, uygulamanızın farklı ortamlarda (Test, Staging, Production) farklı konfigürasyonlarla çalışmasını kolaylaştırır.
| Strateji | Avantajı |
|---|---|
| Docker Container | Çevresel bağımlılıkları izole eder. |
| CI/CD Pipeline | Kod değişikliklerinde otomatik test ve dağıtım sağlar. |
Sonuç
C# ile nesne tabanlı bir kütüphane yönetim sistemi kurmak, OOP prensiplerini pekiştirmek için mükemmel bir uygulamadır. Sınıfları doğru tasarlamak, kalıtım ve polimorfizmden yararlanmak, kodunuzun sürdürülebilir ve genişletilebilir olmasını sağlar. Bir sonraki adımınız, bu sistemi bir veritabanı (SQL Server veya PostgreSQL) ile entegre etmek ve bir Web API katmanı ekleyerek dış dünyadan erişilebilir hale getirmek olabilir.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) geçmeden önce giriş doğrulama (input validation), kapsamlı hata yönetimi ve güvenlik denetimlerini (security audits) mutlaka gerçekleştirin.

Yorumlar (0)
Yorum Yaz