it-swarm.dev

Soyutlama nedir?

Programcılar tarafından kullanılan bir programlama soyutlaması ne olduğuna ilişkin genel olarak üzerinde anlaşılmış bir tanım var mı? [Not, programlama soyutlama Word "soyutlama" için sözlük tanımları ile karıştırılmamalıdır.] Kesin, hatta matematiksel bir tanım var mı? Soyutlamalardan bazı açık örnekler nelerdir?

38
mlvljr

"Bir programlama soyutlamasının az çok matematiksel olarak ne olduğunu tanımlayabilir misiniz?" "hayır" dır. Soyutlama matematiksel bir kavram değildir. Birinden limonun rengini matematiksel olarak açıklamasını istemek gibi bir şey.

Yine de iyi bir tanım istiyorsanız: soyutlama, belirli bir fikirden daha genel bir fikre geçme sürecidir. Örneğin, farenize bir göz atın. Kablosuz mu? Ne tür bir sensörü var? Kaç düğme? Ergonomik mi? Nekadar büyük? Tüm bu soruların cevapları farenizi tam olarak tarif edebilir, ancak cevapların ne olduğuna bakılmaksızın, hala bir faredir, çünkü düğmeli bir işaretleme cihazıdır. Fare olmak için gereken tek şey bu. "Silver Logitech MX518" somut, özgün bir öğedir ve "fare" bunun bir soyutlamasıdır. Düşünülmesi gereken önemli bir şey, "fare" gibi somut bir nesnenin olmaması, sadece bir fikir. Masanızdaki fare her zaman daha spesifik bir şeydir - Apple Sihirli Fare veya Dell Optik Fare veya Microsoft IntelliMouse - “fare” sadece soyut bir kavramdır.

Soyutlama katmanlı olabilir ve istediğiniz kadar ince veya kaba taneli (MX518, elektrikle çalışan bir nesne olan bilgisayar çevre birimi olan bir işaret nesnesi olan bir faredir) istediğiniz kadar ileri gidebilir ve neredeyse istediğiniz herhangi bir yönde (faremin bir teli var, yani onu telli bir nesne olarak kategorize edebilirim.Altta da düz, bu yüzden onu ne zaman yuvarlanmayacak bir tür nesne olarak kategorize edebilirim eğimli bir düzleme dik olarak yerleştirilir).

Nesne yönelimli programlama soyutlamalar ve aileleri ya da gruplarını temel alır. İyi OOP, programınızın alanında anlamlı olan ve "sızıntı" yapmayan uygun ayrıntı düzeyinde iyi soyutlamalar seçmek anlamına gelir. Birincisi, fareyi kazanılan bir nesne olarak sınıflandırmak anlamına gelir. eğimli bir düzlemde yuvarlanma, bilgisayar ekipmanını envanter eden bir uygulama için mantıklı değil, ancak bir fizik simülatörü için mantıklı olabilir. Örneğin, yukarıdaki hiyerarşimde, tüm bilgisayar çevre birimlerinin elektrikle çalıştığından emin miyiz? Bir kalemi "çevresel" kategorisine gruplamak istersek, bir sorunumuz olur, çünkü elektrik kullanmaz ve bilgisayar çevre birimlerini elektrik kullanan nesneler olarak tanımladık. daire-elips) problem bu bilmecenin en iyi bilinen örneğidir.

46
nlawalker

Cevapların çoğuna kategorik olarak katılmıyorum.

Bu benim cevabım:

İki set G ve H verildiğinde, bir Galois bağlantısı (alfa, beta) aralarında tanımlanabilir ve birinin diğerinin somutlaştırılması olduğu söylenebilir; bağlantıyı tersine çevirir ve biri diğerinin soyutlamasıdır. Fonksiyonlar bir somutlaştırma fonksiyonu ve bir soyutlama fonksiyonudur.

Bu, tipik olarak bugüne kadar statik bir analiz yaklaşımı olan bilgisayar programlarının soyut yorumlama teorisinden kaynaklanmaktadır.

25
Paul Nathan

Soyutlama What üzerinde daha az, How üzerinde daha az odaklanmaktır. Veya sadece ihtiyacınız olan şeyleri bilebilir ve diğer tüm hizmetler için sağlayıcıya güvenebilirsiniz. Bazen servis sağlayıcının kimliğini bile gizler.

Örneğin, bu site soru sormak ve cevaplamak için bir sistem sunmaktadır. Buradaki neredeyse herkes bu sitenin sorulması, yanıtlanması, oylanması ve diğer şeylerin prosedürlerinin neler olduğunu biliyor. Ancak çok azı, temel teknolojilerin ne olduğunu biliyor. Sitenin ASP.net mvc veya Python ile geliştirilip geliştirilmediği gibi, bunun bir Windows veya Linux sunucusunda çalışıp çalışmadığı gibi. Çünkü bu bizim işimiz değil. Bu nedenle, bu site bize hizmet sunmanın temel mekanizması üzerinde bir soyutlama katmanı tutuyor.

Diğer bazı örnekler:

  • Bir araba tüm mekanizmalarını gizler, ancak araç sahibine sürmek, yakıt ikmali yapmak ve bakımını yapmak için bir yol sağlar.

  • Herhangi bir API, diğer programcılara hizmet sağlayan tüm uygulama ayrıntılarını gizler.

  • OOP) içindeki bir sınıf, özel üyelerini ve genel üyeleri aramak için hizmet veren genel üyelerin uygulanmasını gizler.

  • Java veya C++ 'da Interface veya abstract class Türünde bir nesne kullanırken, gerçek uygulama gizlidir. Interface 'da bildirilen yöntemlerin de çeşitli uygulanan/devralınan sınıflarda farklı olması muhtemeldir, ancak aynı hizmeti alırken, How uygular ve tam olarak Who/What hizmeti sağlıyor.

  • Kimlik Gizleme: "Sam'in bilgisayar programları yazabileceğini biliyorum." soyutlama olabilir- "Sam bir programcı. Programcılar bilgisayar programlarının nasıl yazılacağını biliyorlar." İkinci açıklamada kişi önemli değil. Ancak programlama yapabilmesi önemlidir.

13
Gulshan

Bir programlama soyutlaması, bir sorunun basitleştirilmiş modeli değeridir.

Örneğin, bir TCP/IP bağlantısı veri gönderimi üzerinde bir soyutlamadır. Yalnızca bir ip adresi ve bir bağlantı noktası numarası ekler ve bunu API'ya gönderirsiniz. Kabloların, sinyallerin, mesaj biçimlerinin ve arızaların tüm ayrıntıları ile ilgilenmiyorsunuz.

7
C. Ross

Bir soyutlama sadece bir teoremin programlama versiyonudur.

Resmi bir sisteminiz var, bu sistem hakkında bir fikir öneriyorsunuz. Bunun bir kanıtı var ve eğer işe yararsa, bir teoreminiz var. Teoreminizin geçerli olduğunu bilerek, sistemle ilgili daha fazla kanıtta kullanabilirsiniz. Sistem tarafından sağlanan ilkeler (ifadeler ve int değer türleri gibi) genellikle aksiyom olarak görülür, ancak bu kesinlikle doğru değildir, çünkü makine kodunda yazılan CPU talimatları olmayan her şey bir tür soyutlamadır.

Fonksiyonel programlamada, bir programın matematiksel bir ifade olarak fikri çok güçlüdür ve çoğu zaman tip sistemi (Haskell, F # veya OCAML gibi güçlü, statik olarak yazılmış bir dilde) kanıtlarla teoremi test etmek için kullanılabilir.

Örneğin: ilkel işlemler olarak toplama ve eşitlik kontrollerimiz, ilkel veri türleri olarak tamsayılar ve boolelar olduğunu söyleyelim. Bunlar bizim aksiyomlarımız. Yani şunu söyleyebiliriz 1 + 3 == 2 + 2 bir teoremdir, daha sonra bunun doğru bir ifade olup olmadığını görmek için toplama kurallarını, tamsayıları ve eşitliği kullanın.

Şimdi çoğaltmayı istediğimizi varsayalım ve ilkeliğimiz (kısaca aşkına) bir döngü yapısı ve sembolik referanslar atamak için bir araç içerir. Bunu önerebiliriz

ref x (*) y := loop y times {x +}) 0

Bunu kanıtladım, çarpmanın etkili olduğunu göstereceğim. Şimdi sistemimle (programlama dili) daha fazla şey yapmak için çarpmayı kullanabilirim.

Yazı sistemimi de kontrol edebilirim. (*) bir tür int -> int -> int içerir. 2 ints alır ve int üretir. Eklemenin bir tür int -> int -> int türü vardır, böylece 0 + (dinlenme) bir int ile sonuçlandığı sürece bekler. Benim döngüm her türlü şeyi yapıyor olabilir, ama diyorum ki (x + (x + (x ... + 0))) sonuç bir körili fonksiyonlar zinciri çıktı. Bu toplama zincirinin formu sadece (int -> (int -> (int ... -> int))) bu yüzden son çıktımın bir int olacağını biliyorum. Bu yüzden yazı sistemim diğer kanıtlarımın sonuçlarını tuttu!

Uzun yıllar boyunca bu tür bir fikri birleştirin, birçok programcı ve birçok kod satırı ve modern programlama dilleri var: doyurucu bir ilkeler kümesi ve "kanıtlanmış" kod soyutlamalarının büyük kütüphaneleri.

7
CodexArcanum

Burada iyi cevaplar alıyorsunuz. Sadece dikkatli olurum - insanlar soyutlamanın bir şekilde bir kaide üzerine konması gereken ve yeterince alamadığınız bu harika şey olduğunu düşünürler. O değil. Bu sadece sağduyu. Sadece şeyler arasındaki benzerlikleri tanımakta, böylece bir dizi soruna bir problem çözümü uygulayabilirsiniz.

İzin ver bana ...

Rahatsızlık listemde en üstte insanlar "soyutlama katmanları" ndan iyi bir şeymiş gibi bahsediyorlar. Sevmedikleri sınıflar veya rutinler etrafında "sarmalayıcılar" yaparlar ve sanki onları daha iyi hale getirecekmiş gibi "daha soyut" olarak adlandırırlar. "Prenses ve Bezelye" masalı hatırlıyor musun? Prenses o kadar hassastı ki yatağının altında bir bezelye olsaydı uyuyamazdı ve daha fazla yatak katmanı eklemek yardımcı olmazdı. Daha fazla "soyutlama" katmanı eklemenin yardımcı olacağı fikri, genellikle böyle değildir. Bu sadece temel varlıktaki herhangi bir değişikliğin birden fazla kod katmanı ile dalgalanması gerektiği anlamına gelir.

4
Mike Dunlavey

Sızdıran soyutlamalarda blog yazım bulabileceğinizi düşünüyorum. İlgili arka plan aşağıdadır:

Soyutlama , bir dizi ilgili program parçası arasında ortak olanı almaya, farklılıklarını ortadan kaldırmaya ve programcıların doğrudan temsil eden bir yapı ile çalışmasına yardımcı olan bir mekanizmadır. Bu soyut kavram. Bu yeni yapı (neredeyse) her zaman parametreleştirmelere sahiptir: yapının kullanımını özel ihtiyaçlarınıza uyacak şekilde özelleştirmek için bir araç.

Örneğin, bir List sınıfı, bağlantılı liste uygulamasının ayrıntılarını soyutlayabilir - burada next ve previous işaretlerini manipüle etmek yerine düşünmek yerine sekansa değer ekleme veya çıkarma düzeyinde. Soyutlama, çok daha küçük ilkel kavramlardan faydalı, zengin ve bazen karmaşık özellikler oluşturmak için gerekli bir araçtır.

Soyutlama, kapsülleme ve modülerlik ile ilgilidir ve bu kavramlar genellikle yanlış anlaşılır.

List örneğinde, bağlantılı bir listenin uygulama ayrıntılarını gizlemek için kapsülleme kullanılabilir; örneğin, nesne yönelimli bir dilde, next ve previous işaretleyicilerini özel yapabilirsiniz; burada yalnızca Liste uygulamasının bu alanlara erişmesine izin verilir.

Kapsülleme soyutlama için yeterli değildir, çünkü yapıların yeni veya farklı bir anlayışına sahip olduğunuz anlamına gelmez. Eğer bir List sınıfının tamamı size 'getNext'/'setNext' tarzı erişim yöntemi verirse, sizden uygulama ayrıntılarından kapsüllenir (ör. 'prev' veya 'previous'? alanı statik türü neydi?), ancak çok düşük bir soyutlama derecesine sahip olurdu.

Modülerlik bilgi gizleme ile ilgilidir : Kararlı özellikler bir arabirimde belirtilir ve bir modül bu arabirimi uygulayarak tüm uygulama ayrıntılarını modül içinde tutar. Modülerlik, programcıların değişim ile başa çıkmasına yardımcı olur, çünkü diğer modüller sadece kararlı arayüze bağlıdır.

Bilginin gizlenmesi kapsülleme (kodunuzun kararsız uygulama ayrıntılarına bağlı olmaması için) ile desteklenir, ancak modülerlik için kapsülleme gerekli değildir. Örneğin, C'ye bir List yapısı uygulayarak dünyaya 'next' ve 'prev' işaretçileri gösterebilir, ancak initList(), addToList() ve removeFromList() işlevler. Arayüz kurallarına uyulması koşuluyla, veri yapısının her zaman geçerli bir durumda olmasını sağlamak gibi belirli özelliklerin her zaman sahip olacağına dair garantiler verebilirsiniz. Örneğin Parnas'ın modülerlik üzerine klasik makalesi Meclis'te bir örnekle yazılmıştı. Arayüz tasarımla ilgili bir sözleşme ve bir iletişim şeklidir, bugün güvendiğimiz halde mekanik olarak kontrol edilmesi gerekmez.]

Soyut, modüler ve kapsüllenmiş gibi terimler olumlu tasarım açıklamaları olarak kullanılsa da, bu niteliklerden herhangi birinin varlığının size otomatik olarak iyi tasarım vermediğini fark etmek önemlidir:

  • Bir n ^ 3 algoritması "iyi bir şekilde kapsüllenmişse", yine de geliştirilmiş bir n oturum açma algoritmasından daha kötü performans gösterecektir.

  • Bir arayüz belirli bir işletim sistemine bağlıysa, bir video oyununun Windows'tan iPad'e taşınması gerektiğinde modüler tasarımın hiçbir faydası gerçekleşmeyecektir.

  • Oluşturulan soyutlama çok fazla gereksiz ayrıntı ortaya koyarsa, kendi işlemleriyle yeni bir yapı oluşturulamaz: Aynı şey için başka bir ad olacaktır.

4
Macneil

Wikipedia'nın cevabı yeterince iyi olur mu? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

Bilgisayar biliminde, soyutlamanın mekanizması ve pratiği ayrıntıları azaltır ve faktörleri belirler, böylece bir kerede birkaç kavram üzerine odaklanabilirsiniz.

4
John Fisher

Matematiksel olarak "tamsayı" bir soyutlamadır. Ve tüm tamsayılar için x + y = y + x gibi resmi kanıtlar yaptığınızda, 3 veya 4 gibi belirli sayılar yerine soyutlama "tamsayı" ile çalışıyorsunuz. makine, kayıtların ve bellek konumlarının üzerindeki bir seviyede. Çoğu durumda daha güçlü düşünceleri daha soyut bir seviyede düşünebilirsiniz.

4
Kate Gregory

Bunu başka bir kişiye açıklamanın bir yolu olarak, sonuçlardan geriye doğru:

Bilgisayar programlamasında soyutlama, bir şeyi, birden fazla benzer şeyin genellikle aynı şekilde ele alınabileceği ve aynı şekilde ele alınabileceği noktaya kadar genelleme eylemidir.

Bunu genişletmek istiyorsanız şunları ekleyebilirsiniz:

Bazen bu, tekrarlayan kodun önünü kesmek için polimorfik davranış (arayüzler ve kalıtım) elde etmek için yapılır, diğer zamanlarda, bir şeyin iç işleyişi, ileride değiştirilmek zorunda kalmadan benzer bir çözümle değiştirilebilecek şekilde yapılır. soyutlanmış kabın veya sargının diğer tarafına kodlayın, umarım gelecekte yeniden çalışmayı kısaltır.

Bunun ötesinde, bence örneklere başlamanız gerekiyor ...

2
Bill

Soyutlama, ilgisiz olduğu düşünülen ayrıntıları lehine ilgisiz sayılan ayrıntıları göz ardı ettiğiniz zamandır.

Soyutlama, kapsülleme, bilgi gizleme ve genellemeyi kapsar. Analojileri, metaforları veya buluşsal yöntemleri kapsamaz.

Soyutlama kavramı için herhangi bir matematiksel biçimciliğin kendisi be bir soyutlamadır, çünkü altta yatan şeyin bir dizi matematiksel özelliğe soyutlanmasını gerektirecektir! morphism kategorisi teorisi kavramı, aradığınız şeye muhtemelen en yakın olanıdır.

Soyutlama beyan ettiğiniz bir şey değildir, yaptığınız bir şeydir .

2
Steven A. Lowe

Tamam, sanırım ne istediğini anladım: "'Soyutlamanın' matematiksel olarak titiz bir tanımı nedir."

Eğer durum böyleyse, şanssız olduğunuzu düşünüyorum - 'soyutlama' bir yazılım mimarisi/tasarım terimi ve bildiğim kadarıyla matematiksel bir desteği yok (belki teorik CS'de daha iyi bir kişi beni düzeltir) burada), "kuplaj" veya "bilgi gizleme" den herhangi birinden daha fazlası matematiksel tanımlara sahiptir.

2
Fishtoaster

Programlamada soyutlamanın her zaman ayrıntıları gizlemek ve basitleştirilmiş bir arayüz sağlamak olduğunu düşünüyorum. Programcıların anıtsal görevleri yönetilebilir parçalara ayırabilmelerinin ana sebebidir. Soyutlama ile, tüm cesur ayrıntılar da dahil olmak üzere sorunun bir kısmına çözüm oluşturabilir ve ardından çözümü kullanmak için basit bir arayüz sağlayabilirsiniz. Sonra aslında ayrıntıları hakkında "unutabilirsiniz". Bu önemlidir, çünkü bir kişinin süper karmaşık bir sistemin tüm detaylarını bir anda akıllarında tutmasının bir yolu yoktur. Bu, soyutlamanın altındaki detayların asla tekrar gözden geçirilmesinin gerekmeyeceği anlamına gelmez, ancak şimdilik sadece arayüzün hatırlanması gerekir.

Programlamada, bu basitleştirilmiş arayüz, bir değişkenten (bir grup biti özetler ve daha basit bir matematiksel arayüz sağlar) bir işleve (herhangi bir miktarda işlemi tek bir hat çağrısına özetler) bir sınıfa ve ötesine kadar her şey olabilir.

Sonunda, programcıların ana işi genellikle tüm hesaplama detaylarını soyutlamak ve bilgisayarların nasıl çalıştığı hakkında bir şey bilmeyen bir GUI gibi basit bir arayüz sağlamaktır.

Soyutlamanın avantajlarından bazıları:

  • Büyük bir sorunun yönetilebilir parçalara bölünmesine izin verir. Bir kişinin kayıtlarını bir veritabanına eklerken, veritabanına dizin ağaçları eklemek ve dengelemekle uğraşmak istemezsiniz. Bu iş bir noktada yapılmış olabilir, ancak şimdi soyutlanmıştır ve artık bunun için endişelenmenize gerek yoktur.

  • Birden fazla kişinin bir proje üzerinde birlikte iyi çalışmasına izin verir. Meslektaşımın kodunun tüm giriş ve çıkışlarını bilmek istemiyorum. Sadece nasıl kullanılacağını, ne yaptığını ve işimle (arayüz) birlikte nasıl uyduğunu bilmek istiyorum.

  • Gerekli bilgiye sahip olmayan kişilerin bunu yapmak için karmaşık bir görev yapmalarına izin verir. Annem facebook'unu güncelleyebilir ve ülkenin her yerinde tanıdığı insanları görebilir. Delicesine karmaşık bir sistemin basit bir web arayüzüne soyutlanması olmadan, benzer bir şey yapmaya başlayabilmesinin hiçbir yolu yoktur (bu konuda ben de yapmam).

Ancak soyutlama, aşırı kullanılırsa işleri daha az yönetilebilir hale getirmenin ters etkisine sahip olabilir. Bir problemi çok küçük parçalara böldüğünüzde, hatırlamanız gereken arayüzlerin sayısı artar ve gerçekten neler olduğunu anlamak zorlaşır. Çoğu şey gibi, bir denge bulunmalıdır.

1
Jason B

İnsanlara anlatmaya çalışmanın bir yolu, en iyi yol olmayabilir

2 + 2 ve çıkış 4 ekleyen bir Program düşünün

Bir kullanıcı tarafından iki sayı girişi ekleyen bir program düşünün, x + y = z

Hangisi daha yararlı ve genel?

1

Bir soyutlamanın gereksiz detayları gizleyen bir şey olduğunu iddia ediyorum. Soyutlamanın en temel birimlerinden biri prosedürdür. Örneğin, veriyi bir dosyadan okurken veritabanına nasıl veri kaydettiğim konusunda endişelenmek istemiyorum. Bu yüzden bir save_to_database işlevi oluşturuyorum.

Daha büyük soyutlamalar oluşturmak için soyutlamalar da birleştirilebilir. Örneğin, fonksiyonlar bir sınıfta bir araya getirilebilir, sınıflar bir program oluşturmak için bir araya getirilebilir, programlar dağıtılmış bir sistem oluşturmak için bir araya getirilebilir, vb.

1
Jason Baker

Bu aslında daha uzun bir süre blog yazmak istediğim bir şey, ama hiç bir şey yapmadım. Neyse ki, ben bir zombi temsilcisi ve hatta bir lütuf var. Yayımım oldukça uzun çıktı , ama işte özü:

Programlamadaki soyutlama, belirli bir bağlam içindeki bir nesnenin özünü anlamakla ilgilidir.

[...]

Soyutlama sadece genelleme ile değil, aynı zamanda kapsülleme ile de karıştırılır, aynı zamanda bilgi gizlemenin iki dik kısmıdır: Servis modülü neyi göstermeye istekli olduğuna karar verir ve müşteri modülü neyi görmek istediğine karar verir. Kapsülleme ilk kısım ve ikincisi soyutlamadır. Sadece her ikisi birlikte tam bilgi gizlemeyi oluşturur.

Umarım yardımcı olur.

1
back2dos

Fazladan bir dolaylama seviyesi.

Kullandığınız nesnenin bir Cat veya Dog olup olmadığı umurumda değil, bu yüzden doğru makeNoise()'u bulmak için sanal bir işlev tablosundan geçiyorsunuz işlevi.

Bunun 'daha düşük' ve 'daha yüksek' seviyelere de uygulanabileceğinden eminim - belirli bir işlemci için kullanmak için doğru talimatı arayan bir derleyiciyi veya her şeyi çağırarak Haskell'in Monads hesaplama etkileri üzerinde soyutlamayı düşünün return ve >>=.

1
yatima2975

Bob Martin metriklerinden bazılarını kontrol etmek isteyebilirsiniz

http://en.wikipedia.org/wiki/Software_package_metrics

Bununla birlikte, onun "Soyutluk" unun seninle aynı olduğunu düşünmüyorum. Onun daha ziyade arayüzlerin/soyut sınıfların kullanımı anlamına gelen “bir sınıfta uygulama eksikliği” ölçüsüdür. Ana Sıradan İstikrarsızlık ve Uzaklık muhtemelen aradığınız şeyde daha fazla oynar.

1
MIA

Bir soyutlama, başka bir şey açısından bir şeyi (örneğin bir kavram, bir veri yapısı, bir işlev) temsil etmektedir. Örneğin iletişim kurmak için kelimeler kullanıyoruz. Sözcük, sesler (konuşma) veya grafik semboller (yazma) cinsinden temsil edilebilen soyut bir varlıktır. Bir soyutlamanın ana fikri, söz konusu varlığın temel temsilden farklı olması, tıpkı bir Word'ün onu söylemek için kullanılan sesler veya yazmak için kullanılan harfler olmamasıdır.

Böylece, en azından teoride, bir soyutlamanın altta yatan temsili, farklı bir temsil ile değiştirilebilir. Bununla birlikte, pratikte, soyutlama temeldeki temsilden ve bazen de " sızıntı " ile temsilden nadiren tamamen farklıdır. Örneğin, konuşma yazılı olarak iletilmesi çok zor olan duygusal alt tonlar taşır. Bu nedenle, bir ses kaydının ve aynı kelimelerin bir transkriptinin izleyici üzerinde çok farklı etkisi olabilir. Başka bir deyişle, kelimelerin soyutlanması çoğu zaman sızdırıyor.

Soyutlamalar tipik olarak katmanlar halinde gelir. Kelimeler harflerle temsil edilebilecek soyutlamalardır, bu da kendileri ses soyutlamalarıdır, sırayla kişinin ses akorları tarafından yaratılan ve kulak davulları tarafından tespit edilen hava parçacıklarının hareket modelinin soyutlamalarıdır. .

Bilgisayar bilimlerinde bitler tipik olarak en düşük temsil düzeyidir. Baytlar, bellek konumları, Montaj talimatları ve CPU kayıtları bir sonraki soyutlama seviyesidir. Daha sonra baytlar, bellek konumları ve Montaj talimatları açısından uygulanan daha üst düzey bir dilin ilkel veri türleri ve talimatları var. Daha sonra ilkel veri türleri ve yerleşik dil talimatları açısından uygulanan fonksiyonlar ve sınıflar (= OO dil) varsayarak) Daha basit fonksiyonlar açısından daha karmaşık fonksiyonlar ve sınıflar uygulanır. Bu işlevler ve sınıflar listeler, yığınlar, kuyruklar, vb. Bu şey şemasında her seviye, selefine göre bir soyutlamadır.

1
Dima

Merriam-webster, özeti bir sıfat olarak tanımlar: herhangi bir özel örnekten ayrılır.

Soyutlama bazı sistemlerin bir modelidir. Genellikle soyut bir sistemle soyutlamanın modellenebilmesi için karşılanması gereken bir grup varsayımı listelerler ve genellikle giderek karmaşıklaşan sistemleri kavramsallaştırmamıza izin vermek için kullanılırlar. Gerçek bir sistemden soyutlamaya geçmek, bunun için resmi bir matematiksel yönteme sahip değildir. Bu, soyutlamayı kimin tanımladığına ve soyutlamanın amacının ne olduğuna karar verir.

Çoğu zaman, soyutlamalar matematiksel yapılar olarak tanımlanır. Muhtemelen bilim ve mühendislikte çok sık kullanıldığı için.

Bir örnek Newton mekaniği. Her şeyin sonsuz derecede küçük olduğunu ve tüm enerjinin korunduğunu varsayar. Nesneler arasındaki etkileşimler matematiksel formüllerle açıkça tanımlanmıştır. Şimdi, bildiğimiz gibi, evren tam olarak bu şekilde çalışmaz ve birçok durumda soyutlama sızar. Ancak birçok durumda, çok iyi çalışır.

Bir başka soyut model tipik doğrusal devre elemanları, dirençler, kapasitörler ve indüktörlerdir. Yine etkileşimler matematiksel formüllerle açıkça tanımlanmıştır. Düşük frekanslı devreler veya basit röle sürücüleri ve diğer şeyler için RLC analizi iyi çalışır ve çok iyi sonuçlar verir. Ancak, mikrodalga radyo devreleri gibi diğer durumlar, elemanlar çok büyüktür ve etkileşimler daha incedir ve basit RLC soyutlamaları dayanmaz. Bu noktada yapılacak şey mühendisin kararına bağlıdır. Bazı mühendisler diğerlerinin üstünde başka bir soyutlama yarattı, bazıları ideal op-amp'lerin nasıl çalıştıklarına dair yeni matematiksel formüllerle değiştirildi, diğerleri ideal op amperlerin yerine daha küçük bir karmaşık ağ ile simüle edilen simüle edilmiş gerçek op-amp'lerin yerini aldı. ideal elemanlar.

Diğerlerinin söylediği gibi, basitleştirilmiş bir model. Karmaşık sistemleri daha iyi anlamak için kullanılan bir araçtır.

1
whatsisname

Programlama soyutlamaları, birisinin programsal bir öğe üzerinde yaptığı soyutlamalardır. Diyelim ki öğeleri ve eşyaları ile nasıl bir menü oluşturacağınızı biliyorsunuz. Daha sonra birisi bu kod parçasını ve düşüncesini gördü, hey bu diğer hireachy benzeri yapılarda yararlı olabilir ve Bileşen Tasarım Desenini tanımlayan ilk kod parçasının bir soyutlamasıdır.

Nesneye Dayalı Tasarım Kalıpları soyutlamanın ne olduğuna dair oldukça iyi bir örnektir ve gerçek uygulama anlamına gelmez, ancak bir çözüme yaklaşmamız gerektiği anlamına gelir.

Özetlemek gerekirse, programlama soyutlaması bir problemi anlamamıza izin veren bir yaklaşımdır, bir şey elde etmenin bir yoludur ama gerçek şey değildir

0
guiman

Benim için soyutlama "tam anlamıyla" olmayan bir şeydir, bir fikir gibi bir şeydir. Matematiksel olarak ifade ederseniz, artık soyut değil çünkü matematik beyninizde neler olduğunu ifade eden bir dildir, böylece başka birinin beyninden anlaşılabilir, bu yüzden fikirlerinizi yapılandıramazsınız, çünkü yaparsanız, bu bir fikir değildir artık: bir fikir modelini ifade etmek için beynin nasıl çalıştığını anlamanız gerekir.

Soyutlama, gerçekliği ondan bağımsız olabilecek bir şeye yorumlamanızı sağlayan bir şeydir. Bir plaj ve rüya soyutlayabilirsiniz, ancak plaj var ama rüya yok. Ama ikisinin de var olduğunu söyleyebilirsin, ama bu doğru değil.

Soyutlamadaki en zor şey, onu ifade etmenin bir yolunu bulmaktır, böylece diğer insanlar onu anlayabilir, böylece gerçeğe dönüşebilir. Bu en zor iştir ve gerçekten tek başına yapılamaz: fikirleriniz üzerinde çalışan ve başka biri tarafından anlaşılabilen göreceli bir model icat etmelisiniz.

Bana göre bilgisayar dilindeki soyutlama modelin "matematikleştirilmesi" olarak adlandırılmalıdır, iletilebilecek fikirleri yeniden kullanmakla ilgilidir ve soyut olarak elde edilebilecekle karşılaştırıldığında muazzam bir kısıtlamadır.

Basitçe söylemek gerekirse, atomlar yan yana, ama umursamıyorlar. Bir insanda organize edilmiş çok sayıda molekül, birisinin yanında olduğunu anlayabilir, ancak nasıl yapılacağını anlayamaz, atomların kendilerini nasıl bir şekle soktuğunu.

Genel olarak bir kavram tarafından yönetilen bir nesne kendisini "anlayamaz". Bu yüzden tanrıya inanmaya çalışıyoruz ve neden beynimizi anlamakta zorlanıyoruz.

Şimdi madalya alabilir miyim?

0
jokoon

Burada, matematiksel olmayan bir cevap:

Abtracting programlamada şimdi ayrıntılara aldırış etmiyormuşsunuz gibi davranıyor, oysa aslında bunu yapıyor ve onları her zaman önemsemelisiniz. Temelde rol yapıyor.

0
mojuba

İlginç soru. Programlama söz konusu olduğunda yetkili olarak kabul edilen tek bir soyutlama tanımı bilmiyorum. Diğer kişiler, CS teorisinin veya matematiğinin çeşitli dallarından bazı tanımlara bağlantılar sağlamasına rağmen; Bunu "süpervizyon" a benzer bir şekilde düşünmeyi seviyorum bkz http://en.wikipedia.org/wiki/Supervenience

Programlamada soyutlama hakkında konuştuğumuzda, aslında bir sistemin iki tanımını karşılaştırıyoruz. Kodunuz bir programın açıklamasıdır. Kodunuzun bir özeti, bu programın açıklamasıdır, ancak "daha yüksek" düzeydedir. Elbette orijinal soyutlamanızın daha da yüksek bir soyutlamasına sahip olabilirsiniz (örneğin, yüksek düzeyli bir sistem mimarisinde programın açıklaması ve ayrıntılı tasarımında programın açıklaması).

Şimdi bir tanımı diğerinden "daha yüksek" yapan şey. Anahtar "çoklu gerçekleştirilebilirlik" dir - programı soyutlamanız birçok dilde birçok şekilde gerçekleştirilebilir. Artık birisinin tek bir program için birden fazla tasarım üretebileceğini söyleyebilirsiniz - iki kişi, her ikisi de programı doğru bir şekilde tanımlayan iki farklı üst düzey tasarım üretebilir. Gerçekleşmelerin denkliği farkı yaratır.

Programları veya tasarımları karşılaştırırken, bunu o seviyedeki açıklamanın temel özelliklerini tanımlamanıza izin verecek şekilde yapmalısınız. Bir tasarımın diğerine eşdeğer olduğunu söylemenin karmaşık yollarına girebilirsiniz, ancak bunu düşünmenin en kolay yolu şudur - tek bir ikili program her iki tanımın da kısıtlamalarını karşılayabilir mi?

Peki, bir açıklama seviyesini diğerinden daha yüksek yapan nedir? Diyelim ki bir seviye A (örn. Tasarım belgeleri) ve başka bir seviye B (ör. Kaynak kodu) seviyesine sahibiz. A, B'den daha yüksektir, çünkü A1 ve A2, A seviyesinde eşdeğer olmayan iki tanımsa, bu açıklamaların gerçekleşmeleri, B1 ve B2 da gerekir. B seviyesinde eşdeğer değildir. Ancak bunun tersi mutlaka doğru değildir.

Dolayısıyla, iki farklı tasarım belgesini karşılayan tek bir ikili program üretemezsem (yani, bu tasarımların kısıtlamaları birbiriyle çelişir), o zaman bu tasarımları uygulayan kaynak kodu farklı olmalıdır. Ancak diğer taraftan, aynı ikili programa derlenemeyen iki kaynak kodu kümesi alırsam, yine de bu iki kaynak kodu kümesinin derlenmesinden kaynaklanan ikili dosyaların her ikisinin de aynı tasarımı karşılaması olabilir. belgesi. Dolayısıyla tasarım belgesi kaynak kodunun bir "soyutlaması" dır.

0
wahbedahbe