Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

61

26.06.2012, 20:14

Zitat

Ich dachte das sei in dem letzten halben Dutzend Seiten klar geworden.

Das guter Code kaum Kommentare bedarf? Ja das ist mir klar und mir war es auch schon klar.

Zitat

Der Unterschied zwischen "bedarf keiner" und "darf keine enthalten" ist Dir scheinbar nicht bekannt.

Ist bekannt.
Aber daraus folgert unweigerlich, dass Code keine sinnvollen Kommentare keine enthalten darf, denn dann wäre er schlecht.

Zitat

Mein Code war eindeutig und verständlich auch ohne Kommentar

Aber er hätte nicht funktioniert, da er zb. das Einfügen von neuen Datensätzen nicht behandelt hat.

62

26.06.2012, 21:09

Unser Lehrer hat uns Punktabzug für unsere Projektarbeit gegeben, weil wir keine Kommentare im Quellcode hatten :|
Begründung: Komplexe Sachen bräuchten eine Erläuterung..


Ich hab mal versucht, meinen Code zu kommentieren, aber wenn er verständlich ist, erscheinen jegliche Kommentare ziemlich sinnlos und sogar störend.
Und wenn er es nicht ist, muss ja irgendwas im argen liegen..

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

63

26.06.2012, 21:15

Unser Lehrer hat uns Punktabzug für unsere Projektarbeit gegeben, weil wir keine Kommentare im Quellcode hatten :|

Lehrer... :rolleyes:

Wenn ich was in den letzten Jahren gelernt habe, dann dass Lehrer oft falsches unterrichten, weil sie selbst keine Ahnung haben, sich aber nicht berichtigen lassen, weil sie zu stolz sind.. ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

64

26.06.2012, 21:24

Herzliches Beileid. ^^
Wir haben zwar in der Schule eig. in der Regel leider nicht programmieren, aber dieses Verhalten von Lehrern ist mir durchaus nicht unbekannt.

Wenn der Leherer meint, es muss X und Y sein, dann muss es auch jeder so machen!
Und wehe dem, der es sich erdreistet etwas nicht exakt so zu tun wie es der Lehter anweist oder sogar seinen Kopf benutzt... X(

Und ganz ehrlich: Der Code denn man in der Schule durchnimmt ist sicher nicht wahnsinnig komplex.

65

26.06.2012, 21:26

Kann ich leider auch nur bestätigen. :S

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

66

26.06.2012, 22:22

Ach stellt euch nicht so an. Ihr habt die Lehrer nur alle falsch verstanden. Bei so dummen Fehlern können die das gar nicht ernst meinen. Die Leherer wollen ihren Unterricht doch nur etwas auflockern, indem sie zeigen wie man es nicht macht. Sogar das Staatsinstitut für Schulqualität und Bildungsforschung München propagiert diese Form des Unterrichts offenbar.

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * Schnittstelle des Kontrolleurs für die Oberfläche.
 * 
 * @author ISB-Arbeitskreis, Umsetzungshilfen Informatik 12
 * @version 1.0
 */

interface KONTROLLEURINTERFACE
{

    /**
     * Ausführen der Laufzeitmessungen.
     * @param anzahlElemente Anzahl der Knoten im Graphen
     * @param tiefe gibt an, ob mit Tiefensuche gesucht werden soll
     * @param dijkstra gibt an, ob nach Dijkstra gesucht werden soll
     */
    void WegesucheAusfuehren (int anzahlElement, boolean tiefe, boolean dijkstra);
    
    /**
     * Beendet das Programm.
     */
    void BeendenAusfuehren ();

}


Die einzige Klasse, die das KONTROLLEURINTERFACE implementiert.

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * Kontrolleur des Programms.
 * 
 * @author ISB-Arbeitskreis, Umsetzungshilfen Informatik 12
 * @version 1.0
 */
class KONTROLLEUR implements KONTROLLEURINTERFACE
{

    /* Die ereigniserzeugende Oberfläche */
    private OBERFLAECHENINTERFACE oberflaeche;
    
    /**
     * Besetzt das Attribut vor.
     */
    KONTROLLEUR ()
    {
        oberflaeche = null;
    }

    /**
     * Setzt die Oberfläche.
     * @param o die ereigniserzeugende Oberfläche
     */
    void OberflaecheSetzen (OBERFLAECHENINTERFACE o)
    {
        oberflaeche = o;
    }

    /**
     * Ausführen der Laufzeitmessungen.
     * @param anzahlElemente Anzahl der Knoten im Graphen
     * @param tiefe gibt an, ob mit Tiefensuche gesucht werden soll
     * @param dijkstra gibt an, ob nach Dijkstra gesucht werden soll
     */
    public void WegesucheAusfuehren (int anzahlElemente, boolean tiefe, boolean dijkstra)
    {
        Model. TESTSUCHEN test;
        oberflaeche. TiefenSuchzeitSetzen ("---");
        oberflaeche. DijkstraSuchzeitSetzen ("---");
        test = new Model. TESTSUCHEN (anzahlElemente);
        test. DurchschnittsTest (tiefe, dijkstra);
        if (tiefe)
        {
            oberflaeche. TiefenSuchzeitSetzen ("" + test. ZeitFuerTiefensucheGeben ());
        }
        if (dijkstra)
        {
            oberflaeche. DijkstraSuchzeitSetzen ("" + test. ZeitFuerDijkstraGeben ());
        }
        
    }
    
    /**
     * Beendet das Programm.
     */
    public void BeendenAusfuehren ()
    {
        System. exit (0);
    }
}


Leider kann ich hier nicht das ganze Projekt posten, da das "Unterrichts-Material" auf 6 bluej Projekte verteilt ist und ich Angst habe, dass entweder jemand einen tödlichen Lachanfall oder einen bleibenden Gehirnschaden erleidet. Dieses wunderbare Werk aus dem bayrischen Bildungssystem, in welchem in diesem Jahr ganze 10% durch die schriftlichen Abiturprüfungen gefallen sind (manche Schüler sind eben dem revolutionären Unterrtichtsstil der Lehrer nicht gewachsen), dient der Einführung in die Laufzeitkomplexität von Algorithmen.
Zunächst weist das Institut auf die Wichtigkeit von wiederverwendbaren Code hin, indem über 6 Projekte (Sortieren, Sortieren_ZaehIen, Suchen, Suchen_Zaehlen, Wegesuche, Wegesuche_Zaehlen) hinweg redundante Implementierungen, einer Messumgebung, mit stümperhatft implementierten GUI, in einer vollkommen überflüssigen, unlogischen Pakethierarchie präsentiert wird. Durch die Verwendung von uneinheitlichen Zeilenumbrüchen (LF/CRLF) werden die Schüler auf die unterschiedlichen Codierungen bei gängigen Betriebssystemen hingewiesen. Da die Projekte auch noch über eine uneinheitliche Codierung von Umlauten verfügen, wird den Schülern das Unicode Konzept klar gemacht. Indem sich die Autoren konsequent über etablierte Konventionen (Formatierung/Bennennung) hinwegsetzen, wird den Schülern auch klar wie stark der diese Konventionen den Lesefluss erhöhen. Durch Kommentieren und Dokumentieren, von banalen Methoden und an Unnötigkeit nicht zu übertreffenden Softwarekonstrukten wird noch einmal klar, dass diese Projekte einfach nicht ernst gemeint sein können. Auch ist in die Projekte stundenlanger Rätselspaß integriert, so beendet sich das Programm zwar über einen überflüssigen Button, läuft aber im Hintergrund weiter wenn man das Fenster über das Kreuz beenden möchte. Zudem werden konsequent alle Swing-Objekte nicht im EDT erzeugt, da das Programm so natürlich nicht Threadsicher ist werden gleich noch einmal wichtige Grundlagen aus der vorhergehenden Lehreinheit "Nebenläufigkeit" wiederholt. Ich könnte noch stundenlang über die ausgeklügelten Feinheiten, die sich in diesem Projekt verstecken schreiben, aber es sollen schließlich auch noch nachfolgende Schülergenerationen Spaß an den vielen Rätselaufgaben haben.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

67

26.06.2012, 22:26

Aber daraus folgert unweigerlich, dass Code keine sinnvollen Kommentare keine enthalten darf, denn dann wäre er schlecht.
Diese Schlussfolgerung war schon auf Seite 3 falsch und sie ist noch immer falsch.
Wenn aus: "Es regnet." folgt, dass "der Hund nass ist", dann folgt aus: "Der Hund ist nass." nicht automatisch, dass "es regnet". Auch das hatte ich formal schon einmal geschrieben.


Aber er hätte nicht funktioniert, da er zb. das Einfügen von neuen Datensätzen nicht behandelt hat.
Das hat meine zweite Variante sehr wohl. :)


Zitat von » foreach«


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    /* Die ereigniserzeugende Oberfläche */
    private OBERFLAECHENINTERFACE oberflaeche;

...
 
    /**
     * Beendet das Programm.
     */
    public void BeendenAusfuehren ()
    {
        System. exit (0);
    }
    

Bei genau solchen Kommentaren bekomme ich Schmerzen. Bei "System.exit(0)" aber noch mehr.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

68

26.06.2012, 22:43

Zitat

Diese Schlussfolgerung war schon auf Seite 3 falsch und sie ist noch immer falsch.

Sie ist es noch immer nicht.
Du wirst doch jetzt nicht deine eigenen Aussagen verleugnen.
Du schriebst "guter Code bedarf keiner Kommentare".
Wenn man also einen Kommentar sinnvoll einsetzten kann, ist der Code nicht gut (genug).
Das heißt, dass Code keine sinnvollen Kommentare keine enthalten darf, denn dann wäre er schlecht.

Zitat

Das hat meine zweite Variante sehr wohl. :)

Hilfst du meinen Gedächtnis ein wenig auf die Sprünge? :)
Mir fällt gerade keine 2. Variante von dir ein.

Zitat

Bei genau solchen Kommentaren bekomme ich Schmerzen.

Ja, ist wirklich schlimm.

Hat zwar damit nicht direkt zu tun, aber die Leerzeichensetztung und Klassendgroßschreibung ist auch mehr als fragwürdig.
Das ist jedenfals keiner der normalen "Standards".

Aber der Code ist ja sowieso ein wenig, na ja, "fragwürdig".

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

69

27.06.2012, 00:24

Ein Punkt der hier etwas vernachlässigt wird ist glaube ich der eig schon angesprochene Optimierungspunkt. Außerdem sehe ich noch nicht so ganz wo nun der große Unterschied zwischen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
            //removing the old entry
            while(ret.first != ret.second)
            {
                if(ret.first->second.first == x && ret.first->second.first == y)
                {
                    open.erase(ret.first);
                    break;
                }
                ret.first++;
            }

und

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
            remove_entry(ret);
[...]
void remove_entry(std::pair<open_container::iterator,open_container::iterator> ret)
{
    while(ret.first != ret.second)
    {
        if(ret.first->second.first == x && ret.first->second.first == y)
        {
            open.erase(ret.first);
            break;
        }
        ret.first++;
    }
}

sein soll (wenn man diesen Code echt nur einmal braucht). Wo genau ist der große Vorteil? Und es soll hier nicht um den Algo ansich oder Benennungen gehen sondern nur um den großen Unterschied. Ich sehe da nur eine zusätzliche Funktion und ein Kommentar was im Prinzip nur in einen Funktionsnamen umgewandelt wurde. Dieser Beispielabschnitt wird nur an einer Stelle im Code gebraucht! Wozu also das Kommentar in einen Funktionsnamen umwandeln?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

70

27.06.2012, 06:56

Zitat

Diese Schlussfolgerung war schon auf Seite 3 falsch und sie ist noch immer falsch.

Sie ist es noch immer nicht.
Du wirst doch jetzt nicht deine eigenen Aussagen verleugnen.
Du schriebst "guter Code bedarf keiner Kommentare".
Wenn man also einen Kommentar sinnvoll einsetzten kann, ist der Code nicht gut (genug).
Bis hier hin ist es richtig.

Das heißt, dass Code keine sinnvollen Kommentare keine enthalten darf, denn dann wäre er schlecht.
Und diese Schlussfolgerung ist falsch. Du musst dringend den Unterschied zwischen "nicht dürfen" und "nicht brauchen" lernen.

Hat zwar damit nicht direkt zu tun, aber die Leerzeichensetztung und Klassendgroßschreibung ist auch mehr als fragwürdig.
Das ist jedenfals keiner der normalen "Standards".
Es gibt keinen Standard. Was Du da siehst ist ein Pseudo-Mix aus dem, wie ich Java schreiben muss und dem, wie ich C# schreibe. Aber die Formatierung ist ja wohl eindeutig meine Sache :)

Ein Punkt der hier etwas vernachlässigt wird ist glaube ich der eig schon angesprochene Optimierungspunkt. Außerdem sehe ich noch nicht so ganz wo nun der große Unterschied zwischen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
            //removing the old entry
            while(ret.first != ret.second)
            {
                if(ret.first->second.first == x && ret.first->second.first == y)
                {
                    open.erase(ret.first);
                    break;
                }
                ret.first++;
            }

und

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
            remove_entry(ret);
[...]
void remove_entry(std::pair<open_container::iterator,open_container::iterator> ret)
{
    while(ret.first != ret.second)
    {
        if(ret.first->second.first == x && ret.first->second.first == y)
        {
            open.erase(ret.first);
            break;
        }
        ret.first++;
    }
}

sein soll (wenn man diesen Code echt nur einmal braucht). Wo genau ist der große Vorteil?

Es gibt keinen, beide Varianten sind schlecht. Die zweite vor allem auch deswegen, weil "x", "y" und "open" plötzlich auftauchen, ohne dass man weiß woher. Statt der While-Schleife wäre eine "Search"-Methode sinnvoll und statt dem doch etwas kuriosen Bedingung wäre ebenfalls eine entsprechende Match-Methode angebracht. Wer sich da Sorgen um die Performance macht, dem sei gesagt, dass das ein guter Compiler (VC, gcc, g++) ohnehin wieder wegoptimiert. Wichtig für einen Programmierer sollte nie die Frage nach dem inlining sein, sondern nach der Komplexität des Algorithmus (hier O(n)) und der Lesbarkeit des Codes sein.
Der Code sollte also in etwa so aussehen - nicht maulen, wenn was nicht ganz passt, ich hab' grad wenig Zeit. Das Prinzip sollte aber klar sein - Code lesbar machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void remove_entry(open_container::iterator start, open_container::iterator end, open_container open)
{
    open_container::iterator* match = find(start, end);
    if (match)
        open.erase(match);
}

open_container::iterator* find(open_container::iterator start, open_container::iterator end)
{
    for ( ; start != end; start++;)
    {
        if (matches(start, x, y)) // x und y sollten Konstanten sein oder übergeben an find werden, ich war hier schlicht zu faul
            return start;
    }
}
bool matches(std::pair<open_container::iterator possibleMatch, open_container x, open_container y)
{
    return possibleMatch->second.first == x && possibleMatch->second.first == y;
}


PS: Es würde sich hier übrigens lohnen alle diese Funktionen aus der ursprünglichen Klasse auszulagern, da hier eindeutig "lack of cohesion" vorläge.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (27.06.2012, 07:08)


Werbeanzeige