Ich bin noch ein Schüler in der High School (in der 10. Klasse) und ich muss noch einen Computerkurs in der Schule belegen. Alles, was ich bisher getan habe, ist durch Bücher. Diese Bücher haben mir Konzepte wie Vererbung beigebracht, aber wie hilft es, ein Programm in mehrere Klassen aufzuteilen? Die Bücher haben es mir nie erzählt.
Ich frage dies hauptsächlich wegen eines aktuellen Projekts. Es ist ein Arcade-Videospiel, ähnlich wie ein Flash-Spiel, wie es einige Leute gesagt haben (obwohl ich keine Ahnung habe, was ein Flash-Spiel ist). Die Sache ist, es ist nur eine Klasse. Mit nur einer Klasse funktioniert es einwandfrei (ein bisschen zeitverzögert). Also frage ich mich nur, wie es helfen würde, es in mehrere Klassen aufzuteilen.
Dieses Projekt war in Java und ich bin die einzige Person, die daran arbeitet.
quelle
Antworten:
Die einfachste Antwort lautet: Wenn Sie alles in eine Klasse einteilen, müssen Sie sich beim Schreiben von neuem Code um alles auf einmal kümmern. Dies mag für kleine Projekte funktionieren, aber für große Anwendungen (wir sprechen von Hunderttausenden von Zeilen) wird dies schnell so gut wie unmöglich.
Um dieses Problem zu lösen, teilen Sie Teile der Funktionalität in eigene Klassen auf und kapseln die gesamte Logik. Wenn Sie dann an der Klasse arbeiten möchten, brauchen Sie sich keine Gedanken darüber zu machen, was sonst noch im Code vor sich geht. Sie können sich nur auf dieses kleine Stück Code konzentrieren. Dies ist von unschätzbarem Wert für ein effizientes Arbeiten. Es ist jedoch schwer zu verstehen, ohne an Anwendungen zu arbeiten, die riesig sind.
Es gibt natürlich unzählige andere Vorteile, wenn Sie Ihren Code in kleinere Teile aufteilen: Der Code ist besser zu warten, besser zu testen, besser wiederzuverwenden usw. Aber für mich ist der größte Vorteil, dass er massive Programme verwaltbar macht, indem Sie die Menge an Code reduzieren müssen auf einmal darüber nachdenken.
quelle
Nun, die einfachste Antwort könnte lauten: "Es hilft, Dinge zu organisieren." Wenn nichts anderes, können Sie es mit Abschnitten in einem Notizbuch vergleichen - es ist einfach einfacher, wenn Sie "all das Zeug in Bezug auf die Benutzeroberfläche" hier und "all das Zeug in Bezug auf das Gameplay" dort haben.
Die differenziertere Antwort ist, dass die Aufteilung der Arbeit nicht nur bequem, sondern auch für das Management der Komplexität sehr wichtig ist (und "Komplexität managen" ist so ziemlich der Name des Spiels, wenn es um Programmierung geht). Mit Klassen oder anderen Modultypen können Sie "Bedenken trennen". Sie wissen nicht nur, wo Sie nach "Informationen zur Benutzeroberfläche" suchen müssen, sondern können auch sicher sein, dass Sie Änderungen an der Benutzeroberfläche nur an einer Stelle vornehmen können, ohne dass dies erforderlich ist Sorge "Nun, ist das der einzige Ort, an dem ich meine Schrift auf Comic Sans eingestellt habe?". Und Sie können eine Änderung vornehmen und wissen, dass die Auswirkung dieser Änderung nur auf den (kleinen) Bereich zutrifft, der angemessen ist. Wenn sich alles in einer Klasse oder einem Modul befindet, ist im Wesentlichen alles global.
Im speziellen Fall von Klassen als eine Art Softwaremodul gibt es auch viele Verhaltensweisen, die mit einer Klasse verknüpft sind, und die meisten Entwickler im objektorientierten Paradigma finden es sehr hilfreich, aussagekräftige Namen mit den Klassen zu verknüpfen, die mit dieser Gruppe verknüpft sind funktioniert zusammen. Du hättest wahrscheinlich keine
UI
Klasse, du hättest wahrscheinlich eineButton
Klasse. Es gibt eine ganze Reihe von Kenntnissen und Techniken, die mit objektorientiertem Klassendesign verbunden sind, und es ist die gebräuchlichste Art, große Systeme in der Mainstream-Programmierung zu organisieren.quelle
Das ist eine gute Frage! Einfach und gut gefragt. Nun ... die Antwort ist für einen Studenten, der Informatik studiert und wahrscheinlich keine Ahnung hat und wahrscheinlich nicht an Erfahrung arbeitet, nicht so einfach zu verstehen.
Ich kann also antworten, indem ich ein Szenario beschreibe und Ihnen vorstelle, dass Software mit mehreren Klassen besser ist als monolithische Software (nur von einer Klasse erstellt):
quelle
Hier gibt es viele gute Antworten, denen ich definitiv zustimme, aber ich glaube, dass es etwas Erwähnenswerteres gibt.
Wie Sie bereits gesagt haben, arbeiten Sie derzeit alleine an Ihrem Projekt. In Zukunft wird es jedoch Zeiten geben, in denen Sie im Team arbeiten müssen. Während dieser Zeit werden Sie die Arbeit aufteilen (vermutlich ist das Projekt ziemlich groß). Infolgedessen gibt es einige (ich denke wirklich zwei Haupt- ) verschiedene Optionen. Sie können mehrere Kopien einer Datei haben und an separaten "Teilen" der Datei arbeiten und diese dann mit Kopieren und Einfügen später "kombinieren" und dann so ändern, dass Ihre Teile zusammenarbeiten können, oder Sie können diese "Teile" ganz aufteilen Gehen Sie einfach in verschiedene Klassen und besprechen Sie, wie Sie diese Klassen schreiben werden, und nutzen Sie dieses Wissen, um loszulegen.
Es wird noch viel Arbeit nötig sein, um alle Einzelteile zusammenzufügen, aber die Wartung wird viel einfacher. Da die x-Datei y-Code enthält und Sie wissen, dass Sie diesen Code ändern müssen. Dies geht in die Organisationssache ein, über die die meisten anderen Antworten sprechen.
Ein Programm im Kopf halten. Link von Giorgio
quelle
In der Tat haben Sie die prozedurale Programmierung neu erfunden. Wohlgemerkt, es ist durchaus möglich, Software auf diese Weise zu schreiben, und der Compiler kümmert sich wahrscheinlich nicht darum. Viele Jahre lang ging es so, bis Computer schneller und Werkzeuge besser wurden.
Das heißt, wenn Sie Ihren Code in verschiedene logische Einheiten (Klassen, Module usw.) aufteilen, können Sie viele kurze, leicht verständliche Codeteile haben. das kann später beibehalten werden. Viele meiner Module bestehen aus weniger als 20 Codezeilen. Ich weiß, dass sich der gesamte Code zu einem bestimmten Thema an einer bestimmten Stelle befindet. Dies bedeutet auch, dass es für andere viel einfacher ist, Dinge zu finden, wenn sie sich dem Projekt anschließen.
Wie Gerald Sussman sagte, sollten unsere Programme erstens geschrieben werden, damit die Leute sie lesen können, und zweitens, damit der Computer sie ausführen kann. (Und wenn Sie "Struktur und Interpretation von Computerprogrammen" noch nicht gelesen haben, sollten Sie)
quelle
Man verwendet mehrere Klassen, denn wenn man sich mit größeren Dingen beschäftigt, kann man einfach nicht alles im Auge behalten, wenn es sich um einen großen Haufen Code handelt.
Man muss sich einfach teilen und siegen, um damit umzugehen.
quelle
Objektorientierte Programmierung ist die beste Idee, die ich je in der Programmierung gesehen habe. Aber es ist nicht in allen Fällen das Beste, man braucht ein bisschen Programmiererfahrung, um den Sinn zu erkennen, und viele Leute behaupten, OOP zu machen, wenn sie es nicht sind.
Wenn Sie "strukturierte Programmierung" nachschlagen können, werden Sie wahrscheinlich sofort etwas Nützlicheres finden. (Vergewissern Sie sich, dass Sie sich mit der alten strukturierten Programmierung vertraut gemacht haben. Alte Begriffe erhalten oft neue, schickere Bedeutungen, und Sie brauchen noch nichts Besonderes.) Dies ist ein recht einfaches Konzept zum Aufteilen Ihres Programms in Unterprogramme, das viel einfacher ist als Zerlegen in Objekte. Die Idee ist, dass Ihr Hauptprogramm eine kurze Routine ist, die Unterprogramme ("Methoden" in Java) aufruft, um die Arbeit zu erledigen. Jedes Unterprogramm weiß nur, was es durch seine Parameter sagt. (Einer dieser Parameter könnte ein Dateiname sein, damit Sie ein wenig schummeln können.) Wenn Sie sich also die Überschrift einer Subroutine / Methode ansehen, erhalten Sie eine schnelle Vorstellung davon, was sie tut. macht fast auf einen Blick.
Dann werden alle Unterprogramme auf ähnliche Weise aufgeteilt, bis einige Codezeilen ohne Methodenaufrufe die Arbeit erledigen. Ein Hauptprogramm, das einige Methoden aufruft, von denen jede einige Methoden aufruft, von denen jede ... Bis auf kleine, einfache Methoden, die die Arbeit erledigen. Auf diese Weise können Sie jeden Teil eines sehr großen Programms (oder eines kleinen Programms) betrachten und schnell verstehen, was es tut.
Java wurde speziell für Leute entwickelt, die objektorientierten Code schreiben. Aber selbst das intensivste OO-Programm verwendet eine strukturierte Programmierung, und Sie können immer jede Sprache unterwandern. (Ich habe OO in Ebene C gemacht.) Sie können also SP oder alles andere in Java machen. Vergessen Sie den Unterricht und konzentrieren Sie sich auf große Methoden, die in kleine, überschaubare unterteilt werden können. Ich sollte hinzufügen, dass SP viel dazu beiträgt, dass Sie Ihren Code wiederverwenden können, und auch beim DRY-Prinzip (google es, aber es bedeutet "Don't Repeat Yourself").
Hoffentlich habe ich erklärt, warum und wie Sie Ihren Code in mehrere Teile aufteilen können, ohne "Klassen" einzufügen. Sie sind eine großartige Idee und genau das Richtige für Spiele und Java ist eine großartige Sprache für OOP. Aber es ist besser zu wissen, warum Sie das tun, was Sie tun. Lass OOP in Ruhe, bis es für dich einen Sinn ergibt.
quelle
Einer der Vorteile ist die Wiederverwendbarkeit. Ein Programm ist im Grunde eine Gruppe von Anweisungen, die zusammen gruppiert sind. Sie werden feststellen, dass einige dieser Anweisungen auch für andere Programme geeignet sind.
Nehmen wir an, Sie machen ein Springspiel. Später, wenn Sie sich für ein Kanonenspiel entscheiden, finden Sie hier die Physikberechnung, die Sie im Sprungspiel verwendet haben.
Anstatt es erneut zu schreiben oder, schlimmer noch, zu kopieren und in das neue Programm einzufügen, machen Sie es zu einer Klasse. Wenn Sie also das nächste Mal ein anderes Spiel machen, in dem die Spielmechanik Physik erfordert, können Sie es einfach wiederverwenden. Das ist natürlich stark vereinfacht, aber ich hoffe, es macht Sinn.
quelle
Beachten Sie zunächst, dass ich C ++ und Python und nicht Java bin, sodass einige davon möglicherweise nicht ganz so vollständig zutreffen. Bitte korrigieren Sie mich, wenn ich falsche Annahmen darüber mache, wie Klassen in Java funktionieren.
Klassen sind vor allem dann nützlich, wenn sie instanziiert werden. Eine Klasse, von der keine Instanzen erstellt werden, ist eigentlich nur ein verherrlichter Namespace. Wenn Sie alle Ihre Klassen auf diese Weise verwenden, können die Vorteile des Verschiebens von Dingen von Namespace zu Namespace unwesentlich erscheinen. Sie gewinnen höchstens, wenn Sie jeweils private Daten enthalten und die Dinge dadurch ein wenig kapseln.
Dies ist jedoch nicht der Ort, an dem Klassen glänzen. Betrachten Sie die
String
Klasse: Mitchar
Arrays und einigen statischen Funktionen können Sie dieselben Funktionen verwenden . Zu diesem Zeitpunkt bieten Funktionen ein wenig mehr Sicherheit und syntaktischen Zucker. Sie könnenstring.length()
anstelle von schreibenlength(char_array)
; Das ist keine große Sache, aber viele Leute mögen es immer noch. Außerdem wissen Sie, dass, wenn Ihnen jemand eine gegeben hatString
, diese mit demString
Konstruktor erstellt wurde und mit derlength
Funktion funktionieren muss. Wenn die Array-Version kein Zeichen verarbeiten kann, kann sie Sie nicht daran hindern, sie dort einzutragen .Das ist es aber immer noch nicht. Der entscheidende Punkt ist, dass Klassen Daten und Funktionen bündeln, die darauf ausgeführt werden, und beide davon abstrahieren. Wenn Sie eine Methode haben, von der
void f(Builder b)
Sie wissen, dass Sie eine erhaltenBuilder
, und Sie können davon ausgehen, dass sie ein bestimmtes Verhalten unterstützt. Sie wissen jedoch nichts über Daten oder die auszuführenden Funktionen - tatsächlich sind die Definitionen für beide möglicherweise noch nicht geschrieben, während Sie schreiben und kompilierenf
.Der erste Punkt, den Sie verstehen sollten, ist, dass Klassen das Weitergeben von Daten vereinfachen und gleichzeitig sicherstellen, dass diese nicht beschädigt werden. Der zweite Punkt ist, dass sowohl die Daten als auch die Funktionen (Implementierungen) eines Objekts etwas mit dem Objekt zu tun haben und nicht nur anhand seines Typs zu erkennen sind.
quelle
Die ganze Idee basiert auf einer allgemeinen Regel namens Teilen und Erobern .
Dieses Paradigma kann fast überall angewendet werden; Sie unterteilen ein Problem in kleinere Probleme und lösen dann diese kleinen, einfachen und bekannten Probleme.
Die Aufteilung Ihres Programms in Klassen ist eine der Arten der Aufteilung, die im letzten Jahrzehnt üblich wurde. In diesem Programmierparadigma modellieren wir unser Problem anhand einiger Objekte und versuchen, das Problem zu lösen, indem wir Nachrichten zwischen diesen Objekten senden.
Einige Leute könnten sagen, dass dieser Ansatz leichter zu verstehen, zu erweitern und zu debuggen ist.
Obwohl einige Leute nicht einverstanden sind :)
quelle
Es geht nicht darum, ein Programm in Klassen aufzuteilen, sondern darum, wie Sie Ihre Anwendung modellieren, dh wie Sie Teile Ihrer Anwendung visualisieren. Das Teilen von Dingen ist nur ein Mechanismus, mit dem wir komplexe Dinge besser verstehen. Es geht nicht nur um Programmierung. Stellen Sie sich eine Leiterplatte mit vielen miteinander verwickelten Drähten vor, die eine komplexe Struktur bilden, wobei jeder Draht irgendwo angeschlossen wird (Spaghetti-Code). Sie müssen jedem Draht bis zu seinem Ende folgen, um die Verbindungen herauszufinden. Stellen Sie sich im Gegenteil Drähte vor, die entsprechend ihrer Funktion gruppiert und farblich gekennzeichnet sind. Es wird viel einfacher, Dinge zu reparieren.
Die Idee ist, dass Sie nicht mit einem langen Programm beginnen und es dann in Klassen aufteilen. Sie modellieren Ihre Anwendung jedoch zunächst anhand von Objekten / Klassen und verbinden sie dann, um Anwendungen zu erstellen.
quelle