Verbesserungsvorschläge für FAQ-Artikel "Public-Variablen sind böse"



  • @junix: Aber dein Text in den FAQs ist gut für Anfänger, oder wie? 🙄

    [edit="junix"]Es handelt sich dabei um folgenden Beitrag:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39302&start=0&postdays=0&postorder=asc&highlight= [/edit]



  • Plemplem schrieb:

    @junix: Aber dein Text in den FAQs ist gut für Anfänger, oder wie? 🙄

    Er sollte es sein. Ist er es nicht, so bin ich für Vorschläge offen wie man ihn besser gestalten kann.

    Eigentlich war der Artikel allerdings eher dazu gedacht, den "fortgeschrittenen Anfängern und fortgeschrittenen Programmieren" die mit Pub. Variablen hantieren zu erklären was genau das Problem mit den Dingern ist...

    Es muss ja auch nicht alles auf Anhieb verstanden werden (das eine oder andere Verständnis ergibt sich vielleicht erst mit der wachsenden Erfahrung), trotzdem sollte man solche fragwürdigen Methoden wie pub. Variablen keines Falls an Anfänger weitergeben. Anfänger sind schlicht durch die mangelnde Erfahrung und dem fehlenden Wissen um Zusammenhänge nicht fähig verlässlich zu urteilen ob eine Pub. Variabeln in diesem einen Zusammenhang nun gut oder böse ist. Deshalb gilt grundsätzlich: Public-Variablen sind böse. Damit bewegt man sich auf der sicheren Seite. Und die Sichere seite ist doch auch die die man einem Anfänger beibringen sollte. Die schmutzigen Tricks lernt er von alleine...

    -junix



  • Hmm... Vorschläge zur besseren Gestaltung... zählt "Häh?" auch? 😉

    Ich verwende ja auch gut und gerne die Public-Variablen. Schließlich sind die ja so schön einfach! Aber da die ja bächtig mö- *räusper* böse sind, habe ich jetzt mal das Property-Kapitel gewälzt. Jetzt freue ich mich zwar, dass ich Schreib-/Lesefunktion basteln kann (...eigentlich weiß ich gar nicht, warum mich das freut 😕 ), nur warum das nun besser sein soll, raffe ich nicht. Gut, man kann sozusagen Variablen Read-Only machen. Aber das meintest du ja nicht. Nun gut, ich werde einfach den FAQ-Eintrag noch ein paar mal durchlesen, vielleicht wird es mir ja (irgendwann in ferner Zukunft :p ) mal klar.



  • Ich will mal mein "Häh?" ein wenig genauer beschreiben. (Hoffentlich gerate ich dadurch nicht zu weit OT)

    zu Beispiel 1: Man ändert eine Klassenvariable in eine Liste. Auch dem Property müsste man ne Liste zuweisen. Ausser: In der mit dem "read"-Teil des Property verknüpften Methode wird ein übergebener String in die Liste eingefügt. Hättest du dann aber erwähnen können (müssen?).

    zu Beispiel 2: Wer würde den char-Zeiger öffentlich machen? Ich würde ihn ja gleich private lassen...

    zu Beispiel 3: Wenn der Thread unterbrochen wird: Wo ist dann der Unterschied, obs nun ein Property oder eine public-Variable trifft?

    Ok, ich bin OT. Sorry. 🙂



  • Ich werde gen Abend darauf eingehen, wenns recht ist. Im MOment bin ich grad etwas knapp in der Zeit...



  • Na klar isses recht! Ich freu mich eh schon, dass du das ernst nimmst.



  • Ähm... Was iost an public-variablen so schlimm?



  • Lies doch mal den Artikel in der FAQ von junix, um den es hier geht 🙂



  • PuppetMaster2k schrieb:

    Lies doch mal den Artikel in der FAQ von junix, um den es hier geht 🙂

    Du weisst doch, er beschränkt sich lieber auf Bashing und trotziges "meine Lösung ist besser" getue (o; Wird wohl am Alter liegen (o;

    Plemplem schrieb:

    Ich freu mich eh schon, dass du das ernst nimmst.

    Selbstverständlich nehme ich (qualifizierte) Kritik ernst! Ich investiere die Zeit in meine Artikel und Tutorien ja nicht damit ich die Dinger in die Tonne kloppen kann, weil sie keiner lesen will...
    Die Dinger sollen helfen und zum Verständnis beitragen. Leider erhalte ich nur äusserst selten ein Feedback (obwohl ausdrücklich gewünscht in den Tutorien) und wenn dann keine Kritik sondern nur Lob. (Ist zwar auch schön aber hilft nicht wirklich (o; )
    Ich möchte ja schliesslich auch wissen, ob mein Ansatz für die Tutorien richtig ist...

    Aber zur Sache:

    Plemplem schrieb:

    zu Beispiel 1: Man ändert eine Klassenvariable in eine Liste. Auch dem Property müsste man ne Liste zuweisen. Ausser: In der mit dem "read"-Teil des Property verknüpften Methode wird ein übergebener String in die Liste eingefügt. Hättest du dann aber erwähnen können (müssen?).

    Du hast es begriffen. Ja, ich hätte es wohl besser noch erwähnt. Es ist schon genau so wie du sagst: Die Set-Methode würde den Wert dann quasi über die Add-Methode der Liste hinzufügen, die Get-Methode würde das letzte Element zurückgeben und eine neue Methode "getHistory" würde eine Liste von werten zurückliefern... (ich hoffe ich habe das so brauchbar erklärt)

    Plemplem schrieb:

    zu Beispiel 2: Wer würde den char-Zeiger öffentlich machen? Ich würde ihn ja gleich private lassen...

    Voilà. Es war auch nur ein konstruiertes Beispiel. Aber was wäre da z.B. wenn man den char-Pointer direkt manipulieren würde? Nicht über die Zugriffsfunktionen?

    Plemplem schrieb:

    zu Beispiel 3: Wenn der Thread unterbrochen wird: Wo ist dann der Unterschied, obs nun ein Property oder eine public-Variable trifft?

    Wenn man über die Zugriffsfunktion zugreift, hat man die Möglichkeit die Unterbrechung des Threads zu verhinden (CriticalSections). Es handelt sich dabei um ein klassisches Synchronisationsproblem:

    Gegeben sind zwei Threads:
    A und B

    beide greifen auf die gemeinsame Resource "i" zu, beide zählen diese Resource hoch. (i += 10) Der Compiler macht aus i++ nicht nur eine Anweisung sondern vielleicht 3:

    1: mov ax,[i]
    2: add ax,10
    3: mov [i],ax
    

    Ohne CS kann nun folgendes passieren:

    • Angenommen i ist 10.
    • THread A führt Zeile 1 aus und wird darauf unterbrochen.
    • Im Register ax steht für Thread A nun 10.
    • In i steht ebenfalls 10.
    • Nun wird Thread B ausgeführt.
    • Thread B wird ausgeführt
    • B lädt ebenfalls 10 nach ax (1)
    • addiert 10 auf ax (2) (ax == 20)
    • und weist i nun den Inhalt von ax zu (i == 20)
    • B ist nun durchgelaufen und A wird wieder ausgeführt.
    • In ax für A steht nach wie vor 10.
    • Auf ax wird nun 10 aufaddiert ax == 20)
    • i wird der Inhalt von ax zugewiesen. (i == 20)

    Aber eigentlich müsste i zum Schluss doch jetzt aber 30 sein?
    Ein Synchronisationsproblem... Critical Sections ist eine Art Markierung für Codestellen die einander nicht unterbrechen dürfen. Eine Solche Markierung lässt sich aber nur durch Funktionsaufrufe erreichen. Set- und Get- Methoden.... klingelts?

    Ich hoffe auch damit etwas Klarheit gebracht zu haben. etwas wirr ich weiss. Aber ich bin etwas müde. Wenn dus verstanden hast, würde es mich freuen, wenn du versuchst die Ergänzungen passend zu formulieren...
    Wenn etwas nicht klar sein sollte: Ungeniert nachfragen!

    -junix



  • junix schrieb:

    Leider erhalte ich nur äusserst selten ein Feedback

    Na, mal gucken... wenn mir wieder was auffällt, melde ich mich mal. 🙂

    1: Ja, brauchbar. Solltest du wirklich mit in den FAQ-Text nehmen.

    2: Tja... keine Ahnung, was dann passieren würde. Nichts Gutes? 🤡 Den inneren Aufbau von AnsiString kenn ich nicht. Kann ich mir auch (noch) nicht vorstellen.

    3: Bäh. Threads. 😃 Nicht mein Gebiet. Die Erklärung klingt aber logisch.



  • Ach ja: Du hast unten bei den Ausreden was von nem Assistenten erzählt... was wäre denn das für einer? Wo ist der, wie läuft der, was gibt man in die Hilfe ein? 🙂



  • Erstmal muss man über Ansicht->ClassExplorer denselbigen anzeigen lassen.
    Dort stehen alle Klassen des Projekts.
    Entweder du klickts dich bis zur klasse durch die du bearbeiten willst klickts dann rechts auf sie oder klickts einfach rechts auf den ClassExplorer.
    Dort gibt es dann 3 Wichtige Menüeintrage:
    Neues Feld
    Neue Eigenschaft
    Neue Methode



  • Ist ja cool... danke!


Anmelden zum Antworten