'Soyutlama katmanı' ve 'dolaylılık düzeyi' arasındaki fark nedir?


38

Her iki terimin de birbirinin yerine kullanılıp kullanılmayacağından emin değilim. Belki bilgisayar bilimlerinde günlük programlamayla ilgili olmayan bazı akademik farklılıklar vardır? Ya da her iki terimi de yanılmadan birbirlerinin yerine kullanabilir miyim? Belki de her iki terimi de kullandığım bağlama bağlı.

Düzenleme: Her iki terimin de muhtemelen birbiriyle değiştirilebilir olduğunu bulmamın nedeni, Soyutlama katmanı hakkında bir Wikipedia girişi . Burada David Wheelers'ın 'Bilgisayar bilimindeki tüm problemler başka bir dolaylı indirimle çözülebilir.'


7
... çok fazla dolaysızlık sorunu dışında!
Mason Wheeler

@MasonWheeler: Başka, daha az dolaylı bir dolaylı seviye ekleyebilirsiniz…
Jon Purdy

C ++, bir dolaylı katman olmadan bir soyutlama katmanı eklemenizi sağlar, böylece aynı anlama gelemezler.
fredoverflow

Yanıtlar:


30

Soyutlama basitleştirmeyle, dolaylı olarak da yerle ilgilenir.

  • Soyutlamabir nesnenin karmaşık ayrıntılarını daha basit, terimlerin işlenmesi kolaylaştıran "gizleyen" bir mekanizmadır. Programlamada, iyi bir örnek, makine kodu ile sonuçta makine koduna dayalı uygulamalar oluşturmak için çeşitli araçlar arasındaki ayrıntı farkıdır. Visual Studio IDE ile bir Windows Form uygulaması oluşturmayı düşünün. IDE, Uygulamanızı Ne Olduğunu-Ne-Get-Get tarzında kolayca işlenebilen öğeler açısından düşünmenize izin verir. Ekran widget'ının konumu, widget'ı sürükleyerek değiştirebileceğiniz bir çerçevedeki görsel bir konuma soyutlanır. Dahili olarak IDE, widget'ı yüksek seviye bir dil (C # gibi) gibi başka bir soyutlama katmanı kullanarak yönetir. C #, makine kodu kullanılarak yönlendirilmez, "Common Runtime Environment" kullanılarak yönlendirilir

  • İndirme , bir öğenin konumunu saydam hale getirme anlamına gelir. Bir web kaynağının URI'sını biliyorsanız, kesin konumunu bilmeden kaynağa erişebilirsiniz. Kaynağa doğrudan erişemezsiniz, bunun yerine isteğinizi bir dizi sunucu, uygulama ve yönlendiriciden geçiren bir kanaldan erişirsiniz. İndirme, konumun soyutlandığı özel bir soyutlama türü olarak düşünülebilir.


2
Şimdiye kadar en iyi +1 cevap! Bir tane yazmak üzereydi ama bu, aklımdaki kadar yakın.
Newtopian

27

Soyutlamalar dolaylı olarak uygulanır.

Örneğin, sanal bellek: Soyutlama tamamen sizin emrinizde olan bitişik bir adres alanıdır. Bu soyutlama, bir sayfa tablosu aracılığıyla dolaylı kullanım kullanılarak gerçekleştirilir. Doğrudan fiziksel bellek adreslerine erişmek yerine, sanal bir adresden fiziksel bir adrese çevrilirler.

Bir soyutlama katmanı eklemek için bir indirme katmanı eklemelisiniz. Ancak dolaylı ekleme, mutlaka bir soyutlama sağlamaz. Örneğin, her bir değişkende alıcılar ve ayarlayıcılar bulundurmak bir dolaylılık katmanıdır, ancak tek yaptıkları basit elde etmek ve basit değerler koymaktır, soyutlama yoktur.


2
Aslında, son örnek pek iyi değil. Düz alıcılar ve ayarlayıcılar soyutlama ekler. Bunların tek olduğunu bilen, sade, sınıf ilan edenleri. Uygulamayı değiştirmeye karar verirseniz, soyutlamaya karşı oluşturulan herhangi bir kod etkilenmez.
back2dos

dolaylı olan fakat soyutlamayan daha iyi bir örnek verebilir misiniz?
Bay Coder

1
kesinlikle yanlış bir örnek
Morg.

3
Dersler hakkında kim bir şey söyledi? Bir değişkenin görünürlüğünü değiştirmeyle ilgili hiçbir şey söylemedim. Hiçbir şey doğrudan erişmenize engel olamaz; bu bir değişken. Ancak bunu alıcı ve ayarlayıcı üzerinden dolaylı olarak da yapabilirsiniz. Alıcı ve ayarlayıcıyı kullanmanın anlamı, değişkene doğrudan erişmekle aynı olduğundan soyutlama yoktur.
Austin

2
Bunun dışında alıcı ve ayarlayıcının mutlaka 'sadece' değişkene erişmeleri gerekmez. Bir alıcı ve ayarlayıcı kullanıyorsanız, kullanıcının farkında olmadan farklı bir değişkeni kullanmak için değiştirebileceği bir soyutlama ekliyorsunuzdur, dolayısıyla bir soyutlama.
Dominique McDonnell

9

İlk olarak, terimler için uygun tanımları deneyelim:

  1. Soyutlama katmanı şu anlama gelir:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Öte yandan, dolaysızlık seviyesi:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Bunların her ikisi de, kullandığınız sürece aynı anlama gelebilir:

  a) step = going from simple code to complex code. 

7

Anladığım kadarıyla soyutlama çoğunlukla işlevlere, dolaylı olarak da çoğunlukla veriye işaret ediyor. Başka bir deyişle, soyutlama seviyesi yığın izlemenizin ne kadar derinleştiği ve dolaylılık seviyenizin kaç işaretleyiciyi kaldırmanız gerektiğidir. En azından terimleri böyle kullanıyorum.


sanal işlevler işlevler için işaretçiler olarak modellenir mi?
Caleth

7

Soyutlama Katmanı ve Dolaylılık Düzeyi ayrı kavramlardır. Soyutlama, örneğin bir dosya veya yöntem çağrısı kavramı gibi veri parçaları veya program talimatları gibi bir dizi öğenin bir araya getirilmesi ve anlamlı bir şekilde adlandırılmasıdır; örneğin, JNDI'nın bir program içindeki bir kaynağın eninde sonunda bir uygulama kabı tarafından temin edilebilecek gerçek kaynaktan ayrılmasını sağlamak için kullanılması.

Genellikle kavramlar el ele gider ve hangisinin belirli bir yapı için geçerli olduğu, hangi alıştırma veya tartışmanın devam ettiğine bağlıdır. Örneğin, bir API'nin öğrenilmesi veya belgelenmesi sırasında bir arayüzün soyut doğası önemlidir; Bir uygulama için genişletilebilirlik eklerken veya testler oluştururken indirme özelliği de önemlidir.

Bir soyutlama katmanı, soyutlamaların toplanması ve onlara kavramsal bir bütünlük ve kullanım tutarlılığı sağlamasıdır. CreateProcess, bir işlem oluşturan ve yürüten bir demet kodun win32 API adıdır. "Name" bu bağlam için önemlidir, çünkü eğer fonksiyona DoAllocMemThenMakeEnvThenFindEntryPoint gibi bir şey çağırırsak, gerçekten çok soyut olmazdı. Win32 API gibi bir katman, içinden bir programcının girişmemesi önerilebilecek bir engel sağlar. Düşük güç maliyetinde (esneklik, performans vb) karmaşıklığı arayanın bakış açısından kaldırır. Bu işlem, sızdıran soyutlamaların sık sık tartışılmasıyla vurgulanmaktadır: Hazırda Beklet kullanırken doğrudan SQL çağrıları yapmamız veya .NET kullanırken Win32 çağrıları yapmamız gerekebilir.

İndirme ile ilgili olarak, çoğu önemsiz program bazı kullanıcı kodlu dolaylı yöntemlerle çalışır, COBOL'un GİRİŞ-ÇIKIŞ bölümüne gemiden önceki bölümlere tanıklık eder. Veri tabanı gibi bir kaynağa erişirken, koddaki bir JDBC bağlantı dizesinin Seviye 0 indirimi, Seviye 1 olarak bir JNDI bağlantısı (kaynak seçimini bir uygulama kabına gönderen) ve eşleyen bir Yay yapısı oluşturduğunu görebiliriz. Uygulama JNDI tanımlayıcısı, Seviye 2 olarak birçok konteyner kaynağından birine uygulanır. Birden çok seviye, ilişkinin dışında kalan birçok tarafa (bu durumda kod yürütme ve bir veritabanı arasındaki ilişki) bu ilişkiyi yönetmesine olanak tanır. Bu, arayüzler ve olaylar gibi dahili program bileşenlerine eşit olarak uygulanır.

Görüyoruz ki, diğer nitelikleri ne olursa olsun, soyutlama karmaşıklığı azaltıyor, dolaylı kullanım ise onu arttırıyor. Soyutlama gücü azaltırken, indirme de onu artırır. İndirme, varsayılan davranışın özel geri aramalar tarafından geçersiz kılınmasına izin verilerek soyutlamanın gücünü yeniden sağlamak için kullanılabilir.


1

Bir göstericiye bir göstericiye bir göstericiye bir göstericiye bir göstericiye bir göstericiye int, altı dolaylı düzeye sahiptir, ancak hiçbir soyutlama katmanı yoktur.


0

Soyutlamanın iyi bir örneği, bir öğeyi veritabanında saklamak için tek bir yöntem çağırmaktır. Bu yöntem, veri tabanının bağlanması ve çağrılmasıyla ilgili ayrıntıları özetler. Bir dolaylı örnek, kesintilere erişmek için bir yapı kullanıyorsa. Yapıda değerleri ayarladığınızda hala kesmeye erişiyorsunuz. bellekte belirli noktalara yapı üye isimleri vererek yapıdan dolaylı olarak geçer.

Bu yüzden soyutlama, dolaylı olarak sadece bir şeye erişmek için "dolaylı" bir arayüz sağlayan uygulama detaylarını gizler.

Soyutlama, neyin gizlendiğini, dolaylı olarak nereye gideceğinizi anlamanıza gerek olmadığı zamandır.


-1

Bir soyutlama seviyesi (veya katmanı) eklemek ve bir dolaylı seviye eklemek, aynı şeyi söylemenin basit iki yoludur. Bir sorunu çözdüğünüzde genellikle doğrudan bir çözüm denersiniz. Bazen bu mümkün değildir, dolaylı bir çözümü denersiniz. Bu, sorunu basitleştirmek için bir soyutlama yapılmasını gerektirir - çünkü sorunun doğrudan çözülememesi karmaşıktır. Sorunu dolaylı yaklaşımla çözdükten sonra, problemi tekrar çözmeyi düşünmek için bir neden yoktur, fakat daha genel olarak; Bu, bir başka daha yüksek soyutlama seviyesini getirmeyi içerecektir. Ve bu yeni, daha genel çözüm, orijinal dolaylı çözümden bile daha dolaylıdır - yani başka bir dolaylandırma seviyesi getirilmiştir.


3
bu, önceki 7
cevapta

Sağol Gnat. Ben senin fikrini aldım ve yazık ki bu ilginç soru çok fazla spam çekiyor!
ChrisC
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.