Kapsülleme ve Soyutlama Arasındaki Fark


87

Bugün bir röportajım vardı. OOP'den Kapsülleme ve Soyutlama arasındaki fark hakkında bir sorum var ?

Ona, Encapsulation'ın temelde veri üyelerini ve üye işlevlerini Sınıf adı verilen tek bir birime bağlamak olduğu bilgisine yanıt verdim . Oysa Soyutlama & uygulama gizlemek karmaşıklığına temelde kullanıcılara erişim kolaylığı sağlamaktadır. Cevabıma uyacağını düşündüm. Ancak, her ikisinin de amacı bilgiyi gizlemekse, o zaman bu ikisi arasındaki gerçek fark nedir? Cevap veremedim.

Bu soruyu sormadan önce, StackOverFlow'da bu iki OOP kavramı arasındaki fark hakkında diğer konuları okudum . Ama kendimi görüşmeciyi ikna edecek bir konumda bulmuyorum.

Biri lütfen bunu en basit bir örnekle gerekçelendirebilir mi?


13
ve sonunda, işi aldın mı? :)
Adrian Księżarczyk

1
@WPFbee Talihsiz!
Aimal Khan

3
İnsanların Soyutlama ve Kapsülleme'yi neden karşılaştırdığını bilmiyorum. Neden onları iki farklı OOP kavramı olarak kabul edemiyoruz?
Mr ASquare


@WpfBee Soyutlamanın saklanmakla ilgisi yok, Sadece cevabımı kontrol et
S Vinesh

Yanıtlar:


74

Kapsülleme, dışarıdan gelenlerin doğrudan erişmesini önlemek için sınıfta çok sık değiştirilebilen değişkenleri veya bazı uygulamaları gizler . Alıcı ve ayarlayıcı yöntemlerle erişmeleri gerekir.

Soyutlama , bir şeyi gizlemek için de kullanılır, ancak daha yüksek derecede (sınıf, arayüz) . Müşteriler soyut bir sınıf (veya arayüz) kullanır, kim veya hangisi olduğu umurlarında değildir, sadece ne yapabileceğini bilmeleri gerekir.


7
Mükemmel. Bana öyle geliyor ki cevabınız sadece görüşmeci sorumu hedef alıyor. Cevabınızı pratik bir örnekle yeniden yinelemeye çalışıyorum. Cevabınızı haklı çıkarırsa lütfen bana bildirin. Televizyondan bir örnek alalım. Kapsülleme, onu bir TV yapmak için bir araya gelen dahili devreler, LED'ler vb. Soyutlama, açma-kapama, ses, kanal ayarı ve onu çalıştırmak için sağlanan diğer düğmelerdir.
WpfBee

Erkeklerin soyutlamasının, uygulamayı gizlemekle ilgisi yoktur ... soyutlama, bir sınıfla polimorfik bir şekilde etkileşime girmek için bir yöntemdir
Mortalus 21

1
@Mortalus - 1. ifadenize katılmıyorum "soyutlamanın uygulamayı gizlemekle ilgisi yok". Bence, Soyutlama kavramını öğrenmeye başladığımızda, bize öğretilen ilk şey, uygulamanın karmaşıklığını gizlemek ve onu kullanması için kullanıcıya bir arayüz sağlamaktır. Çünkü kullanıcı uygulama karmaşıklığıyla ilgilenmeyebilir. Pratik bir TV veya AC örneği alabilirsiniz. Başka bir şey de, uygulamayı gizlemiyorsa, neden soyut sınıfta gövdesi olmayan bir yöntem sağladığımızdır. Uygulamayı burada açıkça saklıyoruz.
WpfBee

1
@Mortalus - Ayrıca bir wiki bağlantısından bahsettiniz. Bu ilk ifade - "Bilgisayar biliminde, soyutlama, uygulama ayrıntılarını gizlerken, veri ve programların biçim olarak anlamlarına (anlambilim) benzer bir temsille tanımlandığı süreçtir. programcı aynı anda birkaç kavrama odaklanabilir. " kendisi Soyutlama'nın uygulamayı gizlemeyi amaçladığını öne sürer. 2. ifadenize katılıyorum ama 1. ifadenize katılmıyorum.
WpfBee

1
Bence Encapsulation sadece tek bir birim inşa etmekle ilgili, onu saklamanız veya saklamamanızla ilgili değil. Soyutlama daha çok bir şeyleri saklamakla ilgili olduğu için, lütfen yanılıyorsam düzeltin.
raj240


12

Soyutlama - bir dizi nesnenin ortak temel özelliklerini belirleme sürecidir (ve bu sürecin sonucudur). Soyutlamanın bir genelleme süreci olduğu söylenebilir: İncelenen tüm nesneler, tümü belirli özelliklere sahip olan (ancak başka açılardan farklı olan) nesnelerin bir üst kümesine dahil edilir.

Kapsülleme - dahili uygulamayı dış dünyadan gizlemek için verileri ve bu verileri tek bir birime dönüştüren işlevlerin kapatılması işlemidir.

Bu, belirli bir programlama diliyle ilgili olmayan genel bir cevaptır (soruda olduğu gibi). Yani cevap şu: soyutlama ve kapsüllemenin ortak hiçbir yanı yok. Ancak uygulamaları birbirleriyle ilgili olabilir (örneğin, Java'da: Kapsülleme - ayrıntılar bir sınıfta gizlidir, Soyutlama - ayrıntılar bir sınıfta veya arabirimde hiç mevcut değildir).


11

Kapsülleme: Kodu ve verileri tek bir birime sarmak. Classyöntemi ve özelliği sarmaladığı için bir kapsülleme örneğidir.

Soyutlama: Dahili ayrıntıları gizlemek ve yalnızca işlevselliği göstermek. Soyutlama, nesnenin nasıl yaptığı yerine ne yaptığına odaklanır. Sınıfların genelleştirilmiş görünümünü sağlar.

int number = 5;
string aStringNumber = number.ToString(); 

Burada ToString () soyutlamadır. Ve bu mekanizma numberdeğişkeninin dizeye nasıl dönüştürüldüğü ve nasıl başlatılacağı aStringNumberkapsüllemedir.

Hesap makinesinin gerçek dünyasından bir örnek alalım. Kapsülleme, onu bir hesap makinesi yapmak için bir araya gelen dahili devreler, pil vb. Soyutlama, açma-kapama, temizleme ve onu çalıştırmak için sağlanan diğer düğmeler gibi farklı düğmelerdir.


7

Soyutlama: Genellikle bir dizi sınıfa polimorfik erişim sağlamak için yapılır. Soyut bir sınıf somutlaştırılamaz, dolayısıyla daha somut bir temsil yaratmak için başka bir sınıfın ondan türetilmesi gerekecektir.

Soyut bir sınıfın yaygın bir kullanım örneği, somut sınıfın kendi "somut" yolunda uygulayabilmesi için soyut bir enjeksiyon noktasının tanıtıldığı bir şablon yöntem tasarım modelinin bir uygulaması olabilir.

bkz: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

Kapsülleme: Belirli bir sınıfın uygulama karmaşıklığını, onu kullanacak istemciden gizleme işlemidir, "istemci" nin sınıfı yazan kişinin bir program veya olay olabileceğini unutmayın.

bkz: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


1
soyutlama soyut sınıfla mı ilgilidir?
vishnu viswanath

@vishnuviswanath, evet, soyut sınıf ve arayüzler kullanarak soyutlama uygulayabiliriz.
invzbl3

3

Soyutlama, Kapsülleme ve Bilgi gizleme arasındaki farklılıklara derinlemesine değinen harika bir makale var: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

İşte makaleden çıkan sonuç:

Soyutlama, bilgi saklama ve kapsülleme çok farklı, ancak birbiriyle oldukça ilişkili kavramlardır. Soyutlamanın, hangi belirli bilgilerin görünür olması gerektiğini ve hangi bilgilerin gizlenmesi gerektiğini belirlememize yardımcı olan bir teknik olduğu iddia edilebilir. Bu durumda, kapsülleme, gizlenmesi gerekenleri gizleyecek ve görünür olması amaçlanan şeyi görünür kılacak şekilde bilgiyi paketleme tekniğidir.


2

Her ikisindeki fark, amacımız müşterinin mantığımızın iç görüntüsünü görmesini engellemekse, verileri gizlemek için yalnızca View Point
Encapsulation kelimesi kullanılır.

Amacımız müşterimize dışarıdan bir görünüm göstermekse, soyutlama kelimesi verileri gizlemek için kullanılır.

Dış görünüm, varsayalım ki

BubbleSort(){
//code 
swap(x,y);
}

Burada, müşterimize hangi mantığı uyguladığımızı göstermek için kabarcık sıralamasında takas kullanıyoruz, burada takas (x, y) 'yi tüm kodla değiştirirsek, tek bir durumda mantığımızı anlayamıyor


2

Evet, Soyutlama ve Kapsülleme'nin saklanmakla ilgili olduğu doğrudur.

  • Tasarım Düzeyinde yalnızca ilgili ayrıntıların kullanılması ve gereksiz verilerin gizlenmesine Soyutlama denir . (Daha soyut veya genel hale getirmek için bir 'Araba' sınıfı için yalnızca ilgili özellikleri seçmek gibi.)

  • Kapsülleme , verilerin Uygulama Düzeyinde gizlenmesidir . Verilerin doğrudan / harici erişimden nasıl gizleneceği gibi. Bu, harici erişimi önlemek için verileri ve yöntemleri tek bir varlığa / birime bağlayarak yapılır. Bu nedenle, kapsülleme, uygulama düzeyinde veri gizleme olarak da bilinir.


3
Bu cevabın mevcut diğer 12 cevaptan ne kadar farklı olduğunu açıklayabilir misiniz?
Stephen Rauch

2

Kapsülleme:

Bir çeşit ilaç kapsülü gibi bir şeyi saklamak. Kapsülde ne olduğunu bilmiyoruz, sadece alıyoruz. Programlamada olduğu gibi - sadece bazı özel yöntem veya özellik kodunu gizleriz ve yalnızca kapsül gibi çıktı verir. Kısacası, kapsülleme verileri gizler.

Soyutlama:

Soyutlama, mantığı veya uygulamayı gizlemek anlamına gelir. Örneğin, tabletleri alıyoruz ve renklerini görüyoruz ama bunun amacının ne olduğunu ve vücutta nasıl çalıştığını bilmiyoruz.


0

Soyutlama

Java'da soyutlama, bilgiyi gerçek dünyaya gizlemek anlamına gelir. Taraf arasında “hizmetten yararlanmak için ne yapmamız gerektiğini” anlatan sözleşmeyi kurar.

Örnek, API geliştirmede, gerçek uygulama yerine sadece hizmetin soyutlanmış bilgileri dünyaya açıklanmıştır. Java'daki arayüz bu kavramı çok iyi bir şekilde gerçekleştirmeye yardımcı olabilir.

Arayüz, taraflar arasında, örneğin üretici ve tüketici arasında sözleşme sağlar. Üretici, tüketiciye ürünün nasıl yapıldığını bildirmeden malları üretir. Ancak, Yapımcı arayüz aracılığıyla tüm tüketicilerin hangi ürünü satın alabileceğini bilmesini sağlar. Üretici, soyutlama yardımı ile ürünü tüketicisine pazarlayabilir.

Kapsülleme:

Kapsülleme, soyutlamanın bir düzey aşağısıdır. Aynı ürün şirketi, diğer üretim gruplarından gelen bilgileri korumaya çalışır. Örneğin, bir şirket şarap ve çikolata üretiyorsa, kapsülleme, her bir ürünün birbirinden nasıl yapıldığına dair bilgilerin korunmasına yardımcı olur.

  1. Biri şarap ve diğeri çikolata için ayrı bir paketim varsa ve pakette tüm sınıflar varsayılan erişim değiştirici olarak belirtilmişse, tüm sınıflar için paket düzeyinde kapsülleme veriyoruz.
  2. Bir paket içinde, dosyalanan her sınıfı (üye alanı) özel olarak ilan edersek ve bu alanlara erişmek için genel bir yönteme sahip olursak, bu şekilde bu alanlara sınıf düzeyinde kapsülleme sağlar.

0

Açıklığa kavuşturmak için sadece birkaç nokta daha var.

Veri soyutlaması ile soyut sınıfı karıştırmamak gerekir. Onlar farklı.

Genel olarak soyut sınıf veya yöntemin temelde bir şeyi gizlemek olduğunu söylüyoruz. Ama hayır .. Bu yanlış. Soyut kelimesinin anlamı nedir? Google arama, İngilizce kelime soyutlamanın ne anlama geldiğini söylüyor

"Düşüncede veya bir fikir olarak var ama fiziksel veya somut bir varlığa sahip değil."

Ve bu, soyut sınıf durumunda da doğru. Yöntemin içeriğini gizlemiyor, ancak yöntemin içeriği zaten boş (fiziksel veya somut bir varlığa sahip değil) ancak bir yöntemin nasıl olması gerektiğini (düşüncede veya bir fikir olarak var) veya bir yöntemin calss içinde olması gerektiğini belirliyor. .

Peki soyut yöntemleri ne zaman kullanıyorsunuz?

  • Temel sınıftan bir yöntem, onu genişleten her çocuk sınıfta farklı olduğunda.
  • Ve böylece, alt sınıfın bu işlevi uyguladığından emin olmak istersiniz.
  • Bu aynı zamanda yöntemin zorunlu imzaya sahip olması için n sayıda parametreye sahip olmasını sağlar.

Soyut sınıf hakkında! - Bir Abstract sınıfı somutlaştırılamaz, yalnızca genişletilemez! Ama neden ?

  • Soyut yönteme sahip bir sınıfın kendi örneğini oluşturması engellenmelidir çünkü içindeki soyut yöntemler anlamlı bir uygulamaya sahip değildir.
  • Hatta herhangi bir nedenle o sınıfınızın bir örneğine sahip olmanın daha az anlamlı olduğunu anlarsanız, bir sınıfı soyut bile yapabilirsiniz.

Abstract sınıfı, yeni bir örnek oluşturmamıza yardımcı olur!

Bir sınıftaki soyut bir yöntem, alt sınıfı, sağlanan imza ile kesinlikle bu işlevi uygulamaya zorlar!


0

Bunu yukarıda tartışılan aynı örnekle açıklamama izin verin. Lütfen aynı TV'yi düşünün.

Kapsülleme : Uzaktan kumandayla yapabileceğimiz ayarlamalar iyi bir örnektir - Sesi YUKARI / AŞAĞI, Renk ve Kontrast - Tek yapabileceğimiz, bunu sağlanan minimum ve maksimum değere ayarlamaktır ve uzaktan kumandada sağlananın ötesinde hiçbir şey yapamayız - Alıcı ve ayarlayıcıyı burada hayal edin (Ayarlayıcı işlevi, Evet ise, sağlanan değerin geçerli olup olmadığını kontrol edecektir, aksi takdirde işlemi işler, değişiklik yapmamıza izin vermez - sesi kıssak bile sesi sıfırdan fazla azaltamayacağımız gibi yüz kez).

Soyutlama : Aynı örneği burada da alabiliriz ancak daha yüksek bir Derece / Bağlam ile. Sesi azaltma düğmesi sesi azaltacaktır - bu, kullanıcıya sağladığımız bilgidir ve kullanıcı ne uzaktan kumandadaki kızılötesi vericinin ne de TV'deki alıcının farkında değildir ve sonraki sinyal ve mikroişlemciyi ayrıştırma sürecini bilmemektedir. TV'nin içindeki mimari. Basitçe ifade etmek gerekirse bağlamda buna ihtiyaç yoktur - Sadece gerekli olanı sağlayın. Burada Metin kitabı tanımı kolaylıkla ilişkilendirilebilir, örn., İçsel uygulamayı gizlemek ve bunu nasıl yaptığından çok sadece ne yapacağını sağlamak!

Umarım biraz açıklığa kavuşturur!


0

Röportajla karşılaşan ben olsaydım, son kullanıcı bakış açısı soyutlama ve kapsülleme oldukça aynıdır diyebilirim. Bilgi gizlemekten başka bir şey değildir. Bir Yazılım Geliştiricisi bakış açısı olarak Soyutlama, tasarım düzeyinde sorunları çözer ve Kapsülleme sorunu uygulama düzeyinde çözer


0

Kısaca, Abstractionuygulamayı gizleyerek ve sınıf örneğiyle etkileşime girebilmek için bir arabirim uygulayarak sınıf düzeyinde gerçekleşir. Oysa Encapsulationbilgi gizlemek için kullanılır; örneğin, doğrudan erişimi yasaklamak için üye değişkenlerini özel yapmak ve onlara doğru erişim için alıcılar ve ayarlayıcılar sağlamak.


0

Evet !!!! Encapsulation'ın bir tür gelişmiş özel kapsam soyutlaması olduğunu söylersem ,

Kaçınız cevabımı okudu / oy verdi. Neden böyle söylediğimi inceleyelim.

Talepte bulunmadan önce iki şeyi netleştirmem gerekiyor.

Biri veri saklama, diğeri ise soyutlamadır.

Veri gizleme

Çoğu zaman, dahili verilerimize doğrudan erişim sağlamayacağız. İç verilerimiz doğrudan dışarı çıkmamalı, çünkü dışarıdan bir kişi iç verilerimize doğrudan erişemez. Her şey güvenlikle ilgili çünkü belirli bir nesnenin iç durumlarını korumamız gerekiyor.


Soyutlama

Basit olması için, iç uygulamaları gizlemek soyutlama olarak adlandırılır. Soyutlamada sadece gerekli şeylere odaklanıyoruz. Temel olarak, soyutlamada "Nasıl yapılır" dan değil "Ne yapmalı" dan bahsediyoruz. Güvenlik, "nasıl uyguladığımızı" vurgulamayacağımız için soyutlama ile de sağlanabilir. Uygulamayı değiştirebileceğimiz için sürdürülebilirlik artırılacak ancak son kullanıcımızı etkilemeyecektir.


"Kapsülleme bir tür gelişmiş özel kapsam soyutlamasıdır" dedim. Neden? çünkü kapsüllemeyi veri gizleme + soyutlama olarak görebiliriz

kapsülleme = veri gizleme + soyutlama

Kapsüllemede, verileri dışarıdaki kişilerin verileri görememesi için saklamamız ve verilere erişmek için kullanılabilecek yöntemler sağlamamız gerekir. Bu yöntemlerin, bu şeylerin içinde, dışarıdan bir kişiye de gizlenmiş doğrulamaları veya başka özellikleri olabilir. Yani burada, erişim yöntemlerinin uygulanmasını saklıyoruz ve buna soyutlama deniyor.

Bu yüzden yukarıdaki gibi kapsüllemenin bir tür soyutlama olduğunu söyledim.

Peki fark nerede ?

Basitlik, sürdürülebilirlik ve güvenlik için kullanıcıdan bir şey gizliyorsak, soyutlama genel bir farktır ve

kapsülleme, dahili durumu gizlediğimiz (veri gizleme) ve verilere erişmek için yöntemler sağladığımız ve dış kişiden gizlenen bu yöntemlerin uygulanmasını sağladığımız (soyutlama) dahili durum güvenliği ile ilgili özel bir durumdur.


-2

Soyutlama: Sınıfımızın dışına açık olması gereken minimum fonksiyonlar ve değişkenler nelerdir?

Kapsülleme: Bu gereksinimin nasıl karşılanacağı, yani nasıl uygulanacağı.


Kapsülleme, soyutlamayı başarmanın bir yolu değildir. Biraz farklı 2 kavramdır ancak ince bir bağları vardır.
varsh

İkisinin de farklı kavramlar olmadığını düşünüyorum, bez u soyut sınıfla kapsüllemeyi başarabilir.
K Kishore Kumar Reddy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.