it-swarm.com.de

Warum ist es gut, ein Programm in mehrere Klassen aufzuteilen?

Ich bin noch ein Schüler in der High School (Eintritt in die 10. Klasse) und muss noch einen tatsächlichen 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 einige Leute gesagt haben (obwohl ich keine Ahnung habe, was ein Flash-Spiel ist). Die Sache ist, es ist nur eine Klasse. Es funktioniert einwandfrei (ein wenig gelegentlich jedoch verzögert) mit nur einer Klasse. Ich frage 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).

62
kullalok

Die einfachste Antwort ist, dass Sie sich beim Schreiben von neuem Code um alles auf einmal kümmern müssen, wenn Sie alles in eine Klasse einordnen. 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 ihre eigenen Klassen auf und kapseln die gesamte Logik. Wenn Sie dann an der Klasse arbeiten möchten, müssen Sie nicht darüber nachdenken, was sonst noch im Code vor sich geht. Sie können sich nur auf diesen kleinen Code konzentrieren. Dies ist von unschätzbarem Wert, um effizient zu arbeiten. Es ist jedoch schwer zu verstehen, ohne an riesigen Anwendungen zu arbeiten.

Natürlich gibt es unzählige andere Vorteile, wenn Sie Ihren Code in kleinere Teile zerlegen: Der Code ist wartbarer, testbarer, wiederverwendbarer usw., aber für mich ist der größte Vorteil, dass er massive Programme verwaltbar macht, indem er die Menge an Code reduziert, die Sie verwenden müssen auf einmal nachdenken.

71
Oleksi

Nun, die einfachste Antwort könnte sein: "Es hilft, Dinge zu organisieren." Wenn nichts anderes, können Sie es mit Abschnitten in einem Notizbuch vergleichen - es ist einfach einfacher, wenn Sie hier "alles, was mit der Benutzeroberfläche zu tun hat" und "alles, was mit dem Gameplay zu tun hat".

Die differenziertere Antwort lautet, dass die Aufteilung der Arbeit nicht nur bequem, sondern auch sehr wichtig für das Management der Komplexität ist (und "Komplexität verwalten" ist so ziemlich der Name des Spiels, wenn es um die 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 Sie 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 nur Ort, an dem ich meine Schriftart auf Comic Sans gesetzt habe?". Und Sie können eine Änderung vornehmen und wissen, dass sich diese Änderung nur auf den (kleinen) Umfang auswirkt, der angemessen ist. Wenn sich alles in einer einzelnen Klasse oder einem Modul befindet, ist im Wesentlichen alles global, und das macht es sehr schwierig, darüber nachzudenken.

Im speziellen Fall von Klassen als eine Art Softwaremodul gibt es auch viel Verhalten, das mit einer Klasse verbunden ist, und die meisten Entwickler im objektorientierten Paradigma finden es sehr hilfreich, aussagekräftige Namen mit den Klassen zu verknüpfen, die sich auf Gruppen beziehen funktioniert zusammen. Sie hätten also wahrscheinlich keine UI Klasse, wahrscheinlich eine Button Klasse. Es gibt eine ganze Reihe von Kenntnissen und Techniken, die mit objektorientiertem Klassendesign verbunden sind, und es ist die häufigste Art, große Systeme in der Mainstream-Programmierung zu organisieren.

29
Larry OBrien

Das ist eine gute Frage! Einfach und gut gefragt. Nun ... die Antwort ist nicht so einfach zu verstehen für einen Studenten, der Informatik studiert und wahrscheinlich nicht genau weiß OO] und wahrscheinlich keine Erfahrung hat.

Ich kann also antworten, indem ich ein Szenario beschreibe und Ihnen vorstelle, wie Software mit mehreren Klassen besser ist als monolithische Software (nur von einer Klasse erstellt):

  • Lesbarkeit : Es ist viel schwieriger, Code in einer Datei mit 10000 Zeilen zu durchsuchen und zu schreiben als mehrere kleine und organisierte Dateien.
  • Wiederverwendbarkeit : Wenn Sie eine einzelne Klasse schreiben, können Sie in Codeduplizierung ausrutschen. Dies bedeutet mehr Codezeilen und wahrscheinlich mehr Fehler (!)
  • Testbarkeit : Was ist mit dem Testen einer einzelnen Funktionalität? Wenn Sie eine Logikfunktionalität in einer Klasse isolieren, wird Ihr Leben einfacher.
  • Code-Wartbarkeit : Sie können einen Fehler beheben oder die Funktionalität mit Multiplie-Klassen an einem einzigen Ort verbessern: Die netten kleinen Klassen.
  • Projektstruktur : oooooh können Sie sich vorstellen, wie hässlich ein Projekt mit nur einer Quelldatei erscheint?
12
AngeloBad

Hier gibt es viele gute Antworten, und ich stimme ihnen definitiv zu, aber ich denke, dass es etwas Erwähnenswerteres gibt.

Im Moment arbeiten Sie, wie Sie sagten, alleine an Ihrem Projekt. In Zukunft wird es jedoch Zeiten geben, in denen Sie in einer Teamumgebung arbeiten müssen. Während dieser Zeit werden Sie die Arbeit aufteilen (vermutlich wird das Projekt ziemlich groß sein). 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 später mit Kopieren und Einfügen "kombinieren" und dann so ändern, dass Ihre Teile zusammenarbeiten können, oder Sie können diese "Teile" ganz aufteilen leicht in verschiedene Klassen und diskutieren , wie Sie diese Klassen schreiben werden, und nutzen Sie dieses Wissen, um loszulegen.

Es wird noch Arbeit geben müssen, um alle Einzelteile zusammen zu integrieren, aber es wird viel einfacher zu warten sein. Weil 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

8
Sephallia

Tatsächlich haben Sie die prozedurale Programmierung neu erfunden. Wohlgemerkt, es ist durchaus möglich, Software auf diese Weise zu schreiben, und der Compiler wird sich wahrscheinlich nicht darum kümmern. Viele Jahre lang wurde so vorgegangen, bis die Computer schneller und die Werkzeuge besser wurden.

Wenn Sie Ihren Code jedoch 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 einem bestimmten Ort befindet. Es bedeutet auch, dass jemand anderes, der sich dem Projekt anschließt, viel leichter Dinge finden kann.

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 noch nicht "Struktur und Interpretation von Computerprogrammen" gelesen haben, sollten Sie)

7
Zachary K

Man verwendet mehrere Klassen, weil man bei größeren Dingen einfach nicht alles im Auge behalten kann, wenn es sich um einen großen Stapel Code handelt.

Man muss sich nur teilen und erobern, um damit fertig zu werden.

4
Loren Pechtel

Objektorientierte Programmierung ist die beste Idee, die ich je in der Programmierung gesehen habe. Aber es ist nicht in allen Fällen das Beste. Sie benötigen ein wenig Programmiererfahrung, um den Sinn zu erkennen, und viele Leute behaupten, dies zu tun OOP, wenn sie es nicht sind .

Wenn Sie "strukturierte Programmierung" nachschlagen können, werden Sie wahrscheinlich etwas sofort Nützlicheres finden. (Stellen Sie sicher, dass Sie über alte strukturierte Programmierung lesen. Alte Begriffe erhalten oft neue, schickere Bedeutungen, und Sie brauchen noch nichts Besonderes.) Dies ist ein ziemlich einfaches Konzept, um Ihr Programm in Unterprogramme zu unterteilen , was viel einfacher ist, als es in Objekte zu zerlegen. 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 kann ein Dateiname sein, damit Sie ein bisschen schummeln können.) Wenn Sie sich also die Überschrift einer Unterroutine/Methode ansehen, erhalten Sie eine schnelle Vorstellung davon, was sie tut, und wissen, was die Methoden im Hauptprogramm zulassen Sie sehen, was it fast auf einen Blick tut.

Dann werden alle Unterprogramme auf ähnliche Weise aufgeschlüsselt, bis einige Codezeilen ohne Methodenaufrufe den Job 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 kleinen Programms) betrachten und schnell verstehen, was es tut.

Java wurde speziell für Benutzer entwickelt, die objektorientierten Code schreiben. Aber selbst das intensivste OO Programm verwendet eine strukturierte Programmierung, und Sie können immer jede Sprache untergraben. (Ich habe OO in einfachem C.) Also können Sie Machen Sie SP oder irgendetwas anderes in Java. Vergessen Sie Klassen und konzentrieren Sie sich auf große Methoden, die in kleine, überschaubare Methoden unterteilt werden können. Ich sollte hinzufügen, dass SP viel dazu beiträgt, dass Sie Ihre wiederverwenden können Code und auch mit dem Prinzip DRY (google it, 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" einzubringen. 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. Lassen Sie OOP in Ruhe), bis es für Sie einen Sinn ergibt.

3
RalphChapin

Einer der Vorteile ist die Wiederverwendbarkeit. Ein Programm besteht im Grunde aus einer Reihe von Anweisungen, die in Gruppen zusammengefasst sind. Sie werden feststellen, dass einige dieser Anweisungen auch für andere Programme geeignet sind.

Angenommen, Sie machen ein Springspiel. Wenn Sie sich später für ein Kanonenspiel entscheiden, werden Sie feststellen, dass die im Springspiel verwendete Physikberechnung hier nützlich ist.

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 erstellen, bei dem die Spielmechanik Physik erfordert, können Sie es einfach wiederverwenden. Natürlich ist das zu stark vereinfacht, aber ich hoffe, es macht Sinn.

0
gorengpisang

Es geht nicht darum, ein Programm in Klassen aufzuteilen, sondern darum, wie Sie Ihre Anwendung modellieren, d. H. 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 die Programmierung. Stellen Sie sich eine Leiterplatte mit vielen miteinander verwickelten Drähten vor, die eine komplexe Struktur bilden, wobei jeder Draht irgendwo verbunden ist (Spaghetti-Code). Sie müssen jedem Draht bis zum Ende folgen, um die Verbindungen herauszufinden. Stellen Sie sich im Gegenteil Drähte vor, die entsprechend ihrer Funktion gruppiert und farbcodiert 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 zuerst anhand von Objekten/Klassen und verbinden sie dann, um Anwendungen zu erstellen.

0
Vamsi

Beachten Sie zunächst, dass ich C++ und Python bin, nicht Java, 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 wirklich nur ein verherrlichter Namespace. Wenn Sie alle Ihre Klassen auf diese Weise verwenden, scheinen die Vorteile des Verschiebens von Dingen von Namespace zu Namespace in der Tat unbedeutend zu sein - höchstens gewinnen Sie, indem Sie einige private Daten in jeder haben und dadurch die Dinge ein wenig kapseln.

Hier leuchten jedoch keine Klassen. Betrachten Sie die Klasse String: Mit char Arrays und einigen statischen Funktionen können Sie dieselben Funktionen verwenden. An diesem Punkt geben Ihnen Funktionen ein wenig mehr Sicherheit und syntaktischen Zucker. Sie können string.length() anstelle von length(char_array) schreiben; Das ist keine große Sache, aber viele Leute mögen es immer noch. Außerdem wissen Sie, dass wenn Ihnen jemand ein String gegeben hat, es mit dem Konstruktor String erstellt wurde und dass es mit der Funktion length funktionieren muss - wenn die Array-Version dies kann Wenn Sie mit einem Charakter nicht umgehen, kann er Sie nicht daran hindern, ihn dort abzulegen.

Das ist es aber immer noch nicht. Der entscheidende Punkt ist, dass Klassen Daten und Funktionen, die darauf arbeiten, bündeln und beide weg abstrahieren. Wenn Sie eine Methode void f(Builder b) haben, wissen Sie, dass Sie eine Builder erhalten, und Sie können erwarten, dass sie ein bestimmtes Verhalten unterstützt. Sie wissen jedoch nichts über Daten oder die ausgeführten Funktionen - tatsächlich werden die Definitionen für beide möglicherweise noch nicht geschrieben, während Sie f schreiben und kompilieren.

Der erste zu verstehende Punkt ist daher, dass Klassen es bequem machen, Daten weiterzugeben und gleichzeitig sicherzustellen, dass sie nicht beschädigt werden. Der zweite Punkt ist, dass sowohl die Daten als auch die Funktion (Implementierungen) eines Objekts etwas mit dem Objekt zu tun haben und nicht nur anhand seines Typs.

0
Anton Golov

Die ganze Idee basiert auf einer allgemeinen Regel namens Teilen und Erobern .
Dieses Paradigma kann fast überall verwendet werden; Sie teilen ein Problem in kleinere Probleme auf 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 wurden. In diesem Programmierparadigma modellieren wir unser Problem anhand einiger Objekte und versuchen, das Problem durch Senden von Nachrichten zwischen diesen Objekten zu lösen.
Einige Leute könnten sagen, dass dieser Ansatz leichter zu verstehen, zu erweitern und zu debuggen ist.
Obwohl einige Leute nicht einverstanden sind :)

0
Rsh