it-swarm-eu.dev

Was ist Abstraktion?

Gibt es eine allgemein vereinbarte Definition für das, was ein Programmierabstraktion ist, wie es von Programmierern verwendet wird? [Beachten Sie, dass die Programmierabstraktion nicht mit Wörterbuchdefinitionen für das Wort "Abstraktion" verwechselt werden darf.] Gibt es eine eindeutige oder sogar mathematische Definition? Was sind einige klare Beispiele für Abstraktionen?

38
mlvljr

Die Antwort auf "Können Sie definieren, was eine Programmierabstraktion mehr oder weniger mathematisch ist?" ist "nein". Abstraktion ist kein mathematisches Konzept. Es wäre, als würde man jemanden bitten, die Farbe einer Zitrone mathematisch zu erklären.

Wenn Sie jedoch eine gute Definition wünschen: Abstraktion ist der Prozess des Übergangs von einer bestimmten Idee zu einer allgemeineren. Schauen Sie sich zum Beispiel Ihre Maus an. Ist es drahtlos? Welche Art von Sensor hat es? Wie viele Tasten? Ist es ergonomisch? Wie groß ist es? Die Antworten auf all diese Fragen können Ihre Maus genau beschreiben, aber unabhängig von den Antworten handelt es sich immer noch um eine Maus, da es sich um ein Zeigegerät mit Tasten handelt. Das ist alles was man braucht um eine Maus zu sein. "Silver Logitech MX518" ist ein konkretes, spezifisches Element, und "mouse" ist eine Abstraktion davon. Eine wichtige Sache, über die man nachdenken sollte, ist, dass es kein konkretes Objekt wie eine "Maus" gibt, es ist nur eine Idee. Die Maus auf Ihrem Schreibtisch ist immer etwas Spezifischeres - es ist eine Apple Magic Mouse oder eine Dell Optical Mouse oder eine Microsoft IntelliMouse - "Maus" ist nur ein abstraktes Konzept.

Die Abstraktion kann geschichtet und so fein- oder grobkörnig sein, wie Sie möchten (ein MX518 ist eine Maus, bei der es sich um ein Zeigeobjekt handelt, bei dem es sich um ein Computerperipheriegerät handelt, bei dem es sich um ein mit Elektrizität betriebenes Objekt handelt) und in praktisch jede Richtung, die Sie möchten (meine Maus hat einen Draht, was bedeutet, dass ich ihn als Objekte mit einem Draht kategorisieren kann. Er ist auch unten flach, sodass ich ihn als eine Art von Objekten kategorisieren kann, die nicht rollen, wenn aufrecht auf einer schiefen Ebene platziert).

Die objektorientierte Programmierung basiert auf dem Konzept von Abstraktionen und Familien oder Gruppen von ihnen. Gut OOP bedeutet, dass Sie gute Abstraktionen mit der entsprechenden Detailebene auswählen, die in der Domäne Ihres Programms sinnvoll sind und nicht "auslaufen". Ersteres bedeutet, dass Sie eine Maus als ein Objekt klassifizieren, das gewonnen hat Nicht auf einer schiefen Ebene zu rollen ist für eine Anwendung, die Computerausrüstung inventarisiert, nicht sinnvoll, aber für einen Physiksimulator möglicherweise sinnvoll. Letzteres bedeutet, dass Sie versuchen sollten, zu vermeiden, dass Sie sich in eine Hierarchie einschließen, die dies nicht tut. Sind wir in meiner obigen Hierarchie sicher, dass alle Computerperipheriegeräte mit Strom versorgt werden? Was ist mit a Wenn wir einen Stift in die Kategorie "Peripherie" einteilen möchten, haben wir ein Problem, da er keinen Strom verbraucht und wir Computerperipheriegeräte als Objekte definieren, die Elektrizität verbrauchen. Die Kreisellipse) Problem ist das bekannteste Beispiel für dieses Rätsel.

46
nlawalker

Ich bin mit den meisten Antworten kategorisch nicht einverstanden.

Das ist meine Antwort:

Bei zwei Mengen G und H kann eine Galois-Verbindung (alpha, beta) zwischen ihnen definiert werden, und eine kann als Konkretisierung der anderen bezeichnet werden; Kehre die Verbindung um und eine ist eine Abstraktion der anderen. Die Funktionen sind eine Konkretisierungsfunktion und eine Abstraktionsfunktion.

Dies geht aus der Theorie der abstrakten Interpretation von Computerprogrammen hervor, die bislang typischerweise ein statischer Analyseansatz ist.

25
Paul Nathan

Die Abstraktion konzentriert sich mehr auf What und weniger auf How. Oder Sie können sagen, nur die Dinge wissen, die Sie benötigen, und dem Anbieter für alle anderen Dienste vertrauen. Manchmal verbirgt es sogar die Identität des Dienstanbieters.

Diese Site bietet beispielsweise ein System zum Stellen und Beantworten von Fragen. Fast jeder hier kennt die Verfahren zum Fragen, Beantworten, Abstimmen und für andere Dinge auf dieser Website. Aber nur sehr wenige wissen, welche Technologien zugrunde liegen. Zum Beispiel, ob die Site mit ASP.net mvc oder Python entwickelt wurde, ob diese auf einem Windows- oder einem Linux-Server ausgeführt wird usw. Denn das geht uns nichts an. Diese Site behält also eine Abstraktionsschicht über dem zugrunde liegenden Mechanismus bei, damit wir den Service bereitstellen können.

Einige andere Beispiele:

  • Ein Auto verbirgt alle seine Mechanismen, bietet aber eine Möglichkeit, es zu fahren, zu tanken und für seinen Besitzer zu warten.

  • Jede API verbirgt alle Implementierungsdetails und stellt den Dienst anderen Programmierern zur Verfügung.

  • Eine Klasse in OOP versteckt ihre privaten Mitglieder und die Implementierung öffentlicher Mitglieder, die den Dienst zum Aufrufen der öffentlichen Mitglieder bereitstellen.

  • Bei Verwendung eines Objekts vom Typ Interface oder abstract class in Java oder C++, die eigentliche Implementierung ist ausgeblendet. Und nicht nur ausgeblendet, die Implementierungen der in Interface deklarierten Methoden unterscheiden sich wahrscheinlich auch in verschiedenen implementierten/geerbte Klassen. Da Sie jedoch denselben Dienst erhalten, stören Sie sich einfach nicht daran, dass How implementiert ist und genau Who/What den Dienst bereitstellt.

  • Identity Hiding: Für den Satz "Ich weiß, dass Sam Computerprogramme schreiben kann." Die Abstraktion kann sein: "Sam ist ein Programmierer. Programmierer wissen, wie man Computerprogramme schreibt." In der zweiten Aussage ist die Person nicht wichtig. Aber seine Fähigkeit zu programmieren ist wichtig.

13
Gulshan

Eine Programmierabstraktion ist ein vereinfachtes Modell eines Problems.

Eine TCP/IP-Verbindung ist beispielsweise eine Abstraktion über das Senden von Daten. Sie geben lediglich eine IP-Adresse und eine Portnummer an und senden diese an die API. Sie sind nicht mit allen Details der Kabel, Signale, Nachrichtenformate und Fehler befasst.

7
C. Ross

Eine Abstraktion ist nur die Programmierversion eines Satzes.

Sie haben ein formales System, Sie schlagen einen Gedanken über dieses System vor. Sie machen einen Beweis dafür, und wenn es funktioniert, dann haben Sie einen Satz. Wenn Sie wissen, dass Ihr Satz gilt, können Sie ihn für weitere Beweise über das System verwenden. Vom System bereitgestellte Grundelemente (z. B. if-Anweisungen und int-Werttypen) werden normalerweise als Axiome angesehen, obwohl dies nicht unbedingt zutrifft, da alles, was keine in Maschinencode geschriebenen CPU-Anweisungen sind, eine Art Abstraktion ist.

In der funktionalen Programmierung ist die Idee eines Programms als mathematische Aussage sehr stark, und häufig kann das Typensystem (in einer starken statisch typisierten Sprache wie Haskell, F # oder OCAML) zum Testen der Theoremität durch Beweise verwendet werden.

Beispiel: Nehmen wir an, wir haben Additions- und Gleichheitsprüfung als primitive Operationen und Ganzzahlen und Boolesche Werte als primitive Datentypen. Das sind unsere Axiome. Wir können also sagen, dass 1 + 3 == 2 + 2 ist ein Theorem. Verwenden Sie dann die Regeln für Addition, Ganzzahlen und Gleichheit, um festzustellen, ob dies eine wahre Aussage ist.

Nehmen wir nun an, wir wollen eine Multiplikation, und unsere Grundelemente (der Kürze halber) enthalten ein Schleifenkonstrukt und ein Mittel zum Zuweisen symbolischer Referenzen. Wir könnten das vorschlagen

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

Ich werde so tun, als hätte ich das bewiesen, um zu demonstrieren, dass Multiplikation gilt. Jetzt kann ich die Multiplikation verwenden, um mehr mit meinem System (der Programmiersprache) zu tun.

Ich kann auch mein Typensystem überprüfen. (*) hat einen Typ von int -> int -> int. Es dauert 2 Ints und gibt ein Int aus. Addition hat den Typ int -> int -> int, so dass 0 + (Rest) gilt, solange (Rest) zu einem Int führt. Meine Schleife könnte alle möglichen Dinge tun, aber ich sage, sie gibt eine Kette von Curry-Funktionen aus, so dass (x + (x + (x ... + 0))) das Ergebnis ist. Die Form dieser Additionskette ist nur (int -> (int -> (int ... -> int))), daher weiß ich, dass meine endgültige Ausgabe ein int sein wird. Mein Typensystem hat also die Ergebnisse meines anderen Beweises aufgehalten!

Kombinieren Sie diese Art von Idee über viele Jahre, viele Programmierer und viele Codezeilen, und Sie haben moderne Programmiersprachen: eine herzhafte Reihe von Grundelementen und riesige Bibliotheken "bewährter" Code-Abstraktionen.

7
CodexArcanum

Hier bekommen Sie gute Antworten. Ich würde nur vorsichtig sein - die Leute denken, Abstraktion ist irgendwie diese wunderbare Sache, die auf ein Podest gestellt werden muss und von der man nicht genug bekommen kann. Es ist nicht. Es ist nur gesunder Menschenverstand. Es werden lediglich die Ähnlichkeiten zwischen den Dingen erkannt, sodass Sie eine Problemlösung auf eine Reihe von Problemen anwenden können.

Erlaube mir einen Ärger ...

Ganz oben auf meiner Liste der Belästigungen steht, wenn Leute von "Abstraktionsebenen" sprechen, als ob das eine gute Sache wäre. Sie machen "Wrapper" um Klassen oder Routinen, die sie nicht mögen, und nennen sie "abstrakter", als ob das sie besser machen würde. Erinnerst du dich an die Fabel von "Prinzessin und Erbse"? Die Prinzessin war so zart, dass sie, wenn sich unter ihrer Matratze eine Erbse befand, nicht schlafen konnte und das Hinzufügen weiterer Matratzenschichten nicht helfen würde. Die Idee, dass das Hinzufügen weiterer Ebenen der "Abstraktion" hilft, ist einfach so - normalerweise nicht. Dies bedeutet lediglich, dass jede Änderung an der Basisentität durch mehrere Codeebenen geleitet werden muss.

4
Mike Dunlavey

Ich denke, Sie finden vielleicht ein Blog-Beitrag von mir über undichte Abstraktionen nützlich. Hier ist der relevante Hintergrund :

Abstraktion ist ein Mechanismus, mit dem Sie die Gemeinsamkeiten einer Reihe verwandter Programmfragmente erkennen, ihre Unterschiede beseitigen und Programmierern ermöglichen können, direkt mit einem Konstrukt zu arbeiten, das sie darstellt dieses abstrakte Konzept. Dieses neue Konstrukt hat (virtuell) immer Parametrisierungen : ein Mittel, um die Verwendung des Konstrukts an Ihre spezifischen Anforderungen anzupassen.

Zum Beispiel kann eine List -Klasse die Details einer Implementierung mit verknüpften Listen abstrahieren - wo Sie denken können, anstatt in next und previous Zeigern zu manipulieren auf der Ebene des Hinzufügens oder Entfernens von Werten zu einer Sequenz. Abstraktion ist ein wesentliches Werkzeug, um nützliche, reichhaltige und manchmal komplexe Merkmale aus einer viel kleineren Menge primitiverer Konzepte zu erstellen.

Abstraktion hängt mit Kapselung und Modularität zusammen, und diese Konzepte werden oft missverstanden.

Im Beispiel List kann die Kapselung verwendet werden, um die Implementierungsdetails einer verknüpften Liste auszublenden. In einer objektorientierten Sprache können Sie beispielsweise die Zeiger next und previous privat machen, wobei nur der List-Implementierung Zugriff auf diese Felder gewährt wird.

Die Kapselung reicht für die Abstraktion nicht aus, da dies nicht unbedingt bedeutet, dass Sie eine neue oder andere Konzeption der Konstrukte haben. Wenn eine List -Klasse Ihnen nur Zugriffsmethoden im Stil 'getNext'/'setNext' geben würde, würde sie aus den Implementierungsdetails von Ihnen kapseln (z. B. haben Sie einen Namen angegeben) das Feld 'prev' oder 'previous'? Was war sein statischer Typ?), aber es hätte einen sehr geringen Abstraktionsgrad.

Modularität befasst sich mit versteckten Informationen : Stabile Eigenschaften werden in einer Schnittstelle angegeben und ein Modul implementiert diese Schnittstelle und behält alle Implementierungsdetails innerhalb des Moduls bei. Die Modularität hilft Programmierern, mit Veränderungen umzugehen, da andere Module nur von der stabilen Schnittstelle abhängen.

Das Ausblenden von Informationen wird durch die Kapselung unterstützt (sodass Ihr Code nicht von instabilen Implementierungsdetails abhängt), die Kapselung ist jedoch für die Modularität nicht erforderlich. Sie können beispielsweise eine List -Struktur in C implementieren, indem Sie die Zeiger 'next' und 'prev' für die Welt verfügbar machen, aber auch eine Schnittstelle bereitstellen, die initList(), addToList() und removeFromList() Funktionen. Vorausgesetzt, dass die Regeln der Schnittstelle befolgt werden, können Sie sicherstellen, dass bestimmte Eigenschaften immer gültig sind, z. B. dass die Datenstruktur immer in einem gültigen Zustand ist. [Parnas 'klassisches Papier über Modularität wurde zum Beispiel mit einem Beispiel in Assembly geschrieben. Die Schnittstelle ist ein Vertrag und eine Form der Kommunikation über das Design. Sie muss nicht unbedingt mechanisch überprüft werden, obwohl wir uns heute darauf verlassen.]

Obwohl Begriffe wie abstrakt, modular und gekapselt als positive Designbeschreibungen verwendet werden, ist es wichtig zu wissen, dass das Vorhandensein einer dieser Eigenschaften nicht automatisch zu einem guten Design führt:

  • Wenn ein n ^ 3-Algorithmus "gut eingekapselt" ist, ist er immer noch schlechter als ein verbesserter n log n-Algorithmus.

  • Wenn eine Schnittstelle an ein bestimmtes Betriebssystem gebunden ist, wird keiner der Vorteile eines modularen Aufbaus realisiert, wenn beispielsweise ein Videospiel von Windows auf das iPad portiert werden muss.

  • Wenn die erstellte Abstraktion zu viele unwesentliche Details enthält, kann kein neues Konstrukt mit eigenen Operationen erstellt werden: Es ist einfach ein anderer Name für dieselbe Sache.

4
Macneil

Wäre die Antwort von Wikipedia gut genug? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

In der Informatik reduziert und berücksichtigt der Mechanismus und die Praxis der Abstraktion Details, so dass man sich auf einige Konzepte gleichzeitig konzentrieren kann.

4
John Fisher

Nun, mathematisch gesehen ist "Ganzzahl" eine Abstraktion. Und wenn Sie formale Beweise wie x + y = y + x für alle Ganzzahlen erstellen, arbeiten Sie mit der Abstraktion "Ganzzahl" und nicht mit bestimmten Zahlen wie 3 oder 4. Dasselbe passiert in der Softwareentwicklung, wenn Sie mit dem interagieren Maschine auf einer Ebene über Registern und Speicherplätzen. In den meisten Fällen können Sie kraftvollere Gedanken auf einer abstrakteren Ebene denken.

4
Kate Gregory

Um es einer anderen Person zu erklären, würde ich von den Ergebnissen zurück den umgekehrten Weg gehen:

Abstraktion in der Computerprogrammierung ist der Vorgang, etwas so zu verallgemeinern, dass mehr als eine ähnliche Sache im Allgemeinen als gleich behandelt und gleich behandelt werden kann.

Wenn Sie das erweitern möchten, können Sie hinzufügen:

Manchmal wird dies getan, um ein polymorphes Verhalten (Schnittstellen und Vererbung) zu erreichen, um sich wiederholenden Code im Voraus zu reduzieren, manchmal, um das Innenleben von etwas zu einem späteren Zeitpunkt durch eine ähnliche Lösung zu ersetzen, ohne das ändern zu müssen Code auf der anderen Seite des abstrahierten Containers oder Wrappers, um hoffentlich in Zukunft die Nacharbeit zu reduzieren.

Darüber hinaus denke ich, dass Sie mit Beispielen beginnen müssen ...

2
Bill

Abstraktion ist, wenn Sie Details ignorieren, die als irrelevant zugunsten der als relevant erachteten angesehen werden.

Abstraktion umfasst Kapselung, Ausblenden von Informationen und Verallgemeinerung. Es umfasst keine Analogien, Metaphern oder Heuristiken.

Jeder mathematische Formalismus für das Konzept der Abstraktion wäre selbst be eine Abstraktion, da das zugrunde liegende Ding notwendigerweise in eine Reihe mathematischer Eigenschaften abstrahiert werden müsste! Der kategorietheoretische Begriff eines Morphismus kommt dem, was Sie suchen, wahrscheinlich am nächsten.

Abstraktion ist nicht etwas, das Sie deklarieren, sondern etwas, das Sie tun .

2
Steven A. Lowe

Ok, ich glaube, ich habe herausgefunden, was Sie fragen: "Was ist eine mathematisch strenge Definition von 'Eine Abstraktion'?"

Wenn dies der Fall ist, haben Sie wahrscheinlich kein Glück - "Abstraktion" ist ein Begriff für Softwarearchitektur/-design und hat meines Wissens keinen mathematischen Hintergrund (vielleicht korrigiert mich jemand, der sich mit theoretischer CS besser auskennt hier) haben mehr als "Kopplung" oder "Verstecken von Informationen" mathematische Definitionen.

2
Fishtoaster

Ich denke immer an Abstraktion in der Programmierung, um Details zu verbergen und eine vereinfachte Oberfläche bereitzustellen. Dies ist der Hauptgrund, warum Programmierer monumentale Aufgaben in überschaubare Teile zerlegen können. Mit der Abstraktion können Sie die Lösung für einen Teil des Problems erstellen, einschließlich aller wichtigen Details, und dann eine einfache Schnittstelle zur Verwendung der Lösung bereitstellen. Dann können Sie die Details tatsächlich "vergessen". Dies ist wichtig, da eine Person auf keinen Fall alle Details eines superkomplexen Systems gleichzeitig im Kopf behalten kann. Dies bedeutet nicht, dass die Details unter der Abstraktion niemals überarbeitet werden müssen, sondern dass vorerst nur die Schnittstelle gespeichert werden muss.

Bei der Programmierung kann diese vereinfachte Schnittstelle alles sein, von einer Variablen (die eine Gruppe von Bits abstrahiert und eine einfachere mathematische Schnittstelle bereitstellt) über eine Funktion (abstrahiert jede Menge an Verarbeitung in einen einzelnen Zeilenaufruf) bis zu einer Klasse und darüber hinaus.

Letztendlich besteht die Hauptaufgabe der Programmierer darin, normalerweise alle rechnerischen Details zu abstrahieren und eine einfache Oberfläche wie eine GUI bereitzustellen, die jemand nutzen kann, der nicht weiß, wie Computer funktionieren.

Einige der Vorteile der Abstraktion sind:

  • Ermöglicht das Aufteilen eines großen Problems in überschaubare Teile. Wenn Sie die Datensätze einer Person zu einer Datenbank hinzufügen, müssen Sie nicht mit dem Einfügen und Ausgleichen von Indexbäumen in der Datenbank herumspielen. Diese Arbeit wurde vielleicht irgendwann erledigt, wurde aber jetzt abstrahiert und Sie müssen sich keine Sorgen mehr machen.

  • Ermöglicht es mehreren Personen, bei einem Projekt gut zusammenzuarbeiten. Ich möchte nicht alle Vor- und Nachteile des Codes meines Kollegen kennen müssen. Ich möchte nur wissen, wie man es benutzt, was es tut und wie man es mit meiner Arbeit (der Schnittstelle) zusammenfügt.

  • Ermöglicht Personen, die nicht über das erforderliche Wissen verfügen, eine komplexe Aufgabe auszuführen. Meine Mutter kann ihr Facebook aktualisieren und Leute, die sie im ganzen Land kennt, können es sehen. Ohne die Abstraktion eines wahnsinnig komplexen Systems zu einer einfachen Weboberfläche wäre sie auf keinen Fall in der Lage, etwas Ähnliches zu tun (und ich auch nicht).

Abstraktion kann jedoch den umgekehrten Effekt haben, dass Dinge weniger überschaubar werden, wenn sie überbeansprucht werden. Wenn Sie ein Problem in zu viele kleine Teile aufteilen, steigt die Anzahl der Schnittstellen, an die Sie sich erinnern müssen, und es wird schwieriger zu verstehen, was wirklich vor sich geht. Wie die meisten Dinge muss ein Gleichgewicht gefunden werden.

1
Jason B

Eine Möglichkeit, es den Menschen zu beschreiben, ist möglicherweise nicht die beste

Stellen Sie sich ein Programm vor, das 2 + 2 hinzufügt und 4 ausgibt

Stellen Sie sich ein Programm vor, das zwei von einem Benutzer eingegebene Zahlen hinzufügt: x + y = z

Welches ist nützlicher und allgemeiner?

1

Ich würde argumentieren, dass eine Abstraktion etwas ist, das unnötige Details verbirgt. Eine der grundlegendsten Abstraktionseinheiten ist das Verfahren. Zum Beispiel möchte ich mir keine Gedanken darüber machen, wie ich Daten in der Datenbank speichere, wenn ich diese Daten aus einer Datei einlese. Also erstelle ich eine save_to_database-Funktion.

Abstraktionen können auch zu größeren Abstraktionen zusammengefügt werden. Beispielsweise können Funktionen in einer Klasse zusammengestellt werden, Klassen können zu einem Programm zusammengefasst werden, Programme können zu einem verteilten System zusammengestellt werden usw.

1
Jason Baker

Das ist etwas, worüber ich eigentlich schon länger bloggen wollte, aber ich bin nie dazu gekommen. Zum Glück bin ich ein Repräsentantenzombie und es gibt sogar ein Kopfgeld. Mein Beitrag ist ziemlich lang geworden , aber hier ist das Wesentliche:

Bei der Abstraktion in der Programmierung geht es darum, die Essenz eines Objekts in einem bestimmten Kontext zu verstehen.

[...]

Abstraktion wird nicht nur mit Verallgemeinerung, sondern auch mit Kapselung verwechselt, sondern dies sind die beiden orthogonalen Teile des Versteckens von Informationen: Das Servicemodul entscheidet, was es zeigen möchte, und das Client-Modul entscheidet, was es sehen möchte. Kapselung ist der erste Teil und Abstraktion der letztere. Nur beide zusammen bilden ein vollständiges Verstecken von Informationen.

Ich hoffe, das hilft.

1
back2dos

Eine zusätzliche Indirektionsebene.

Sie möchten sich nicht darum kümmern, ob das von Ihnen verwendete Objekt ein Cat oder ein Dog ist. Sie durchsuchen eine virtuelle Funktionstabelle, um das richtige makeNoise() zu finden Funktion.

Ich bin sicher, dass dies auch auf 'niedrigere' und 'höhere' Ebenen angewendet werden könnte - denken Sie an einen Compiler, der die richtige Anweisung für einen bestimmten Prozessor nachschlägt, oder an Haskells Monads, die über Recheneffekte abstrahieren, indem sie alles aufrufen return und >>=.

1
yatima2975

Vielleicht möchten Sie einige der Metriken von Bob Martin überprüfen

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

Trotzdem denke ich nicht, dass seine "Abstraktheit" dieselbe ist wie deine. Dies ist eher ein Maß für "mangelnde Implementierung in einer Klasse", was die Verwendung von Schnittstellen/abstrakten Klassen bedeutet. Instabilität und Entfernung von der Hauptsequenz spielen wahrscheinlich mehr mit dem, was Sie suchen.

1
MIA

Eine Abstraktion repräsentiert etwas (z. B. ein Konzept, eine Datenstruktur, eine Funktion) in Bezug auf etwas anderes. Zum Beispiel verwenden wir Wörter, um zu kommunizieren. Ein Wort ist eine abstrakte Entität, die in Form von Lauten (Sprache) oder in Form von grafischen Symbolen (Schrift) dargestellt werden kann. Die Schlüsselidee einer Abstraktion ist, dass sich die betreffende Entität von der zugrunde liegenden Darstellung unterscheidet, genauso wie ein Wort nicht die Laute sind, die zum Aussprechen verwendet werden, oder die Buchstaben, die zum Schreiben verwendet werden.

Zumindest theoretisch kann somit die zugrunde liegende Darstellung einer Abstraktion durch eine andere Darstellung ersetzt werden. In der Praxis unterscheidet sich die Abstraktion jedoch selten vollständig von der zugrunde liegenden Darstellung, und manchmal ist die Darstellung " Lecks " durch. Zum Beispiel trägt Sprache emotionale Untertöne, die schriftlich nur sehr schwer zu vermitteln sind. Aus diesem Grund können eine Audioaufnahme und eine Abschrift derselben Wörter sehr unterschiedliche Auswirkungen auf das Publikum haben. Mit anderen Worten, die Abstraktion von Wörtern ist oft undicht.

Abstraktionen erfolgen normalerweise in Schichten. Wörter sind Abstraktionen, die durch Buchstaben dargestellt werden können, die wiederum selbst Abstraktionen von Klängen sind, die wiederum Abstraktionen des Bewegungsmusters der Luftpartikel sind, die durch die Stimmbänder erzeugt und vom Trommelfell erfasst werden .

In der Informatik sind Bits typischerweise die niedrigste Repräsentationsebene. Bytes, Speicherorte, Assembly-Anweisungen und CPU-Register sind die nächste Abstraktionsebene. Dann haben wir primitive Datentypen und Anweisungen einer höheren Sprache, die in Bezug auf Bytes, Speicherorte und Assembly-Anweisungen implementiert sind. Dann Funktionen und Klassen (unter der Annahme einer OO Sprache), die in Bezug auf primitive Datentypen und eingebaute Sprachanweisungen implementiert sind. Dann werden komplexere Funktionen und Klassen in Bezug auf die einfacheren implementiert. Einige Von diesen Funktionen und Klassen werden Datenstrukturen wie Listen, Stapel, Warteschlangen usw. implementiert. Diese werden wiederum verwendet, um spezifischere Entitäten wie eine Warteschlange von Prozessen oder eine Liste von Mitarbeitern oder eine Hash-Tabelle mit Buchtiteln darzustellen. In diesem Schema der Dinge ist jede Ebene eine Abstraktion in Bezug auf ihren Vorgänger.

1
Dima

Merriam-webster definiert abstrakt als ein Adjektiv, das von einer bestimmten Instanz getrennt ist.

Eine Abstraktion ist ein Modell eines Systems. Sie listen oft eine Gruppe von Annahmen auf, die erfüllt sein müssen, damit ein reales System durch die Abstraktion modelliert werden kann, und sie werden oft verwendet, um es uns zu ermöglichen, immer komplizierter werdende Systeme zu konzipieren. Der Übergang von einem realen System zu einer Abstraktion hat dafür keine formale mathematische Methode. Das hängt vom Urteil ab, wer die Abstraktion definiert und was der Zweck der Abstraktion ist.

Oft werden Abstraktionen jedoch als mathematische Konstrukte definiert. Das liegt wahrscheinlich daran, dass sie in Wissenschaft und Technik so oft verwendet werden.

Ein Beispiel ist die Newtonsche Mechanik. Es wird davon ausgegangen, dass alles unendlich klein ist und alle Energie erhalten bleibt. Die Wechselwirkungen zwischen Objekten werden durch mathematische Formeln klar definiert. Wie wir wissen, funktioniert das Universum nicht ganz so, und in vielen Situationen tritt die Abstraktion durch. Aber in vielen Situationen funktioniert es sehr gut.

Ein weiteres abstraktes Modell sind typische lineare Schaltungselemente, Widerstände, Kondensatoren und Induktivitäten. Auch hier sind die Wechselwirkungen durch mathematische Formeln klar definiert. Für Niederfrequenzschaltungen oder einfache Relaistreiber und andere Dinge funktioniert die RLC-Analyse gut und liefert sehr gute Ergebnisse. Aber in anderen Situationen, wie Mikrowellenfunkkreisen, sind die Elemente zu groß und die Wechselwirkungen feiner, und die einfachen RLC-Abstraktionen halten nicht stand. Was zu diesem Zeitpunkt zu tun ist, hängt vom Urteil des Ingenieurs ab. Einige Ingenieure haben eine andere Abstraktion über die anderen erstellt, einige ersetzen ideale Operationsverstärker durch neue mathematische Formeln für ihre Funktionsweise, andere ersetzen ideale Operationsverstärker durch simulierte echte Operationsverstärker, die wiederum mit einem komplexen Netzwerk kleinerer Operationsverstärker simuliert werden ideale Elemente.

Wie andere gesagt haben, handelt es sich um ein vereinfachtes Modell. Es ist ein Werkzeug, um komplexe Systeme besser zu verstehen.

1
whatsisname

Programmierabstraktionen sind Abstraktionen, die von jemandem für ein programmatisches Element erstellt wurden. Nehmen wir an, Sie wissen, wie man ein Menü mit seinen Gegenständen und Dingen erstellt. Dann sah jemand diesen Code und dachte, hey, das könnte in anderen hireachy-ähnlichen Strukturen nützlich sein, und definierte das Component Design Pattern mit einer Abstraktion des ersten Codeteils.

Objektorientierte Entwurfsmuster sind ein gutes Beispiel für Abstraktion, und ich meine nicht die tatsächliche Implementierung, sondern die Art und Weise, wie wir uns einer Lösung nähern sollten.

Zusammenfassend ist Programmierabstraktion ein Ansatz, der es uns ermöglicht, ein Problem zu verstehen. Es ist das Mittel, um etwas zu bekommen, aber es ist nicht die Realität

0
guiman

Abstraktion ist für mich etwas, das es nicht "buchstäblich" gibt, es ist so etwas wie eine Idee. Wenn Sie es mathematisch ausdrücken, ist es nicht mehr abstrakt, weil Mathematik eine Sprache ist, um auszudrücken, was in Ihrem Gehirn passiert, damit es vom Gehirn eines anderen verstanden werden kann, sodass Sie Ihre Ideen nicht strukturieren können, denn wenn Sie dies tun, ist es keine Idee mehr: Sie müssten verstehen, wie ein Gehirn funktioniert, um ein Ideenmodell auszudrücken.

Abstraktion ist etwas, das es Ihnen ermöglicht, die Realität in etwas zu interpretieren, das von ihr unabhängig sein kann. Sie können einen Strand und einen Traum abstrahieren, aber der Strand existiert, aber der Traum nicht. Man könnte aber sagen, dass beide existieren, aber es ist nicht wahr.

Das Schwierigste an der Abstraktion ist es, einen Weg zu finden, sie auszudrücken, damit andere sie verstehen und in die Realität umsetzen können. Das ist die schwierigste Aufgabe, und sie kann nicht wirklich alleine erledigt werden: Sie müssen ein relatives Modell erfinden, das auf Ihren Ideen basiert und von jemand anderem verstanden werden kann.

Für mich sollte Abstraktion in Computersprache der Name sein, der das Modell "mathematisiert", es geht darum, Ideen wiederzuverwenden, die kommuniziert werden können, und es ist eine enorme Einschränkung im Vergleich zu dem, was abstrakt erreicht werden kann.

Einfach ausgedrückt, Atome sind nebeneinander, aber es ist ihnen egal. Eine große Anzahl von Molekülen, die in einem Menschen organisiert sind, kann verstehen, dass er neben jemandem ist, aber es kann nicht verstehen, wie, es ist nur, wie sich die Atome in einem Muster positioniert haben.

Ein Objekt, das von einem Konzept beherrscht wird, kann sich im Allgemeinen nicht "verstehen". Deshalb versuchen wir, an Gott zu glauben, und es fällt uns schwer, unser Gehirn zu verstehen.

Kann ich jetzt meine Medaille haben?

0
jokoon

Hier eine unmathematische Antwort:

Abtracting away in der Programmierung gibt vor, dass Sie sich jetzt nicht um die Details kümmern, während Sie dies tatsächlich tun und sich die ganze Zeit um sie kümmern sollten. Es tut im Grunde so.

0
mojuba

Interessante Frage. Ich kenne keine einzige Definition von Abstraktion, die für die Programmierung als maßgeblich angesehen wird. Obwohl andere Leute Links zu einigen Definitionen aus verschiedenen Zweigen der CS-Theorie oder Mathematik bereitgestellt haben; Ich denke gerne ähnlich wie "Supervenience", siehe http://en.wikipedia.org/wiki/Supervenience

Wenn wir über Abstraktion in der Programmierung sprechen, vergleichen wir im Wesentlichen zwei Beschreibungen eines Systems. Ihr Code ist eine Beschreibung eines Programms. Eine Abstraktion Ihres Codes wäre auch eine Beschreibung dieses Programms, jedoch auf einer "höheren" Ebene. Natürlich könnten Sie eine noch höhere Abstraktion Ihrer ursprünglichen Abstraktion haben (z. B. eine Beschreibung des Programms in einer Systemarchitektur auf hoher Ebene im Vergleich zur Beschreibung des Programms in seinem detaillierten Design).

Was macht nun eine Beschreibung "höher" als eine andere? Der Schlüssel ist "multiple Realisierbarkeit" - Ihre Abstraktion des Programms kann auf viele Arten in vielen Sprachen realisiert werden. Nun könnte man sagen, dass man auch mehrere Entwürfe für ein einziges Programm erstellen könnte - zwei Personen könnten zwei verschiedene übergeordnete Entwürfe erstellen, die beide das Programm genau beschreiben. Die Äquivalenz der Realisierungen macht den Unterschied.

Wenn Sie Programme oder Designs vergleichen, müssen Sie dies so tun, dass Sie die Schlüsseleigenschaften der Beschreibung auf dieser Ebene identifizieren können. Sie können auf komplizierte Weise sagen, dass ein Design einem anderen entspricht, aber der einfachste Weg, darüber nachzudenken, ist folgender: Kann ein einzelnes Binärprogramm die Einschränkungen beider Beschreibungen erfüllen?

Was macht also eine Beschreibungsebene höher als die andere? Angenommen, wir haben eine Beschreibungsebene A (z. B. Entwurfsdokumente) und eine andere Beschreibungsebene B (z. B. Quellcode). A ist eine höhere Ebene als B, denn wenn A1 und A2 zwei nicht äquivalente Beschreibungen auf Ebene A sind, müssen auch die Realisierungen dieser Beschreibungen, B1 und B2 auf Stufe B nicht äquivalent sein. Das Gegenteil gilt jedoch nicht unbedingt.

Wenn ich also kein einziges Binärprogramm erstellen kann, das zwei unterschiedliche Entwurfsdokumente erfüllt (d. H. Die Einschränkungen dieser Entwürfe würden sich widersprechen), muss der Quellcode, der diese Entwürfe implementiert, unterschiedlich sein. Wenn ich jedoch zwei Sätze von Quellcode nehme, die möglicherweise nicht in dasselbe Binärprogramm kompiliert werden könnten, könnte es dennoch vorkommen, dass die Binärdateien, die sich aus dem Kompilieren dieser beiden Sätze von Quellcode ergeben, beide dasselbe Design erfüllen dokumentieren. Somit ist das Designdokument eine "Abstraktion" des Quellcodes.

0
wahbedahbe