Bir mülakata hazırlanıyorum ve OOP kavramlarımı tazelemeye karar verdim. Yüzlerce makale mevcut, ancak her biri farklı şekilde tanımlıyor gibi görünüyor. Bazıları şöyle diyor
Soyutlama "sahip olan ortak kalıpları belirleme sürecidir sistematik varyasyonlar; bir soyutlama ortak kalıbı temsil eder ve hangi varyasyonun kullanılacağını belirtmek için bir araç sağlar" (Richard Gabriel).
ve soyut sınıflar aracılığıyla elde edilir.
Bazıları diğer şöyle diyor
Soyutlama, müşteriye sadece gerekli detayları göstermek anlamına gelir. nesne
ve
Diyelim ki Employee sınıfınızda bir "CalculateSalary" metodunuz var, parametre olarak EmployeeId'yi alır ve çalışanın maaşını döndürür. tamsayı değeri olarak geçerli ay için çalışan. Şimdi eğer birisi bu yöntemi kullanmak istiyor. Çalışanın nasıl çalıştığını önemsemesine gerek yoktur. nesne maaşı hesaplar mı? Endişelenmesi gereken tek şey yöntemin adı, girdi parametreleri ve sonuçların biçimi üye,
Google'da tekrar tekrar araştırdım ve sonuçların hiçbiri bana doğru bir cevap vermiyor. **Şimdi, kapsülleme tüm bunların neresinde? Aradım ve bir stack overflow sorusu buldum. Bu soruya verilen cevaplar bile kafa karıştırıcıydı Burada, şöyle diyor
Kapsülleme, soyutlamanın bir parçası olarak kullanılan bir stratejidir. Kapsülleme nesnelerin durumunu ifade eder - nesneler durumlarını kapsüller ve dışarıdan gizleyin; sınıfın dış kullanıcıları onunla etkileşime girer yöntemleri aracılığıyla, ancak sınıfların durumuna doğrudan erişemez. Yani sınıf, kendi sınıfıyla ilgili uygulama ayrıntılarını soyutlar durum.
Ve burada bir başka tanınmış üye şöyle diyor,
Bunlar farklı kavramlardır.
Soyutlama, tüm kavramları rafine etme sürecidir. bir nesnenin gereksiz/önemsiz niteliklerini ve yalnızca alanınız için en uygun özellikler.
Şimdi tüm konsepti karıştırdım. Soyut sınıf, kalıtım, erişim belirleyicileri ve hepsini biliyorum. Tek bilmek istediğim **bir mülakatta bana soyutlama ve/veya kapsülleme hakkında soru sorulduğunda nasıl cevap vermeliyim?
Lütfen mükerrer olarak işaretlemeyin. Benzer birkaç soru olduğunu biliyorum. Ancak çelişkili açıklamalar arasında kafa karışıklığını önlemek istiyorum. Güvenilir bir bağlantı önerebilecek olan var mı? Tekrar karışıklık yaratmadığı sürece stackoverflow sorusuna bir bağlantı da memnuniyetle karşılanır :)
EDIT: Cevaplara ihtiyacım var, biraz c# odaklı
Bence bunlar biraz farklı kavramlardır, ancak genellikle birlikte uygulanırlar. Kapsülleme, uygulama detaylarını çağırandan gizlemek için kullanılan bir teknikken, soyutlama daha çok anlaşılmaya yardımcı olmak için bilinen nesnelere/süreçlere benzeyen nesneler yaratmayı içeren bir tasarım felsefesidir. Kapsülleme, bir soyutlama oluşturmak için kullanılabilecek birçok teknikten sadece biridir.
Örneğin, "pencereleri" ele alalım. Bunlar geleneksel anlamda pencereler değildir, sadece ekrandaki grafiksel karelerdir. Ancak onları pencere olarak düşünmek yararlıdır. Bu bir soyutlamadır.
Eğer "windows API" metin veya grafiklerin bir pencerenin sınırları içinde fiziksel olarak nasıl işlendiğinin ayrıntılarını gizliyorsa, bu kapsüllemedir.
Bildiğim kadarıyla kapsülleme, sınıfların verilerini kendi içlerinde saklamak ve yalnızca dış dünyadan erişilmeleri gerekiyorsa setter / getter'lar aracılığıyla erişilebilir hale getirmektir.
Soyutlama, sınıfın kendisi için tasarlanmasıdır.
Yani, sınıf ağacınızı nasıl oluşturursunuz, hangi yöntemler geneldir, hangileri miras alınır, hangileri geçersiz kılınabilir, hangi nitelikler yalnızca özel düzeydedir veya korumalıdır, sınıf kalıtım ağacınızı nasıl oluşturursunuz, final sınıfları, abtract sınıfları, arayüz-uygulama kullanır mısınız.
Soyutlama daha çok tasarım aşamasına yerleştirilirken, kapsülleme de geliştirme aşamasına dahil edilir.