Soyutlama nedir? [kapalı]


38

Programcılar tarafından kullanılan bir programlama soyutlamasının ne olduğu konusunda genel olarak kararlaştırılmış mı? [Dikkat, programlama soyutlama "soyutlama" kelimesinin sözlük tanımlarıyla karıştırılmamalıdır.] Belirgin, hatta matematiksel bir tanım var mı? Bazı soyutlama örnekleri nelerdir?


.. ve bu ilanı gönderirken robot olmadığımı kanıtlamak zorunda kalmak gerçekten çok fazla şey istediğimi gösteriyor :)
mlvljr

8
"Matematiksel" derken ne demek istiyorsun? Soyutlamayı matematiksel bir kavram olarak düşünmezdim.
Fishtoaster

2
@mlvljr: Üzgünüm, takip ettiğimden hala emin değilim. Soyutlama sadece bir şeyle başa çıkmanın daha basit bir yolunu sağlama uygulamasıdır. Resmi araçların / yöntemlerin bununla bir ilgisi olduğunu anlamıyorum.
Fishtoaster

1
@mlvljr, Tüm programlama özniteliklerini kapsayan bir matematik örneği mi yoksa bir matematik mi istiyorsunuz? İkincisi var sanmıyorum.
C. Ross,

8
Perhpas cstheory.stackexchange.com bu soru için doğru yer
Conrad Frix

Yanıtlar:


46

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

Yine de iyi bir tanım istiyorsan: soyutlama, belirli bir fikirden daha genel olana geçme sürecidir. Örneğin, farenize bir bakın. Kablosuz mu? Ne tür bir sensörü var? Kaç tane buton var? Ergonomik mi? Nekadar büyük? Tüm bu soruların cevapları farenizi tam olarak tanımlayabilir, ancak cevapların ne olduğuna bakılmaksızın, hala bir faredir, çünkü düğmeleri olan bir işaretleme aygıtıdır. Fare olmak için gereken her şey bu. "Silver Logitech MX518" somut, özel bir öğedir ve "fare" bunun bir özetidir. Düşünülmesi gereken önemli bir şey "fare" gibi somut bir nesnenin olmaması, sadece bir fikir. Masanızdaki fare her zaman daha belirgin bir şeydir -

Soyutlama, istediğiniz gibi katmanlı ve ince veya kaba taneli olabilir (MX518, bir bilgisayar çevre birimi olan elektrikle çalışan bir nesne olan işaret nesnesi olan bir faredir), istediğiniz yere kadar gidebilir ve istediğiniz hemen her yönde (faremin bir teli var, yani onu teli olan bir nesne olarak kategorize edebileceğim anlamına gelir. Ayrıca altta düzdür, bu yüzden onu yuvarlanmayacak türden bir nesne olarak kategorize edebilirim. eğik bir düzlemde dik yerleştirilmiş).

Nesneye yönelik programlama, soyutlamalar kavramı ve aileleri veya bunların grupları üzerine kuruludur. İyi OOP, programınızın etki alanında anlamlı olan ve "sızıntı yapmayan" uygun ayrıntı düzeyinde iyi soyutlamalar seçmek anlamına gelir. Birincisi, fareyi eğimli bir düzlemde yuvarlanmayacak bir nesne olarak sınıflandırmak, bilgisayar ekipmanlarını stoklayan bir uygulama için anlam ifade etmiyor, ancak fizik simülatörü için anlamlı olabilir. İkincisi, bazı nesneler için anlam ifade etmeyen bir hiyerarşiye "kendinizi sıkıştırmaktan" kaçınmanız gerektiği anlamına gelir. Örneğin, yukarıdaki hiyerarşimde, hepsinden emin miyiz?bilgisayar çevre birimleri elektrik ile çalışıyor mu? Peki ya ekran kalemi? Bir kalemi "çevre birimi" kategorisine ayırmak istiyorsak, elektrik kullanmıyor ve bilgisayar çevre birimlerini elektrik kullanan nesneler olarak tanımladığımız için bir sorunumuz var. Daire elips sorun Bu çözülmesi en iyi bilinen bir örnektir.


2
Sanırım görüyorum; özellikle bir yönteme veya işleve soyut bir şekilde, yani uygulamasının tersine olan sözleşmesine gönderme yapmaktan bahsediyorsunuz. İfadeleriniz doğru ve bu terimin tam olarak geçerli bir kullanımı; Bir yöntem çağrısı, bir tür somut davranışın soyutlanmasıdır.
nlawalker

4
@nlawalker: Soyutlamayı genelleme ile karıştırıyorsun. Aynı şey değiller. Tarif ettiğiniz şey ikincisidir ('belirli bir fikirden daha genel bir fikire geçme '). Soyutlama, somut şeylerden soyut şeylere geçiyor, örneğin 7 mavi ve 7 kırmızı mermer var ve 'Aynı sayıda aynı renkli mermerden oluşan iki setim var' diyor: burada somut şeylerden (mermerlerden) soyut şeylere geçiyorum (sınıflar ve eşdeğer kümeler). BTW, doğal bir sayı olan n, bu kümeler arasındaki bire bir eşleme ile tanımlanan dairesel olmayan tüm eşdeğer kardinalite kümelerinin sınıfıdır.
pillmuncher

33
Bir limonun rengi, matematiksel olarak, yaklaşık 570 nm dalga boyunda ışıktır.
Erik,

1
@Erik Bunu yazacaktım. Bah!
Gary Rowe

1
@Erik Bu fizik, matematik değil :) Matematik, "ışık" gibi kavramlar hakkında hiçbir şey bilmiyor. Işık ampiriktir; Matematik değil.
Andres F.

25

Kategorik olarak cevapların çoğuna katılmıyorum.

Bu benim cevabım:

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

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


8
Tamam, profesörlük için altın bir yıldız elde edersiniz :)
Mike Dunlavey

@Mike: Yay? :-)
Paul Nathan

Ah ve bir örnek olabilir mi?
mlvljr

2
@mlvljr: di.ens.fr/~cousot/AI astree.ens.fr bir veri taslağı sunar.
Paul Nathan,

1
Amir: statik analiz dünyasından soyutlamanın teknik tanımı.
Paul Nathan,

13

Soyutlama daha çok odaklanmakta Whatve daha az üzerinde durmaktadır How. Ya da sadece ihtiyacınız olan şeyleri bildiğinizi ve diğer tüm hizmetler için sağlayıcıya güvendiğinizi söyleyebilirsiniz. Bazen servis sağlayıcının kimliğini bile gizler.

Örneğin, bu site soru sormak ve cevaplamak için bir sistem sunar. Neredeyse herkes bu sitedeki soru sorma, cevaplama, oy kullanma ve diğer işlemlerin ne olduğunu bilir. Ancak çok az kişi, temel teknolojilerin ne olduğunu bilir. Sitenin ASP.net mvc veya Python ile geliştirilip geliştirilmediği gibi, bunun bir Windows veya Linux sunucusunda da çalışıp çalışmadığı gibi. Bu bizim işimiz değil. Bu nedenle, bu site bize hizmet sağlayan temel mekanizma üzerinde bir soyutlama katmanı tutuyor.

Diğer bazı örnekler:

  • Bir otomobil tüm mekanizmalarını gizler ancak onu sürmek, yakıt ikmali yapmak ve sahibine teslim etmek için bir yol sağlar.

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

  • OOP’daki bir sınıf, özel üyelerini ve kamu üyelerini arama hizmeti veren kamu üyelerinin uygulanmasını gizler.

  • Bir türünden bir nesne kullanırken Interfaceveya abstract classJava veya C ++, gerçek uygulama gizlenir. Ve sadece gizli değil, içinde ilan edilen yöntemlerin Interfaceuygulamalarının çeşitli uygulamalı / kalıtsal sınıflarda da farklı olması muhtemeldir. Ancak aynı hizmeti aldığınız için, sadece zahmet etmeyin How, uygulanır ve hizmeti tam olarak Who/ sunar What.

  • Kimlik Gizleme : Cümle için "Sam'in bilgisayar programları yazabileceğini biliyorum." soyutlama “Sam bir programcı. Programcılar bilgisayar programlarını yazmayı biliyorlar” olabilir. İkinci açıklamada, kişi önemli değildir. Ancak programlama yapma yeteneği önemlidir.


Peki neden sadece "neyin tam olarak belirtilmesi" olarak adlandırılmıyor, btw?
mlvljr

Satori biti için de +1, ayrıca
mlvljr

@mlvljr Bir Howkısmı her zaman Whats'yi anlamakta yardımcı olur . Böylece soyutlama ile karıştırılabilir.
Gulshan

7

Bir programlama soyutlama, bir problemin basitleştirilmiş bir modelidir .

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


Aha! Buradaki basitleştirilmiş model nedir ? Sızdıran bulmacayı hatırla btw? :)
mlvljr

7

Bir soyutlama sadece bir teoremin programlama versiyonudur.

Resmi bir sisteminiz var, o sistem hakkında bir fikir öneriyorsunuz. Bir kanıtı yapıyorsun ve işe yararsa, bir teorem var. Teoreminizin bulunduğunu bilerek, sistem hakkında daha fazla provada kullanabilirsiniz. Sistem tarafından sağlanan ilkeller (ifadeler ve int değer türleri gibi) genellikle aksiyomlar olarak görülür, ancak makine kodunda yazılı olan CPU talimatı olmayan herhangi bir soyutlama olduğu için kesinlikle doğru değildir.

İşlevsel programlamada, bir programın matematiksel bir ifade olarak kullanılması fikri çok güçlüdür ve genellikle tip sistemi (Haskell, F # veya OCAML gibi güçlü, statik olarak yazılmış bir dilde) teoriliği ispatlar aracılığıyla test etmek için kullanılabilir.

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

Şimdi çarpım istediğimizi varsayalım ve ilkellerimiz (kısalık uğruna) 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

Ben çarpımın gerçekleştiğini gösterdiğimi kanıtladığımı iddia edeceğim. Artık sistemimle (programlama dili) daha fazla şey yapmak için çarpımı kullanabilirim.

Ayrıca tip sistemimi de kontrol edebilirim. (*) bir int -> int -> int türüne sahiptir. 2 inç alır ve bir int çıkarır. Ekleme, bir int -> int -> int türüne sahiptir, bu nedenle 0 + (dinlenme), (dinlenme) bir int ile sonuçlandığı sürece tutar. Benim döngüm her türlü şeyi yapıyor olabilirdi, ama sonuçta bunun (x + (x + (x ... + 0))) olduğu gibi bir tür kavrulmuş fonksiyon zinciri çıkardığını söylüyorum. Bu ekleme zincirinin şekli sadece (int -> (int -> (int ... -> int))) yani son çıktımın int olacağını biliyorum. Bu yüzden tip sistemim diğer kanıtlarımın sonuçlarını düzenledi!

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


4

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

Bilgisayar bilimlerinde, soyutlama mekanizması ve uygulaması bir anda birkaç konsepte odaklanabilmesi için ayrıntıları azaltır ve onları etkisizleştirir.


Peki o zaman soyutlanmış bir şeyin örneği ne olabilir?
mlvljr

3
@mlvljr: Eğer wikipedia makalesini okursanız, birkaç tane göreceksiniz.
John Fisher

Ne yazık ki, çok soyut olacağından çok eminim ..
mlvljr

4

Eh, 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. Aynı şey, yazılım geliştirmede etkileşimde bulunduğunuzda da olur. Makine, kayıtların ve hafıza konumlarının üstündeki bir seviyede. Çoğu durumda, daha güçlü düşünceleri daha soyut bir düzeyde düşünebilirsiniz.


IInt add(IInt a, IInt b);Bunu önceden bildiğiniz bir programda kullanmama ve alt yordam kullanmayacak mı , ave az ya da çok iyi bir örnek bdiyelim Int128: IIntmi? - kod parçanız yapmanız gerekenleri yapıyorsa, bilmeniz (kanıtlayabilmeniz) ihtiyacınız olan şeyi yapacağını ve aynı zamanda (ve diğer yandan) tam olarak yaptığınız şeyi yapacağını bilmek hiç bilmeden mi ihtiyacınız var (o şeyi başka bağlamlarda da kullanabilme becerisiyle)?
mlvljr

1
Üzgünüm ama sorunuzu anlayamıyorum.
Kate Gregory,

Diyelim ki 2 ila 3 eklemesi gereken bir program yazıyorsunuzdur. Bunu bir add(int, int)alt yordam / işlev çağırarak yaparsınız . Sadece return 2 + 3;bu durumda olması yeterli olacaktır . Ve neden daha "evrensel" bir rutin kullanmalısınız ( return a + b;yani herhangi bir fiili a ve bverilen parametreleri kullanarak ve dolayısıyla değerlerinden gerçekten soyut olarak) - bu benim (retorik) sorumdu. Umarım şimdi biraz daha netleşmiştir.
mlvljr

İlk yorumum oldukça "kendi kendine
şaşkın

4

Burada iyi cevaplar alıyorsun. Sadece dikkatli olurdum - insanlar soyutlamanın bir şekilde bir kaide üzerine koyulması gereken ve yeterince alamayacağın harika bir şey olduğunu düşünüyor. O değil. Bu sadece sağduyu. Sadece şeyler arasındaki benzerlikleri fark eder, bu yüzden bir dizi soruna bir problem çözümü uygulayabilirsiniz.

Bana bir gözetleme izni ver.

Benim sıkıntı listemin en üstünde, insanlar sanki iyi bir şeymiş gibi "soyutlama katmanlarından" bahsettiler. Sevmedikleri sınıflar veya rutinler etrafında “sarmalayıcılar” yaparlar ve sanki onları daha iyi yapacak gibi “daha ​​soyut” olarak adlandırırlar. "Prenses ve Bezelye" nin masalını hatırlıyor musun? Prenses öylesine hassastır ki yatağının altında bir bezelye olsaydı uyuyamazdı ve daha fazla şilte katmanı yardımcı olmazdı. Daha fazla "soyutlama" katmanı eklemenin yardımcı olacağı fikri de aynen böyle olacak - genellikle değil. Bu, yalnızca temel varlıktaki herhangi bir değişikliğin, birden fazla kod katmanı üzerinden kopyalanması gerektiği anlamına gelir.


Soyutlamayı "açıkça algılanamayacak kadar güzel (ya da daha da çok, kuru (matematiksel) terimlerle tanımlanmış)" olarak düşünmek, (ilk olarak ve en azından) ne olduğunu ve (ikinci olarak) tekniklerini geliştirmeye yardımcı olmaz. uygulama ve (dehşet!) değerlendirmesi [verilen kodun nasıl ve hangi şekilde soyut olduğunu]
mlvljr

3
Bir yerdeki bir değişiklik başka bir yerde birden fazla değişiklik yapmanıza neden oluyorsa, soyutlamalarınız kötüdür. Özünde, ben veya başkasının asla çok fazla soyutlamanın yanına düştüğünü söylemeyeceğim, ama bu deliliğin bir yöntemi var. İyi soyutlamalar, gevşek bir şekilde birleştirilmiş kodun temel taşıdır. Doğru soyutlama göz önüne alındığında, değişiklikler gülünç bir şekilde basit hale gelir. Yani evet, bir kaide üzerine soyutlamalar yapıyorum ve doğru olanı bulmak için çok fazla zaman harcıyorum.
Jason Baker

@Jason Baker Soyutlama tekniklerimizin etkili bir şekilde kullanabilecek kadar beton olmasına izin verin ...
mlvljr

1
@Jason: "Bir yerdeki bir değişiklik başka bir yerde birden fazla değişiklik yapmanız durumunda kalıyorsa, soyutlamalar kötüdür." Orada seninleyim. Kötü olanlar tarafından kuşatılmış gibiyim.
Mike Dunlavey 11

1
Devlerin büyük vizyonlara sahip olduğu bir yerde çalışıyormuşsunuz gibi görünüyor ve ekibi odaklı tutan güçlü bir patron yoktu. Kendimi böyle bir ortamda bulduğumda başka bir iş aramaya başladım (proje bütçeleri her zaman bitti veya yeterince küçük bir şirket => iflas etmiş). Geçenlerde bir tweet gördüm: 'spagetti kodu' vs. 'lazanya kodu', ikincisi çok fazla katman olduğunda.
yzorg

4

Sanırım bir blog yazısını sızdıran soyutlamalar hakkında faydalı bulabilirsin. İşte ilgili arka plan:

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 bu soyut kavramı temsil eden bir yapı ile çalışmasına yardımcı olan bir mekanizmadır. Bu yeni yapı (hemen hemen) her zaman parametreleştirmeler yapar : yapının kullanımını özel gereksinimlerinize uyacak şekilde özelleştirmek için bir araç.

Örneğin, bir Listsınıf, bağlantılı liste uygulamasının ayrıntılarını uzaklaştırabilir - manipülasyon nextve previousişaretçiler açısından düşünmek yerine, bir diziye değer ekleme veya çıkarma düzeyi üzerinde düşünebilirsiniz. Soyutlama, çok daha küçük bir ilkel kavram kümesinden kullanışlı, zengin ve bazen de karmaşık özellikler oluşturmak için gerekli bir araçtır.

Soyutlama, kapsülleme ve modülerlik ile ilgilidir ve bu kavramlar çoğu zaman yanlış anlaşılmaktadır.

Olarak List, örneğin, kapsülleme , bir bağlantılı liste uygulama ayrıntılarını gizlemek için de kullanılabilir; Bir nesne yönelimli dilde, örneğin, sen yapabilir nextve previousyalnızca Liste uygulaması bu alanlara erişimin izin verilecek yerleri, işaretçileri özel.

Kapsülleme soyutlama için yeterli değildir, çünkü zorunlu olarak yapılar hakkında yeni veya farklı bir anlayışa sahip olduğunuz anlamına gelmez. Bir Listsınıfın yaptığı tüm size ' getNext' / ' setNext' tarzı erişimci yöntemleri verdiyse, uygulama ayrıntılarından sizden alınacaktır (örneğin, ' prev' veya ' previous' alanını adlandırdınız mı? Statik türü neydi?), Ancak Çok düşük bir soyutlama derecesi olurdu.

Modülerlik , bilginin gizlenmesi ile ilgilidir : Bir arayüzde kararlı özellikler belirtilmiştir ve bir modül, tüm uygulama detaylarını modül içinde tutan bir arayüze sahiptir. Modülerlik, programcıların değişimle başa çıkmalarına yardımcı olur, çünkü diğer modüller yalnızca kararlı arayüze bağlıdır.

Bilginin gizlenmesi, kapsülleme ile desteklenir (kodunuz kararsız uygulama detaylarına bağlı değildir), ancak kapsülleme modülerlik için gerekli değildir. Örneğin, bir uygulayabilirsiniz List'teşhir, C yapısını next' ve ' prevdünyaya' işaretçiler, aynı zamanda bir arayüz sağlamak içeren initList(), addToList()veremoveFromList()fonksiyonlar. Arabirimin 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 geçerli olacağının garantisini alabilirsiniz. [Parnas’ın modülerlik üzerine klasik makalesi, örneğin montajda bir örnekle yazılmıştır. Arayüz bir sözleşme ve tasarım hakkında bir iletişim şeklidir, bugün buna güvenmemize rağmen, mekanik olarak kontrol edilmesi gerekmez.]

Her ne kadar soyut, modüler ve kapsüllenmiş gibi terimler pozitif tasarım tanımları olarak kullanılsa da, bu özelliklerden herhangi birinin varlığının otomatik olarak iyi bir tasarım vermediğini fark etmek önemlidir:

  • Bir n ^ 3 algoritması "güzel bir şekilde kapsüllenmiş" ise, yine de geliştirilmiş bir n log n algoritmasından daha kötü bir performans gösterecektir.

  • Bir arayüz belirli bir işletim sistemine geçerse, bir video oyununun Windows'tan iPad'e taşınması gerektiğinde modüler tasarımın yararlarından hiçbiri gerçekleştirilmez.

  • Oluşturulan soyutlama çok fazla gereksiz ayrıntı ortaya çıkarırsa, kendi işlemleriyle yeni bir yapı oluşturmak başarısız olur: Aynı şey için başka bir ad olacaktır.


Aslında, gerçekte istediğim şey hakkında görünüyor (modüler == özet == iyi == tahmin edilemez, asla-sadece-mücadeleyi tahmin edemezsiniz). , teşekkürler (hala okuma)
mlvljr

Ve işte yaklaşmakta olan cevabımın kışkırtıcı bir sloganı (kendi soruma göre) "Zihin zayıfladığında
soyutlamalar sızıyor

2

Tamam, sanırım ne sorduğunuzu çözdüm: "Bir Soyutlama" nın matematiksel olarak kesin bir tanımı nedir? "

Eğer öyleyse, bence şansın yaver gitmez - 'soyutlama' bir yazılım mimarisi / tasarım terimidir ve benim bildiğim kadarıyla hiçbir matematiksel desteği yok (belki de teorik CS konusunda daha iyi bilgili biri beni düzeltir) Burada), "birleştirme" veya "bilgi gizleme" den başka herhangi bir şeyin matematiksel tanımları yoktur.


2

Soyutlama, ilgisiz sayılan ayrıntılara aldırış etmemenizdir.

Soyutlama, kapsülleme, bilgi gizleme ve genelleştirmeyi kapsar. Analojileri, metaforları veya sezgisel taramaları kapsamaz.

Soyutlama konsepti için herhangi matematiksel biçimciliği kendisi olacağını olmak mutlaka matematiksel özelliklerinin bir dizi içine çekilen edilecek yatan şey gerektirecek gibi, bir soyutlama! Bir morfizmin kategori teorisi anlayışı muhtemelen aradığınız şeye en yakın olanıdır.

Soyutlama onunla bu bir şeydir, sen beyan şey değildir yapmak .


+1, "Soyutlama yapıyorum!" Bir tişört için güzel olacak;) Morfizm (ler) ile ilgili linkiniz için teşekkür ederiz (her ne kadar doğrudan söz konusu olan Poli'den bahsetmiyor olsa da).
mlvljr

2

Bunu bir başkasına açıklamanın bir yolu olarak, sonuçlardan geriye, tersine giderdim:

Bilgisayar programcılığındaki soyutlama, bir şeyi birden fazla benzer şeyin genellikle aynı şekilde ele alınabileceği ve aynı şekilde ele alınabileceği noktaya genelleştirme eylemidir.

Bu konuda genişlemek istiyorsanız şunları ekleyebilirsiniz:

Bazen bu polimorfik davranışı (arayüzler ve kalıtım) tekrarlayan kodun önünü kesmek için yapılır, diğer zamanlarda bir şeyin içsel çalışmalarının gelecekteki bir tarihte benzer bir çözümle değiştirilmesine gerek kalmadan değiştirilebilmesi için yapılır. soyutlanmış kabın veya ambalajın diğer tarafındaki kod, umarım gelecekte çalışmayı azaltacaktır.

Bunun ötesinde, bence örneklerle başlamalısın ...


1

Bob Martin'in bazı metriklerini incelemek isteyebilirsiniz.

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

Bu, onun “Soyutlığının” seninkiyle aynı olduğunu sanmadığını söyledi. Daha çok arayüzleri / soyut sınıfları kullanmak anlamına gelen “bir sınıfta uygulama eksikliği” nin bir ölçüsüdür. Kararsızlık ve Ana Dizilimden Uzaklık muhtemelen aradığınızı daha fazla oynar.


Evet, o kağıdı hatırla. Bob Amca, kalabalığa enerji vermek ve insanları OO mekaniğiyle ilgilenmek konusunda zekice davranıyor.
mlvljr

Garip bir şekilde, bir kerede aşırıya kaçmayı unuttum :)
mlvljr

1

Merriam-webster soyut bir sıfat olarak tanımlar: herhangi bir özel durumdan ayrılmadan.

Soyutlama, bazı sistemlerin bir modelidir. Çoğunlukla, gerçek bir sistemin soyutlama ile modellenebilmesi için karşılanması gereken bir grup varsayımı listeler ve sıklıkla giderek karmaşıklaşan sistemleri kavramsallaştırmamıza izin vermek için kullanılırlar. Gerçek bir sistemden bir soyutlamaya geçmek, bunun için resmi bir matematiksel metoda sahip değildir. Bu, soyutlamayı kimin tanımladığına ve soyutlamanın amacının ne olduğuna karar verir.

Çoğunlukla olsa da, soyutlamalar matematiksel yapılar olarak tanımlanır. Muhtemelen fen ve mühendislikte çok sık kullanıldığı için bu muhtemelen.

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

Bir başka soyut model, tipik lineer devre elemanları, dirençler, kapasitörler ve indüktörlerdir. Yine etkileşimler açıkça matematiksel formüllerle tanımlanmaktadır. Düşük frekanslı devreler veya basit röle sürücüleri ve diğer şeyler için, RLC analizi iyi sonuç verir ve çok iyi sonuçlar verir. Ancak, mikrodalga radyo devreleri gibi diğer durumlar da elemanlar çok büyük ve etkileşimler daha ince ve basit RLC soyutlamaları durmuyor. Bu noktada ne yapılacağı mühendisin kararına kalmış. Bazı mühendisler diğerlerinin üzerine başka bir soyutlama daha yarattı, bazıları ideal op-amp'leri nasıl çalıştıkları için yeni matematiksel formüllerle değiştirdiler, bazıları ise ideal op-amp'leri yerine daha küçük karmaşık bir ağla simüle edilmiş simulasyonlu gerçek op-amp'lerle değiştirdiler. ideal elemanlar

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


Muhtemelen bunu daha iyi vurgulamalıydım, ancak gerçek dünya prototiplerinin gereksiz ayrıntılarını içermeyen soyutlamalar ile ilgilenmiyorum ama bu nedenle yukarıda belirtilen gerçek dünya objeleriyle başa çıkması gereken sistemlerin tasarımında bazı yararlı ipuçları verdim. (örneğin, bir iş başvurusunda muhtemelen yararlı olabilecek bazı gerçek dünya Çalışanlarının özelliklerine sahip bir Çalışan sınıfı oluşturmak). İlgilendiğim, bir yazılım varlığını, onunla ilgilenen diğer varlıklardan "duvarlayan" soyutlama türüdür (örneğin, Employervarsayımlar üzerinde olacaktır Employee).
mlvljr

1
Mantıklı değilsin. Gerçek bir sistem tasarlama konusunda ipucu vermek bir soyutlama amacı değildir. Neyin modellendiğiyle ilgili hiçbir şey bilmiyorsanız, bu bir soyutlamanın çözmesi için bir sorun değildir.
whatsisname

Yazılımın yaratılması sürecinde, yazılımın ilgileneceği gerçek dünya nesnelerinin ayrıntılarını soyutlamaktan bahsediyordum. Gerçek dünyadaki bir şeyin (yazılım) soyutlamasını kullanarak, gerçek dünyadaki şeyin kastedilmediğini (yeniden) tasarlamak (“sistem” olarak “sistem sistemleri” değil, dolayısıyla sistemlerin tasarımı hakkında bazı yararlı ipuçları verilmiştir). yukarıdaki yorumum).
mlvljr

1

Bir soyutlama, başka bir şey açısından bir şeyi (örneğin bir konsept, bir veri yapısı, bir işlev) temsil eder. Örneğin, iletişim kurmak için kelimeler kullanıyoruz. Kelime, sesler (konuşma) veya grafiksel semboller (yazı) ile temsil edilebilecek soyut bir varlıktır. Bir soyutlamanın ana fikri, söz konusu varlığın, temsili göstermeden farklı olması, tıpkı bir kelimenin, onu ifade etmek için kullanılan sesler veya yazmak için kullanılan harfler olmadığı şeklindedir.

Bu nedenle, en azından teoride, bir soyutlamanın temel temsili, farklı bir temsil ile değiştirilebilir. Bununla birlikte, pratikte, soyutlama nadiren altta yatan gösterimden tamamen farklıdır ve bazen de temsil “içinden sızıntı yapar ”. Örneğin, konuşma yazılı olarak iletilmesi çok zor olan duygusal tonları taşır. Bu nedenle, bir ses kaydı ve aynı kelimelerin bir kopyası, izleyici üzerinde çok farklı etkiye sahip olabilir. Başka bir deyişle, kelimelerin soyutlanması çoğu zaman sızıntı yapar.

Soyutlamalar tipik olarak katmanlar halinde gelir. Kelimeler, kendileri ses sesleri soyutlamaları olan ve sırasıyla ses telleri tarafından oluşturulan ve birinin kulak davulları tarafından tespit edilen hava parçacıklarının hareket düzenini soyutlayan harfler ile temsil edilebilen soyutlamalardır. .

Bilgisayar bilimlerinde bitler tipik olarak en düşük temsil seviyesidir. Baytlar, hafıza konumları, montaj talimatları ve CPU kayıtları bir sonraki soyutlama seviyesidir. Daha sonra, baytlar, bellek konumları ve montaj talimatları açısından uygulanan, ilkel veri türlerine ve daha üst seviye bir dilin talimatlarına sahibiz. Daha sonra, ilkel veri tipleri açısından uygulanan ve dil talimatlarında yerleşik olan fonksiyonlar ve sınıflar (bir OO dili varsayarsak). Sonra daha basit olanları açısından daha karmaşık fonksiyonlar ve sınıflar uygulanır. Bu işlevlerin ve sınıfların bazıları, listeler, yığınlar, sıralar, vb. Gibi veri yapılarını uygular. Bunlar sırayla işlem sırası veya çalışanların bir listesi veya kitap başlıklarının karma tablosu gibi daha spesifik varlıkları temsil etmek için kullanılır. .


1
Sızdıran varsa, o zaman kesinlikle bir soyutlama değil ... yeterince, dürüst olalım.
mlvljr

2
@mlvljr Bilgisayar matematik problemi değildir, ne yazık ki, bu nedenle bir miktar sızıntıya izin vermelisiniz. Başka bir şey olmazsa, hesaplamaların fiziksel bir cihazda yapılması gerçeği, modellenebilecek sorunların kapsamına yönelik belirli kısıtlamaları gerektirir. Teknik olarak, eksiklik teoremleri matematiksel sistemler hakkında içsel olarak kanıtlanamayan bazı şeyleri ima eder, bu yüzden matematik bile "sızan soyutlamalar" yapar.
CodexArcanum

2
Her zaman bir soyutlamanın sızacağı bir durum bulabilirsiniz. Mükemmel bir soyutlama diye bir şey yoktur. Bu sadece ne kadar sızdığı ve bununla yaşayabileceğin bir meseledir.
Dima

@CodexArcanum 1. int(MAX_INT_SIZE / 2-1) 'den daha az alan ve iki kat daha fazla olan bir tane döndüren bir rutin : int f(int a) { return a*2; }2. void (*) (void)ne zaman aranacak ... Arayanın sözleşmesi - her ikisi de soyutlamaları temsil eder (1 - uygulamasının ayrıntılarını (biz sağladık, ancak kaynak koduna erişimi olmayanlar için erişilebilir olmayacak)), 2- - tam olarak ne işleyicinin yapar (not edin, ancak bunun işleyiciyi atayan kişi tarafından biliniyordur)) ve sızdırma
21.01.2010

MAX_INT_SIZE üzerindeki sınırlama, metodunuzun imzasında hiçbir yerde açıklığa kavuşturulmamıştır. Sözleşme tabanlı programlamaya izin veren bir dil kullanmadığınız sürece (Eiffel gibi), bir sızıntıdır. Belgelerde sistemin dışında olduğu için belgelerde belirtilen kısıtlamalar sayılmamaktadır. Peki ya bir operasyonun ortasında güç kesilirse? Bir ağ üzerinden veri iletmek zorundaysanız ve gecikme varsa ne olur? Hiçbir programlama paradigması, sistem donanımının fizikselliğini soyutlayamaz.
CodexArcanum

1

Bunu insanlara anlatmaya çalışmamın bir yolu, en iyi yol olmayabilir

2 + 2 ekleyen ve 4 çıktı veren 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?


Bu neredeyse Kate Gregory'nin cevabına yaptığı yorumun nesiydi. ;) İlginç olan şey, daha az genel program daha genel olanı kullanabilmekle birlikte, ilkini ikincisiyle talep eden bir kullanıcı sağlamak muhtemelen yararlı olabilir ...
mlvljr

1

Bir soyutlamanın gereksiz detayları gizleyen bir şey olduğunu savunuyorum. En temel soyutlama birimlerinden biri prosedürdür. Örneğin, bu verileri bir dosyadan okurken veriyi veritabanına nasıl kaydettiğim konusunda endişelenmek istemiyorum. Böylece bir save_to_database işlevi oluşturdum.

Soyutlamalar ayrıca daha büyük soyutlamalar oluşturmak için bir araya getirilebilir. Ö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.


Kod çağrısı save_to_database, ihtiyaç duyduğunuz uygulamayı seçtiğiniz sürece / verilerin tam olarak nasıl kaydedildiği konusunda endişelenmemelidir !
Başka bir deyişle

1

Programlamadaki soyutlamayı her zaman ayrıntıları gizleme ve basitleştirilmiş bir arayüz sunma olarak düşünüyorum. Programcıların anıtsal görevleri yönetilebilir parçalara bölmesinin ana nedeni budur. Soyutlama ile, tüm detaylar da dahil olmak üzere problemin bir kısmına yönelik çözüm oluşturabilir ve sonra çözümü kullanmak için basit bir arayüz sağlayabilirsiniz. Ardından, detayları hakkında "unutabilirsiniz". Bu önemlidir, çünkü bir süper kompleks sistemin tüm ayrıntılarını bir anda akıllarında tutamaz. Bu, soyutlamanın altındaki ayrıntıların hiçbir zaman tekrar gözden geçirilmesi gerekmeyeceği anlamına gelmez, ancak şimdilik sadece arayüz hatırlanmalıdır.

Programlamada, bu basitleştirilmiş arabirim bir değişkenden (bir grup bit soyutlar ve daha basit bir matematiksel arabirim sağlar) bir işleve (herhangi bir işlem miktarını tek bir hat çağrısında soyutlar) bir sınıfa ve ötesine kadar herhangi bir şey olabilir.

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

Soyutlamanın avantajlarından bazıları şunlardır:

  • Büyük bir sorunun yönetilebilir parçalara bölünmesine izin verir. Bir kişinin kayıtlarını veritabanına eklerken, veritabanına dizin ağaçları ekleyip dengelemek zorunda kalmak istemezsiniz. Bu iş bir noktada yapılmış olabilir, ama şimdi soyutlanmış ve artık endişelenmenize gerek yok.

  • Bir projede birden fazla kişinin birlikte çalışmasına izin verir. Meslektaşımın kurallarının tüm içindekileri bilmek istemem. Sadece onu nasıl kullanacağımı, ne yaptığını ve çalışmamla (arabirim) nasıl bir araya getireceğini bilmek istiyorum.

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

Bununla birlikte, soyutlama, eğer aşırı kullanılmışsa işleri daha az yönetilebilir kılmanın ters etkiye sahip olabilir. Bir problemi çok küçük parçalara bölerek hatırlamanız gereken arayüzlerin sayısı artar ve gerçekte neler olup bittiğini anlamak zorlaşır. Çoğu şey gibi, bir denge bulunmalıdır.


1

Ekstra bir dolaylı seviye.

Kullanmakta olduğunuz nesnenin a Catveya a olup olmadığına dikkat etmek istemezsiniz Dog, bu nedenle doğru makeNoise()işlevi bulmak için sanal bir işlev tablosundan geçersiniz.

Belirli bir işlemci veya Haskell kullanım hakkı talimat ararken bir derleyici düşünüyorum - Emin bu 'düşük' ve sıra 'yüksek' seviyeleri uygulanan olabilir değilim Monadler her şeyi arayarak üzerinde hesaplama etkilerini abstracting returnve >>=.


1

Bu aslında daha uzun bir süredir bloglamak istediğim bir şeydi, ama hiç anlamadım. Neyse ki, ben bir rep zombi ve bir ödül bile var. Gönderim oldukça uzadı , ama işte özü:

Programlamadaki soyutlama, bir nesnenin özünü verilen bir bağlamda anlamakla ilgilidir.

[...]

Soyutlama sadece genelleme ile değil aynı zamanda enkapsülasyonla da karıştırılmaz, bunlar bilgi gizlemesinin iki ortogonal kısmıdır: Servis modülü neyi göstermeye istekli olduğuna karar verir ve müşteri modülü neyi görmeye istekli olduğuna karar verir. Kapsülleme ilk kısımdır ve ikincisini soyutlar. Sadece ikisi birlikte, tam bilgi gizlenmesini oluşturur.

Umarım yardımcı olur.


+1, Evet, konu gerçekten çoğumuzdan övünüyor gibi görünüyor;) Umarım (nihayet) cevabınızı tartışmaya daha fazla ilgi uyandırmak için kendi puanlarımla tamamlarım.
mlvljr

0

İşte, matematiksel olmayan bir cevap:

Programlamada soyutlamak , artık ayrıntıları umursamıyormuş gibi davranıyor, oysa gerçekte her zaman umursuyor olmalısınız. Temel olarak numara yapıyor.


1
+1, Her zaman sanmıyorum (gerçekten gereksiz detayları düşünün :)). İlk soru şudur: "Ayrıntıları sonsuza dek silmek, geçici olarak unutmak veya hatta bunu bilmeden bir şekilde kullanmak mı?"
mlvljr

1
Bugün müşterilerime kaç foton müşterimi vurduğu umurumda değil.
flamingpenguin

0

Benim için soyutlama “kelimenin tam anlamıyla” varolmayan bir şey, bir fikir gibi bir şey. Bunu matematiksel olarak ifade ederseniz, artık soyut değildir, çünkü matematik beyninizde olanları ifade etmek için bir dildir, bu nedenle başkalarının beyni tarafından anlaşılabilir, bu nedenle fikirlerinizi yapılandıramazsınız, çünkü yaparsanız, bu bir fikir değildir. artık: bir beynin bir fikir modelini ifade etmek için nasıl çalıştığını anlamanız gerekir.

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

Soyutlamanın en zor yanı, başkalarının anlayabilmesi için gerçeğe dönüşebilmesi için onu ifade etmenin bir yolunu bulmaktır. Bu en zor iş ve gerçekten tek başına yapılamaz: fikirleriniz üzerinde çalışan ve başkaları tarafından anlaşılan göreceli bir model icat etmeniz gerekiyor.

Bana göre bilgisayar dilinde soyutlama, modeli “matematikselleştirme” olarak adlandırmalı, iletişim kurulabilecek fikirleri yeniden kullanmakla ilgili olmalı ve soyut olarak elde edilebilecek olanlara kıyasla çok büyük bir kısıtlama.

Basitçe söylemek gerekirse, atomlar yan yana, ama umrunda değil. Bir insana düzenlenmiş büyük bir molekül kümesi, onun birisinin yanında olduğunu anlayabilir, ancak atomların kendilerini bir düzende nasıl konumlandırdıklarını anlayamaz.

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

Madalyamı şimdi alabilir miyim?


0

İlginç soru. Programlama konusunda yetkili olduğu düşünülen tek bir soyutlama tanımı bilmiyorum. Diğer insanlar CS teorisi ya da matematiğin çeşitli dallarından bazı tanımlara bağlantılar sağlamış olsalar da; Bunu "gözetim" e benzer bir şekilde düşünmeyi seviyorum, bkz. Http://en.wikipedia.org/wiki/Supervenience

Programlamada soyutlamadan bahsettiğimizde, aslında sistemin iki tanımını karşılaştırıyoruz. Kodunuz bir programın açıklamasıdır. Kodunuzun bir soyutlaması da bu programın bir açıklaması olabilir ancak "daha yüksek" bir seviyededir. Elbette, orijinal soyutlamanızdan daha yüksek düzeyde bir soyutlamaya sahip olabilirsiniz (örneğin, programın ayrıntılı tasarımındaki açıklamasına karşı yüksek seviye sistem mimarisindeki programın tanımı).

Şimdi bir tanımlamayı diğerinden daha yüksek seviyeye çıkaran şey nedir. Anahtar “çoklu gerçekleştirilebilirlik” tir - programa ilişkin soyutlamanız birçok dilde birçok şekilde gerçekleştirilebilir. Artık tek bir program için birden fazla tasarım üretebileceğini söyleyebilirsiniz - iki kişi de programı doğru bir şekilde tanımlayan iki farklı yüksek seviye tasarım üretebilir. Gerçekleşmelerin denkliği fark yaratıyor.

Programları veya tasarımları karşılaştırırken, tanımlamanın temel özelliklerini tanımlayabilmenizi sağlayacak ş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 budur - tek bir ikili program her iki tanımlamanın sınırlarını da karşılayabilir mi?

Peki, bir tanım düzeyini diğerinden daha yüksek yapan nedir? Diyelim ki bir seviye A açıklamasına (örneğin tasarım belgeleri) ve başka B tanımına (örneğin kaynak kodu) sahip olduğumuzu varsayalım. A1 ve A2 A seviyesinde iki eşit olmayan açıklamaları, bu açıklamaları sonra gerçekleşmeleri, B1 ve B2 ise, çünkü B daha yüksek seviyede olan gerekir da Ancak seviyesi B'deki olmayan eşdeğer olduğu, tersi her geçerli değildir .

Bu nedenle, 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 kodun farklı olması gerekir. Ancak diğer taraftan, aynı ikili programda derlenemeyen iki kaynak kod kümesini alırsam, bu iki kaynak kod kümesini derlemeden kaynaklanan ikili dosyaların her ikisinin de aynı tasarımı sağlaması durumunda olabilir. belgesi. Bu nedenle tasarım dokümanı kaynak kodunun bir "soyutlaması" dır.


0

Programlama soyutlamaları, bir programatik eleman üzerinde biri tarafından yapılan soyutlamalardır. Diyelim ki öğeleri ve diğer şeyleriyle birlikte bir Menü yapmayı biliyorsunuzdur. Sonra birisi bu kod parçasını ve düşünceyi gördü, hey diğer hireachy benzeri yapılarda faydalı olabilirdi ve Bileşen Tasarım Desenini ilk kod parçasının bir özeti olarak tanımladı.

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

Yani, özetlemek gerekirse, soyutlamayı programlamak bir problemi anlamamızı sağlayan bir yaklaşımdır, bir şeyi elde etmenin aracıdır, ama gerçek olanı değil

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.