it-swarm-eu.dev

Co je to abstrakce?

Existuje obecně dohodnutá definice toho, co je programová abstrakce, jak ji používají programátoři? [Všimněte si, že programová abstrakce není zaměňována s definicemi slovníku pro slovo „abstrakce“.] Existuje jednoznačná nebo dokonce matematická definice? Jaké jsou jasné příklady abstrakcí?

38
mlvljr

Odpověď na "Můžete definovat, co je programová abstrakce více či méně matematicky?" není." Abstrakce není matematický koncept. Bylo by to jako požádat někoho, aby matematicky vysvětlil barvu citronu.

Pokud však chcete dobrou definici: abstrakce je proces přechodu od konkrétního nápadu k obecnějšímu. Podívejte se například na svou myš. Je to bezdrátové? Jaký druh senzoru má? Kolik tlačítek? Je to ergonomické? Jak velké to je? Odpovědi na všechny tyto otázky mohou přesně popisovat vaši myš, ale bez ohledu na to, jaké jsou odpovědi, je to stále myš, protože je to polohovací zařízení s tlačítky. To je vše, co potřebujete, abyste byli myší. „Silver Logitech MX518“ je konkrétní, konkrétní položka a „myš“ je jeho abstrakcí. Důležité je přemýšlet o tom, že neexistuje žádný takový konkrétní objekt jako „myš“, je to jen nápad. Myš na vašem stole je vždy něco konkrétnějšího - je to Apple Magic Mouse nebo optická myš Dell nebo Microsoft IntelliMouse - „myš“ je jen abstraktní pojem.

Abstrakce může být vrstvena a stejně jemná nebo hrubozrnná, jak chcete (MX518 je myš, což je polohovací objekt, což je počítačové periferie, což je objekt napájený elektřinou), může jít tak daleko, jak chcete , a prakticky v jakémkoli směru (moje myš má drát, což znamená, že bych jej mohl klasifikovat jako objekty s drátem. Je také plochý na dně, takže bych jej mohl klasifikovat jako druh objektů, které se nevaří, když umístěné svisle na nakloněné rovině).

Objektově orientované programování je založeno na konceptu abstrakcí a jejich rodinách nebo skupinách. Dobrý OOP znamená výběr správných abstrakcí na odpovídající úrovni podrobností, které mají smysl v doméně vašeho programu a ne „úniku“. První znamená, že klasifikace myši jako objektu, který zvítězil 't roll on nakloněné rovině nedává smysl pro aplikaci, která inventarizuje počítačové vybavení, ale může to mít smysl pro simulátor fyziky. Ten druhý znamená, že byste se měli pokusit vyhnout se "boxování sami sebe" hierarchii, která nemá " Nemám smysl pro nějaký druh objektů. Například v mé hierarchii výše jsme si jisti, že jsou všechny počítačové periferie napájeny elektřinou? stylus? Pokud chceme zařadit stylus do kategorie „periferní“, měli bychom problém, protože nevyužívá elektřinu, a definovali jsme počítačové periferie jako objekty, které používají elektřinu. kruhová elipsa) problem je nejznámějším příkladem tohoto hádanky.

46
nlawalker

S většinou odpovědí kategoricky nesouhlasím.

Toto je moje odpověď:

Vzhledem ke dvěma sadám G a H lze mezi nimi definovat Galoisovo spojení (alfa, beta) a jednu lze považovat za konkretizaci druhé; obrátit spojení, a jeden je abstrakce druhého. Funkce jsou konkretizační a abstrakční funkce.

To je z teorie abstraktní interpretace počítačových programů, což je obvykle přístup statické analýzy k dnešnímu dni.

25
Paul Nathan

Abstrakce se více zaměřuje na What a méně na How. Nebo můžete říci, znát pouze to, co potřebujete, a věřit poskytovateli všech ostatních služeb. Někdy dokonce skryje identitu poskytovatele služeb.

Tento web například poskytuje systém pro kladení otázek a odpovídání na ně. Téměř všichni zde vědí, jaké jsou postupy pro kladení dotazů, odpovídání na ně, hlasování a další věci na tomto webu. Jen velmi málo ví, jaké jsou základní technologie. Stejně jako to, zda stránky byly vyvinuty s ASP.net mvc nebo Python, ať už to běží na Windows nebo Linux serveru atd. Protože to není nic z našeho podnikání. Tento web tedy udržuje abstrakční vrstvu nad jejím základním mechanismem, který nám poskytuje službu.

Některé další příklady:

  • Auto skrývá všechny své mechanismy, ale poskytuje způsob, jak řídit, doplňovat palivo a udržovat ho u svého majitele.

  • Jakékoli API skrývá všechny své implementační podrobnosti a poskytuje službu dalším programátorům.

  • Třída v OOP) skryje své soukromé členy a implementaci veřejných členů poskytujících službu, aby mohli zavolat veřejným členům.

  • Při použití objektu typu Interface nebo abstract class in Java nebo C++, skutečná implementace je skrytá. A nejen skryté, implementace metod deklarovaných v Interface se také pravděpodobně budou v různých implementovaných lišit/zděděné třídy. Ale jakmile získáváte stejnou službu, prostě se neobtěžujte How je implementována a přesně Who/What tuto službu poskytuje.

  • Skrývání identity: Pro větu „Vím, že Sam umí psát počítačové programy.“ abstrakce může být - „Sam je programátor. Programátoři vědí, jak psát počítačové programy.“ Ve druhém prohlášení není tato osoba důležitá. Ale jeho schopnost provádět programování je důležitá.

13
Gulshan

Programová abstrakce je zjednodušený model problému.

Například připojení TCP/IP je abstrakce při odesílání dat. Zadáte pouze adresu IP a číslo portu a odešlete ji do rozhraní API. Nezajímají vás všechny podrobnosti o vodičích, signálech, formátech zpráv a poruchách.

7
C. Ross

Abstrakce je jen programovací verze věty.

Máte formální systém, navrhujete přemýšlení o tomto systému. Dokážete o tom, a pokud to vyjde, pak máte teorém. S vědomím, že vaše věta platí, můžete ji použít v dalších důkazech o systému. Primitivy poskytované systémem (jako například příkazy a typy hodnot int) by se obvykle považovaly za axiomy, i když to není striktně pravda, protože cokoli, co není instrukcemi CPU napsanými ve strojovém kódu, je druh abstrakce.

Ve funkčním programování je myšlenka programu jako matematického prohlášení velmi silná a často lze typový systém (v silném staticky psaném jazyce jako Haskell, F # nebo OCAML) použít k testování věty pomocí důkazů.

Například: řekněme, že máme kontrolu sčítání a rovnosti jako primitivních operací a celá čísla a booleovci jako primitivní datové typy. To jsou naše axiomy. Můžeme tedy říci, že 1 + 3 == 2 + 2 je věta, pak použijte pravidla sčítání a celá čísla a rovnost, abyste zjistili, zda se jedná o pravdivé tvrzení.

Předpokládejme nyní, že chceme multiplikaci, a naši primitivové (pro stručnost) zahrnují smyčkový konstrukt a prostředky pro přiřazení symbolických odkazů. Mohli bychom to navrhnout

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

Budu předstírat, že jsem to dokázal, a prokázat, že násobení platí. Nyní mohu použít násobení k tomu, abych mohl dělat více věcí se svým systémem (programovací jazyk).

Mohu také zkontrolovat svůj typový systém. (*) má typ int -> int -> int. Zabere to 2 palce a vydá int. Sčítání má typ int -> int -> int, takže 0 + (zbytek) platí, pokud (zbytek) vede k int. Moje smyčka by mohla dělat všechny druhy věcí, ale říkám, že vydává řetězec curried funkcí tak, že (x + (x + (x ... + 0))) je výsledek. Forma tohoto adičního řetězce je pouze (int -> (int -> (int ... -> int))), takže vím, že můj konečný výstup bude int. Takže můj typový systém vydržel výsledky mého dalšího důkazu!

Složte tento druh myšlenky po mnoho let, mnoho programátorů a mnoho řádků kódu, a máte moderní programovací jazyky: vydatnou sadu primitivů a obrovské knihovny „ověřených“ kódových abstrakcí.

7
CodexArcanum

Tady máš dobré odpovědi. Chtěl bych jen opatrně - lidé si myslí, že abstrakce je nějak úžasná věc, kterou je třeba dát na podstavec a na kterou se nemůžete dostat dost. Není. Je to jen zdravý rozum. Je to jen rozpoznávání podobností mezi věcmi, takže můžete použít řešení problému na řadu problémů.

Dovolte mi kuklu ...

Vysoko na mém seznamu nepříjemností je, když lidé mluví o „vrstvách abstrakce“, jako by to byla dobrá věc. Vytvářejí „obálky“ kolem tříd nebo rutin, které se jim nelíbí, a nazývají je „abstraktnějšími“, jako by je zlepšily. Vzpomínáte si na bajku „princezny a hrášku“? Princezna byla tak delikátní, že kdyby byla pod matrací hrášek, nemohla by spát a přidání dalších vrstev matrací by nepomohlo. Myšlenka, že přidání více vrstev „abstrakce“ pomůže, je právě taková - obvykle to tak není. Znamená to pouze, že jakákoli změna základní entity musí být zvlněna několika vrstvami kódu.

4
Mike Dunlavey

Myslím, že byste mohli najít můj blogový příspěvek o netěsných abstrakcích užitečných. Zde je relevantní pozadí:

Abstrakce je mechanismus, který pomáhá brát to, co je běžné u sady souvisejících fragmentů programu, odstranit jejich rozdíly a umožnit programátorům pracovat přímo s konstruktem představujícím ten abstraktní koncept. Tento nový konstrukt (prakticky) má vždy parametrizace : prostředek k přizpůsobení použití konstruktu tak, aby vyhovoval vašim konkrétním potřebám.

Třída List může například abstraktně oddělit podrobnosti implementace propojeného seznamu - kde místo přemýšlení o manipulaci s ukazateli next a previous si můžete myslet na úrovni přidávání nebo odebírání hodnot do sekvence. Abstrakce je nezbytným nástrojem pro vytváření užitečných, bohatých a někdy složitých funkcí z mnohem menší sady primitivnějších konceptů.

Abstrakce souvisí se zapouzdřením a modularitou a tyto pojmy jsou často nepochopeny.

V příkladu List lze použít zapouzdření ke skrytí implementačních podrobností propojeného seznamu; v objektově orientovaném jazyce můžete například nastavit ukazatele next a previous na soukromé, kde pouze implementaci seznamu je povolen přístup k těmto polím.

Zapouzdření nestačí pro abstrakci, protože to nutně neznamená, že máte novou nebo jinou koncepci konstruktů. Pokud vám všechny třídy List daly přístupové metody typu 'getNext'/'setNext', zapouzdřilo by vás od implementačních podrobností (např. Pojmenovali jste pole 'prev' nebo 'previous'? jaký byl jeho statický typ?), ale mělo by velmi nízký stupeň abstrakce.

Modularita se týká skrytí informací : Stabilní vlastnosti jsou specifikovány v rozhraní a modul implementuje toto rozhraní, přičemž v modulu zachovává všechny podrobnosti implementace. Modularita pomáhá programátorům vyrovnat se se změnami, protože ostatní moduly závisí pouze na stabilním rozhraní.

Skrytí informací je podporováno zapouzdřením (takže váš kód nezávisí na nestabilních podrobnostech implementace), ale zapouzdření není nutné pro modularitu. Například můžete implementovat strukturu List v C a vystavit odkazy 'next' a 'prev' světu, ale také poskytnout rozhraní obsahující initList(), addToList() a removeFromList() function. Za předpokladu, že jsou dodržována pravidla rozhraní, můžete zaručit, že určité vlastnosti vždy zůstanou, například zajistí, že struktura dat bude vždy v platném stavu. [Parnasův klasický článek o modularitě byl například napsán s ukázkou v Shromáždění. Rozhraní je smlouva a forma komunikace o návrhu, nemusí se nutně mechanicky kontrolovat, i když na to dnes spoléháme.]

Přestože pojmy jako abstraktní, modulární a zapouzdřené se používají jako pozitivní popisy designu, je důležité si uvědomit, že přítomnost kterékoli z těchto vlastností vám automaticky nedává dobrý design:

  • Pokud je algoritmus n ^ 3 „pěkně zapouzdřený“, bude stále fungovat horší než vylepšený algoritmus n log n.

  • Pokud se rozhraní zavazuje ke konkrétnímu operačnímu systému, nebude realizována žádná výhoda modulárního designu, když je třeba například přenést videohru ze systému Windows do iPadu.

  • Pokud vytvořená abstrakce odhalí příliš mnoho nepodstatných detailů, nepodaří se jí vytvořit nový konstrukt s vlastními operacemi: Bude to prostě jiné jméno pro stejnou věc.

4
Macneil

Byla by odpověď Wikipedie dost dobrá? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

Ve vědě o počítačích, mechanismus a praxe abstrakce redukuje a faktoruje detaily tak to jeden může soustředit se na nemnoho pojetí najednou.

4
John Fisher

Matematicky je „celé číslo“ abstrakce. A když uděláte formální důkazy jako je x + y = y + x pro všechna celá čísla, pracujete spíše s abstrakcí „integer“ než s konkrétními čísly, jako jsou 3 nebo 4. To samé se stane ve vývoji softwaru, když komunikujete s stroj na úrovni nad registry a umístění paměti. Ve většině případů můžete myslet silnější myšlenky na abstraktnější úrovni.

4
Kate Gregory

Jako způsob, jak to vysvětlit jiné osobě, bych šel opačně, z výsledků zpět:

Abstrakce v počítačovém programování je věc zobecnění něco do té míry, že více než jedna podobná věc může být obecně považována za stejnou a je s ní nakládáno stejně.

Pokud se chcete rozbalit, můžete přidat:

Někdy se to dělá pro dosažení polymorfního chování (rozhraní a dědičnost), aby se omezilo opakování kódu dopředu, jindy se to dělá tak, že vnitřní fungování něčeho by mohlo být v budoucnu nahrazeno podobným řešením, aniž by bylo nutné měnit kód na druhé straně odebraného kontejneru nebo obalu, doufejme, že v budoucnu omezíme přepracování.

Kromě toho si myslím, že musíte začít příklady ...

2
Bill

Abstrakce je, když ignorujete podrobnosti považované za irelevantní ve prospěch těch, které jsou považovány za relevantní.

Abstrakce zahrnuje zapouzdření, skrytí informací a zobecnění. Nezahrnuje analogie, metafory nebo heuristiku.

Jakýkoli matematický formalismus pro pojem abstrakce by sám o sobě být abstrakce, protože by to nutně vyžadovalo, aby byla základní věc abstrakce do souboru matematických vlastností! Pojem teorie kategorie morfismus je pravděpodobně nejblíže tomu, co hledáte.

Abstrakce není něco, co deklarujete, je to něco, co děláte .

2
Steven A. Lowe

Dobře, myslím, že jsem přišel na to, co se ptáte: „Co je to matematicky přísná definice„ Abstrakce “.“ “

Pokud tomu tak je, myslím si, že máte smůlu - „abstrakce“ je softwarová architektura/designový termín a nemá žádné matematické podložení, pokud je mi známo (možná mě opraví někdo, kdo má lepší znalosti v teoretické CS) zde), více než „vazba“ nebo „skrývání informací“ má matematické definice.

2
Fishtoaster

Vždycky uvažuji o abstrakci v programování jako o skrytých detailech a poskytnutí zjednodušeného rozhraní. To je hlavní důvod, proč programátoři mohou rozdělit monumentální úkoly na zvládnutelné kousky. S abstrakcí můžete vytvořit řešení části problému, včetně všech podrobných podrobností, a pak poskytnout jednoduché rozhraní pro použití řešení. Pak můžete ve skutečnosti „zapomenout“ na podrobnosti. To je důležité, protože neexistuje způsob, jak by si člověk mohl udržet všechny detaily super komplexního systému ve svých myslích najednou. Tím nechceme říci, že podrobnosti pod abstrakcí nebudou nikdy muset být revidovány, ale prozatím si musíme pamatovat pouze rozhraní.

Při programování může být toto zjednodušené rozhraní cokoli od proměnné (abstrakta pryč skupina bitů a poskytuje jednodušší matematické rozhraní) až po funkci (abstrakuje pryč jakékoli množství zpracování do jediného linky) do třídy a dále.

Nakonec, hlavní úlohou programátorů je obvykle odtrhnout všechny výpočetní údaje a poskytnout jednoduché rozhraní, jako je GUI, které může využít někdo, kdo neví jednu věc o tom, jak počítače pracují.

Mezi výhody abstrakce patří:

  • Umožňuje rozdělit velký problém na zvládnutelné kousky. Když přidáváte záznamy osoby do databáze, nemusíte se bavit vkládáním a vyvažováním indexových stromů do databáze. Tato práce mohla být někdy provedena, ale nyní byla odvedena pryč a už si s tím nemusíte dělat starosti.

  • Umožňuje více lidem dobře spolupracovat na projektu. Nechci, abych věděl všechny příznaky a kódy mého kolegy. Chci jen vědět, jak je používat, co dělá a jak to zapadat do mé práce (rozhraní).

  • Umožňuje lidem, kteří nemají potřebné znalosti, provést složitý úkol. Moje máma může aktualizovat svůj facebook a lidé, které zná po celé zemi, to mohou vidět. Bez abstrakce šíleně složitého systému na jednoduché webové rozhraní neexistuje způsob, jak by mohla začít dělat něco podobného (ani na to nezáleží).

Abstrakce však může mít opačný účinek, aby věci byly méně zvládnutelné, pokud je nadužíváno. Rozdělením problému na příliš mnoho malých kousků se zvyšuje počet rozhraní, která musíte zapamatovat, a je obtížnější pochopit, co se ve skutečnosti děje. Stejně jako většina věcí musí být nalezena rovnováha.

1
Jason B

Jeden způsob, jak se to snažím popsat lidem, nemusí být ten nejlepší

Zvažte program, který přidává 2 + 2 a výstupy 4

Zvažte program, který přidává dvě čísla zadaná uživatelem, x + y = z

Co je užitečnější a obecnější?

1
Bryan Harrington

Řekl bych, že abstrakce je něco, co skrývá zbytečné detaily. Jednou z nejzákladnějších abstrakčních jednotek je postup. Například se nechci starat o to, jak ukládám data do databáze, když je načítám ze souboru. Takže vytvořím funkci save_to_database.

Abstrakce mohou být také spojeny, aby vytvořily větší abstrakce. Například funkce mohou být sestaveny do třídy, třídy mohou být sestaveny do programu, programy mohou být sestaveny do distribuovaného systému atd.

1
Jason Baker

To je něco, o čem jsem vlastně chtěl blogovat po delší dobu, ale nikdy jsem se k tomu nedostal. Naštěstí jsem opakující zombie a je tu i odměna. Můj příspěvek dopadl poměrně zdlouhavě , ale tady je podstata:

Abstrakce v programování je o pochopení podstaty objektu v daném kontextu.

[...]

Abstrakce se mýlí nejen s generalizací, ale také se zapouzdřením, ale jedná se o dvě ortogonální části skrytí informací: Modul služeb rozhoduje o tom, co je ochoten ukázat, a klientský modul o tom, co je ochoten vidět. Zapouzdření je první část a abstrakce druhá část. Pouze obě společně představují úplné skrytí informací.

Doufám, že to pomůže.

1
back2dos

Další úroveň přesměrování.

Nechcete se starat, zda je objekt, který používáte, Cat nebo Dog, takže procházejte tabulkou virtuálních funkcí a najděte správnou makeNoise() funkce.

Jsem si jist, že by to mohlo být aplikováno také na „nižší“ a „vyšší“ úrovně - vzpomeňte si na kompilátor, který vyhledá správnou instrukci pro daný procesor nebo Haskellovu Monad abstrakci nad výpočetními efekty voláním vše return a >>=.

1
yatima2975

Možná byste si měli prohlédnout některé metriky Boba Martina

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

To znamená, že si nemyslím, že jeho „abstraktnost“ je stejná jako ta vaše. Je to spíše míra „nedostatečné implementace na třídu“, což znamená použití rozhraní/abstraktní třídy. Nestabilita a vzdálenost od hlavní sekvence pravděpodobně hrají více toho, co hledáte.

1
MIA

Abstrakce představuje něco (např. Pojem, datová struktura, funkce) z hlediska něčeho jiného. Používáme například slova ke komunikaci. Slovo je abstraktní entita, která může být reprezentována z hlediska zvuků (řeči) nebo z hlediska grafických symbolů (psaní). Klíčovou myšlenkou abstrakce je, že dotyčná entita je odlišná od základní reprezentace, stejně jako slovo není zvuk, který se používá k jeho vyslovení, nebo písmena, která se používají k jeho napsání.

Alespoň teoreticky tedy může být základní reprezentace abstrakce nahrazena jinou reprezentací. V praxi je však abstrakce zřídkakdy zcela odlišná od základní reprezentace a někdy reprezentace " netěsnosti " prostřednictvím. Například řeč nese emoční podtóny, které je velmi obtížné sdělit písemně. Z tohoto důvodu může mít zvukový záznam a přepis stejných slov na publikum velmi odlišný účinek. Jinými slovy, abstrakce slov často uniká.

Abstrakce se obvykle vyskytují ve vrstvách. Slova jsou abstrakce, které mohou být představovány písmeny, což jsou zase abstrakce zvuků, které jsou zase abstrakcemi vzoru pohybu částic vzduchu, které jsou vytvářeny hlasivkami a které jsou detekovány ušními bubny .

V informatice jsou bity obvykle nejnižší úrovní reprezentace. Bajty, umístění paměti, instrukce pro sestavení a registry CPU jsou další úrovní abstrakce. Pak máme primitivní datové typy a instrukce jazyka vyšší úrovně, které jsou implementovány z hlediska bytů, umístění paměti a instrukcí pro montáž. Pak funkce a třídy (za předpokladu OO jazyk), které jsou implementovány jako primitivní datové typy a vestavěny v jazykových instrukcích. Pak jsou implementovány složitější funkce a třídy, pokud jde o jednodušší. z těchto funkcí a tříd implementují datové struktury, jako jsou seznamy, hromádky, fronty atd. Ty se zase používají k reprezentaci konkrétnějších entit, jako je fronta procesů nebo seznam zaměstnanců, nebo hash tabulky titulů knih. V tomto schématu věcí je každá úroveň abstrakce s ohledem na jejího předchůdce.

1
Dima

Merriam-webster definuje abstrakt jako přídavné jméno: odpojen od jakékoli konkrétní instance.

Abstrakce je model nějakého systému. Často uvádějí skupinu předpokladů, které musí být splněny, aby byl reálný systém schopen modelovat pomocí abstrakce, a často se používají k tomu, abychom nám umožnili konceptualizovat stále složitější systémy. Přechod z reálného systému na abstrakci nemá žádnou formální matematickou metodu. Je to na úsudku toho, kdo definuje abstrakci a jaký je účel abstrakce.

Často jsou však abstrakce definovány pomocí matematických konstrukcí. Je to pravděpodobně proto, že se tak často používají ve vědě a inženýrství.

Příkladem je newtonovská mechanika. Předpokládá, že je vše nekonečně malé a veškerá energie je zachována. Interakce mezi objekty jsou jasně definovány pomocí matematických vzorců. Nyní, jak víme, vesmír tak docela nefunguje a v mnoha situacích abstrakce prosakuje. Ale v mnoha situacích to funguje velmi dobře.

Dalším abstraktním modelem jsou typické prvky lineárních obvodů, odpory, kondenzátory a induktory. Interakce jsou opět jasně definovány pomocí matematických vzorců. U nízkofrekvenčních obvodů nebo jednoduchých reléových ovladačů a dalších věcí funguje RLC analýza dobře a poskytuje velmi dobré výsledky. Ale v jiných situacích, jako jsou mikrovlnné rádiové obvody, jsou prvky příliš velké a interakce jsou jemnější a jednoduché abstrakce RLC nevydrží. Co dělat v tomto bodě, je na úsudku inženýra. Někteří inženýři vytvořili další abstrakci nad ostatními, jiní nahrazují ideální operační zesilovače novými matematickými vzorci, jak fungují, jiní nahrazují ideální operační zesilovače simulovanými skutečnými operačními zesilovači, které jsou zase simulovány složitou sítí menších ideální prvky.

Jak již uvedli ostatní, jedná se o zjednodušený model. Je to nástroj používaný k lepšímu porozumění složitým systémům.

1
whatsisname

Programovací abstrakce jsou abstrakce vytvořené někým na programovém prvku. Řekněme, že víte, jak vytvořit menu s jeho předměty a tak. Pak někdo viděl ten kus kódu a myšlenky, hej, který by mohl být užitečný v jiných druzích hireachy-podobných struktur, a definoval vzorec návrhu součásti pomocí abstrakce prvního kusu kódu.

Objektově orientované návrhové vzory jsou docela dobrým příkladem toho, co je abstrakce, a nemyslím skutečnou implementaci, ale způsob, jak bychom měli přistupovat k řešení.

Abychom to shrnuli, programová abstrakce je přístup, který nám umožňuje porozumět problému, je to prostředek, jak něco získat, ale není skutečnou věcí

0
guiman

Pro mě je abstrakce něco, co neexistuje „doslova“, je to něco jako nápad. Pokud to vyjádříte matematicky, už to není abstraktní, protože matematika je jazyk, který vyjadřuje to, co se děje v mozku, takže jej může rozumět mozek někoho jiného, ​​takže nemůžete strukturovat své myšlenky, protože pokud ano, nejde o myšlenku ještě: budete muset pochopit, jak mozek pracuje, aby vyjádřil myšlenkový model.

Abstrakce je něco, co vám umožňuje interpretovat realitu do něčeho, co na ní může být nezávislé. Můžete abstraktní pláž a sen, ale pláž existuje, ale sen ne. Ale mohli byste říct, že existují, ale není to pravda.

Nejtěžší věcí v abstrakci je najít způsob, jak ji vyjádřit, aby ji ostatní lidé mohli pochopit, aby se mohla proměnit ve skutečnost. To je ta nejtěžší práce a nelze ji opravdu udělat samostatně: musíte vymyslet relativní model, který pracuje na vašich nápadech a kterému může porozumět někdo jiný.

Podle mě by abstrakce v počítačovém jazyce měla být pojmem „matematický“ model, jde o opakované použití myšlenek, které lze sdělit, a je to obrovské omezení ve srovnání s tím, čeho lze dosáhnout abstraktně.

Jednoduše řečeno, atomy jsou vedle sebe, ale je to jedno. Velká skupina molekul uspořádaných do lidské bytosti může pochopit, že je vedle někoho, ale nemůže pochopit, jak je to právě to, jak se atomy umístily do nějaké struktury.

Jeden objekt, který je ovládán pojmem obecně, nemůže „pochopit“ sám sebe. Proto se snažíme věřit v boha a proč máme těžko pochopit náš mozek.

Můžu mít teď svou medaili?

0
jokoon

Zde nematematická odpověď:

Abtracting away v programování předstírá, že vám nyní nezáleží na detailech, zatímco ve skutečnosti to děláte a měli byste se o ně neustále starat. V podstatě to předstírá.

0
mojuba

Zajímavá otázka. Nevím o jediné definici abstrakce, která se považuje za autoritativní, pokud jde o programování. Ačkoli jiní lidé poskytli spojení na některé definice od různých odvětví CS teorie nebo matematiky; Rád to vymyslím podobným způsobem jako „supervenience“ viz http://en.wikipedia.org/wiki/Supervenience

Když mluvíme o abstrakci v programování, porovnáváme v podstatě dva popisy systému. Váš kód je popis programu. Abstrakce kódu by byla také popisem tohoto programu, ale na „vyšší“ úrovni. Samozřejmě byste mohli mít ještě vyšší úroveň abstrakce své původní abstrakce (např. Popis programu ve vysoké systémové architektuře versus popis programu v jeho podrobném návrhu).

Co nyní dělá jeden popis „vyšší úrovní“ než jiný. Klíčem je „vícenásobná realizovatelnost“ - vaše abstrakce programu by mohla být realizována mnoha způsoby v mnoha jazycích. Nyní byste mohli říci, že jeden program by mohl vytvořit i několik návrhů - dva lidé by mohli vytvořit dva různé návrhy na vysoké úrovni, které oba přesně popisují program. Ekvivalence realizací dělá rozdíl.

Při porovnávání programů nebo návrhů to musíte udělat způsobem, který vám umožní identifikovat klíčové vlastnosti popisu na této úrovni. Můžete se dostat do komplikovaných způsobů, jak říci, že design je ekvivalentní jinému, ale nejjednodušší způsob, jak o tom přemýšlet, je tento - dokáže jediný binární program splnit omezení obou popisů?

Co dělá jednu úroveň popisu vyšší než druhou? Řekněme, že máme jednu úroveň popisu A (např. Návrhové dokumenty) a další úroveň popisu B (např. Zdrojový kód). A je vyšší úroveň než B, protože pokud A1 a A2 jsou dva nekvivalentní popisy na úrovni A, pak realizace těchto popisů, B1 a B2 musí také také být na úrovni B neekvivalentní. Avšak zpětný chod nemusí nutně platit.

Takže pokud nemůžu vytvořit jediný binární program, který splňuje dva odlišné konstrukční dokumenty (tj. Omezení těchto návrhů by si vzájemně odporovala), pak zdrojový kód, který tyto návrhy implementuje, musí být odlišný. Ale na druhou stranu, pokud vezmu dvě sady zdrojového kódu, které by nemohly být zkompilovány do stejného binárního programu, stále by se mohlo stát, že binární soubory, které vzniknou kompilací těchto dvou sad zdrojového kódu, splňují stejný design dokument. Návrhový dokument je tedy „abstrakce“ zdrojového kódu.

0
wahbedahbe