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


62

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.


1
Um jedes Stück der Software einfacher zu machen! infoq.com/presentations/Simple-Made-Easy-QCon-London-2012
TehShrike

49
Wurden Ihre Bücher beim Lesen in Kapitel und Abschnitte unterteilt? Wir teilen ein Programm in Klassen auf, um Dinge zu organisieren, genauso wie Bücher Text in Kapitel aufteilen, um Dinge zu organisieren.
Riwalk

12
Die Römer pflegten zu sagen: divide et impera.
Giorgio

7
@Giorgio: oder auf Englisch, weil Latein nicht mehr so ​​gebraucht wird: Divide And Conquer .
Matthieu M.

40
Angenommen, Sie befinden sich in der zehnten Klasse und konnten bereits eine intelligente Frage formulieren, die alle Details enthält, die für gute Antworten erforderlich sind, den Kontext und Ihre relativen Erfahrungen sowie Hintergrundinformationen dazu, warum Sie die Frage stellen. Sie sind bereits qualifizierter als viele Leute, mit denen ich derzeit zusammenarbeite ...
CaffGeek

Antworten:


71

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.


7
Viele Konzepte / Ideen in der Programmierung (OO-Prinzipien, verteilte Quellcodeverwaltung, Codierungsstandards) sind nur dann wirklich sinnvoll, wenn Sie in einem Team an relativ großen Projekten arbeiten. Sie werden verstehen, warum, wenn Sie tatsächlich an solchen Projekten arbeiten.
Joshin4colours

40
Es ist erwähnenswert, dass gerade das Projekt Zerschlagung in mehrere Klassen / Dateien hilft nicht viel. Was wirklich wichtig ist, ist das Vorhandensein von eigenständigen Klassen, sodass für das Ändern einer Klasse keine weiteren Kenntnisse über das Programm erforderlich sind (und für die Verwendung der Klasse keine Kenntnisse über deren Implementierung erforderlich sind). Ich erwähne dies, weil ich häufig Code mit vielen Klassen sehe, aber ohne echte Kapselung. Kapselung ist der wichtige Teil - wie Sie es erreichen, ist nur Details.
Setzen Sie Monica am

2
Einige Schlüsselwörter wären "Koppeln" oder "Entkoppeln", "Einkapseln", "Verbergen von Informationen".
Marktani

@BrendanLong, ich stimme zu und ich werde auch hinzufügen, dass die Verkapselung fast unmöglich ist. Es sei denn, Sie schreiben natürlich separate Programme ... ABER es gibt normalerweise viele Teile, die nicht voneinander abhängen, sondern nur gemeinsame Abhängigkeiten haben
Jo So

29

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 UIKlasse, du hättest wahrscheinlich eine ButtonKlasse. 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.


12

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):

  • Lesbarkeit : Das Durchsuchen und Schreiben von Code in einer Datei mit 10000 Zeilen ist viel schwieriger als bei mehreren kleinen und organisierten Dateien.
  • Wiederverwendbarkeit : Wenn Sie eine einzelne Klasse schreiben, können Sie bei der Codeduplizierung ausrutschen . Das bedeutet mehr Codezeilen und wahrscheinlich mehr Bugs (!)
  • 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 Multiplikationsklassen an einem einzigen Ort verbessern: den netten kleinen Klassen.
  • Projektstruktur : Können Sie sich vorstellen, wie unschön ein Projekt mit nur einer Quelldatei aussehen wird?

Ich mag Ihre Antwort und habe gerade einige Änderungen vorgenommen (die noch einer Überprüfung durch Fachkollegen bedürfen). Ein Punkt, den ich vermisse, ist die einfachere Erkennung von Änderungen in Software-Versionssystemen wie SVN / GIT. Es ist auch einfacher, mit mehreren Programmierern gleichzeitig für ein Projekt zu arbeiten.
Martin Thoma

Ich würde sagen, dass die Trennung von Anliegen, Zusammenhalt und Entkopplung ein Konzept ist, das einen viel größeren Anwendungsbereich hat als die Disziplin der OOP. Imperative, logische und funktionale Programmierer bemühen sich gleichermaßen um eine hohe Kohäsion und eine niedrige Kopplung.
Sara

8

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


1
+1: Teamarbeit ist auch wichtig! Siehe z. B. paulgraham.com/head.html und den Absatz mit dem Titel "Es dürfen nicht mehrere Personen denselben Code bearbeiten."
Giorgio

@ Giorgio Ich habe es nur überflogen, aber es scheint eine großartige Ressource zu sein! Ich werde es einfach zu meiner Antwort hinzufügen, da manche Leute möglicherweise nicht in den Kommentaren nachsehen. Ich werde es auf jeden Fall einige Zeit gründlicher lesen.
Sephallia

Dies gilt auch für die Revisionskontrolle - das Arbeiten an separaten Dateien bedeutet weniger Konflikte und Zusammenführen.
Setzen Sie Monica am

7

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)


4

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.


3

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.


0

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.


0

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 StringKlasse: Mit charArrays und einigen statischen Funktionen können Sie dieselben Funktionen verwenden . Zu diesem Zeitpunkt bieten Funktionen ein wenig mehr Sicherheit und syntaktischen Zucker. Sie können string.length()anstelle von schreiben length(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 hat String, diese mit dem StringKonstruktor erstellt wurde und mit der lengthFunktion 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 erhalten Builder, 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 kompilieren f.

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.


0

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 :)


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.