Übernahme der Eingabefelder

Fragen zu Tkinter.
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

@_blackjack_
wieder was gelernt :) Danke!

Natürlich hängt die "Sauberkeit" auch von der jeweiligen Sprache ab. Manche Sprachen sind ja z. B. extrem "geschwätzig" und man hat allein dadurch eine ungünstige Signal-Noise-Ratio.
Es gibt auch Sprachen, die "von Haus aus" schon schwerwiegende Architekturfehler "im Gepäck" haben, die man ggf. berücksichtigen muss. Auch unterliegen Sprachen unterschiedlichen Paradigmen, mit denen man sich ggf. näher befassen muss.

Ich wollte nur sagen: Man sollte trotzdem immer versuchen, den in der jeweiligen Programmiersprache bestmöglichen/saubersten Code zu schreiben.

Am Rande (@spicer)
ich bin initial mit Jupyter-Notebooks gestartet und bin dann auf PyCharm umgesattelt, weil dort "Konventionsverletzungen" angemeckert werden. Ich fand das sehr hilfreich, um mich mit Python-Konventionen schneller anzufreunden.
Irgendwann wird es auch leicht, zwischen den Sprachen und den zugehörigen Konventionen hin- und her zuschalten. Aber dazu muss man sie einüben.

Vielleicht hilft Dir das auch.
Benutzeravatar
Dennis89
User
Beiträge: 1215
Registriert: Freitag 11. Dezember 2020, 15:13

__blackjack__ hat geschrieben: Sonntag 3. Oktober 2021, 11:46 Was man IMHO mal durchgearbeitet haben sollte, ist das Tutorial in der Python-Dokumentation. Egal was man sonst zum lernen verwendet — das ist von den Leuten, die die Sprache entworfen und implementiert haben, und gibt einen ganz guten Einstieg und Rundgang. Da gibt es im Netz irgendwo auch eine deutsche Übersetzung. Für Python 3.3 glaube ich — da wären wir wieder bei dem Punkt, dass nicht-englischsprachiges schnell veraltet.

Dass wäre das hier:
https://py-tutorial-de.readthedocs.io/de/python-3.3/

Und für weitere Sprachprobleme:
https://www.deepl.com/de/translator

Gibts auch als AddOn für Firefox:
https://addons.mozilla.org/en-US/firefox/addon/deepl/

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

Edge übersetzt bei Bedarf auch automatisch. (Ist konfigurierbar)

Bei Quellcode ist das manchmal aber sehr störend, weil dann aus

Code: Alles auswählen

print()

Code: Alles auswählen

drucken()
wird.

Für Prosa ist das aber hin und wieder ganz praktisch.

....was dem Babelfisch im übrigen schon erstaunlich nah kommt ;-)
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Ganz ohne Englisch wird es trotzdem nicht gehen.
Aber auf der anderen Seite, nützt all das nur, wenn man auch gewillt ist, diese Informationen zu konsumieren.
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

blackjacks Hinweis ("Okay, die Werte werden nicht ”übernommen” hast Du geschrieben. Da steht ja auch nirgends Code der das machen würde.") hat mir geholfen. Interpretierte das Ganze etwas falsch.
Sorry, wenn ich zu impulsiv war. Passiert mir manchmal. Wenn möglich, vergesst das einfach ^^

Danke nochmal an Alle.
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

@Dennis89: Habe mit den Importen aufgeräumt

Code: Alles auswählen

import tkinter as tk 
from tkinter.ttk import Frame
from tkinter.ttk import Label
from tkinter.ttk import Button
from tkinter.filedialog import askopenfile
import pandas as pd

import pathlib as Path
Aber das mit "Anstatt 'os' benutzt man das aktuelle 'pathlib.Path'" hab ich noch nicht geschafft.
Er kommt dann mit: module 'pathlib' has no attribute 'basename' in der Zeile
filename = Path.basename(str(file))

Zudem habe ich die Variablennamen auch informativer gemacht.
Fields = ....
FieldsContent = ....
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
Benutzeravatar
__blackjack__
User
Beiträge: 13240
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@spicer: Wenn man mehrere Werte aus ein und dem selben Modul importiert, braucht man dafür nicht für jeden eine eigene Anweisung. Bei ``from … import …`` schreibt man für die ersten ``…`` üblicherweise nur eine Anweisung. Es ist auch empfehlenswert die Importe aus der Standardbibliothek und Fremdbibliotheken zu trennen, und die Importreihenfolge nach festen Kriterien zu ordnen. So behält man auch bei vielen Importen leichter den Überblick was man alles importiert und wo man einen zusätzlichen, neuen Import einfügen muss. Üblich ist ``import …`` vor ``from … import …`` und innerhalb der beiden Gruppen alphabetisch nach Modulnamen zu sortieren. Also hier beispielsweise:

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
from tkinter.filedialog import askopenfile
from tkinter.ttk import Button, Frame, Label

import pandas as pd
Es gibt auch IDEs und Editoren bzw. Plugins, oder notfalls auch externe Programme, die das gruppieren, zusammenfassen, sortieren, und gegebenenfalls umformatieren, für einen übernehmen. `isort` wäre ein Beispiel.

Ich habe den Import von `Path` auch gleich mal korrigiert, und da gibt es keine `basepath()`-Funktion, Du musst das schon auf die API umschreiben. Wäre ja auch irgendwie sinnlos in der Standardbibliothek in `pathlib` und `os.path` genau die gleichen Funktionen anzubieten. `Path` ist auch kein Modul, wie man am Namen schon erkennen kann, sondern ein Datentyp/eine Klasse. Das was `os.path.basename()` für eine Zeichenkette mit einem Pfad liefert, ist bei `Path`-Objekten als `name`-Attribut zu bekommen:

Code: Alles auswählen

In [16]: path_as_text = "foo/bar/baz.txt"                                       

In [17]: os.path.basename(path_as_text)                                         
Out[17]: 'baz.txt'

In [18]: path = Path(path_as_text)                                              

In [19]: path.name                                                              
Out[19]: 'baz.txt'
Hier sieht man auch warum das Sinn macht, dass Klassen in PascalCase benannt werden und alles andere *nicht*. Denn man weiss dann sofort das `Path` eine Klasse ist, und hat auch gleich einen generischen Namen für ein Exemplar davon: `path`, und man kann beide dadurch ganz leicht auseinanderhalten.

Weswegen die Namen `Fields` und `FieldsContent` falsch sind, denn das sind ja keine Klassen. Das wäre `fields` und `fields_content` bei Variablen bzw. `FIELDS` und `FIELDS_CONTENT`, falls es sich um Konstanten handelt. Auch wieder damit der Leser weiss worum es sich handelt. Das ist keine Kosmetik/weil das irgendwie schöner aussieht, sondern über die Schreibweise wird für den Leser wichtige Information über die hinter den Namen steckende Werte vermittelt.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

__blackjack__ hat geschrieben: Mittwoch 6. Oktober 2021, 14:17 @spicer: Wenn man mehrere Werte aus ein und dem selben Modul importiert, braucht man dafür nicht für jeden eine eigene Anweisung. Bei ``from … import …`` schreibt man für die ersten ``…`` üblicherweise nur eine Anweisung. Es ist auch empfehlenswert die Importe aus der Standardbibliothek und Fremdbibliotheken zu trennen, und die Importreihenfolge nach festen Kriterien zu ordnen. So behält man auch bei vielen Importen leichter den Überblick was man alles importiert und wo man einen zusätzlichen, neuen Import einfügen muss. Üblich ist ``import …`` vor ``from … import …`` und innerhalb der beiden Gruppen alphabetisch nach Modulnamen zu sortieren. Also hier beispielsweise:

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
from tkinter.filedialog import askopenfile
from tkinter.ttk import Button, Frame, Label

import pandas as pd
Es gibt auch IDEs und Editoren bzw. Plugins, oder notfalls auch externe Programme, die das gruppieren, zusammenfassen, sortieren, und gegebenenfalls umformatieren, für einen übernehmen. `isort` wäre ein Beispiel.

Ich habe den Import von `Path` auch gleich mal korrigiert, und da gibt es keine `basepath()`-Funktion, Du musst das schon auf die API umschreiben. Wäre ja auch irgendwie sinnlos in der Standardbibliothek in `pathlib` und `os.path` genau die gleichen Funktionen anzubieten. `Path` ist auch kein Modul, wie man am Namen schon erkennen kann, sondern ein Datentyp/eine Klasse. Das was `os.path.basename()` für eine Zeichenkette mit einem Pfad liefert, ist bei `Path`-Objekten als `name`-Attribut zu bekommen:

Code: Alles auswählen

In [16]: path_as_text = "foo/bar/baz.txt"                                       

In [17]: os.path.basename(path_as_text)                                         
Out[17]: 'baz.txt'

In [18]: path = Path(path_as_text)                                              

In [19]: path.name                                                              
Out[19]: 'baz.txt'
Hier sieht man auch warum das Sinn macht, dass Klassen in PascalCase benannt werden und alles andere *nicht*. Denn man weiss dann sofort das `Path` eine Klasse ist, und hat auch gleich einen generischen Namen für ein Exemplar davon: `path`, und man kann beide dadurch ganz leicht auseinanderhalten.

Weswegen die Namen `Fields` und `FieldsContent` falsch sind, denn das sind ja keine Klassen. Das wäre `fields` und `fields_content` bei Variablen bzw. `FIELDS` und `FIELDS_CONTENT`, falls es sich um Konstanten handelt. Auch wieder damit der Leser weiss worum es sich handelt. Das ist keine Kosmetik/weil das irgendwie schöner aussieht, sondern über die Schreibweise wird für den Leser wichtige Information über die hinter den Namen steckende Werte vermittelt.
Danke. Wieder was gelernt ;)
Mein Programm zappelt mittlerweilen.
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Habe nun nach bestem Wissen und Gewissen mit Deinen Ratschlägen mein Programm fertiggestellt.
Sieht ganz gut aus.
Was ich nach intensivem Nachlesen immer noch nicht begriffen habe, was Klassen (class) eigentlich genau sind (im Gegensatz zu def).
Aber alles muss man ja auch nicht können (zumindest am Anfang) ^^
Auch __main__ und __init__ ist mir noch nicht so klar.
Habe jetzt mein Script mal nach "alter Väterschule" mit def's, if's und Schleifen geschrieben....Mann, suchte ich, bis ich eine Lösung hatte, um einen Button "zurück" zu erstellen ohne goto :D
Für mich stimmt es momentan, wenn der Code nicht allzu verschachtelt ist. So checke ich es selber noch. Der Dev sollte ja eigentlich seinen eigenen Code verstehn ^^
Das mit PascalCase usw war auch ein guter Tip. Das wusste ich nicht.
Habe jetzt zwar Variablennamen in deutsch, aber nach (Deinen) richtigen Kriterien geschrieben.
Sieht schon viel übersichtlicher aus.

Also, danke nochmal.
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

@spicer

mit Deiner "Frage"
Was ich nach intensivem Nachlesen immer noch nicht begriffen habe, was Klassen (class) eigentlich genau sind (im Gegensatz zu def).
hast Du mich nochmal zum Nachdenken gebracht, wie das denn nun genau mit "private" und Klassen unter Python ist und ich bin nochmal beim Versuch eine Erklärung zu schreiben auf eine Frage gestoßen, die mir seit längerem schon "unter den Nägeln brennt" : (viewtopic.php?f=1&t=53153&p=394460#p394460)

Danke :)

Über Klassen und wozu sie dienen und was der Unterschied zu Funktionen sind, wurden schon etliche Regalmeter Bücher geschrieben. Meine Antwort wird also keinesfalls "erschöpfend" sein.
Ganz grob kann man wohl sagen, dass Klassen Programmlogik kapseln und eine Schnittstelle zu anderen Programmteilen bieten, ganz im Sinne von "Teile und herrsche". Eine Klasse kann z.B. über private-Methoden interne Berechnungen durchführen und nur public-Methoden zur Manipulation des inneren Zustandes zur Verfügung stellen.

Oder könntest Du mal anders herum darlegen, was Du konkret an Klassen nicht verstehst? Wo siehst du Gemeinsamkeiten zwischen class und def?
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Ein konkretes Bsp wäre gut.
Ich habe den Vergleich mit einem Kuchen gelesen. Gut gemeint, aber iwie ist mir das immer noch nicht klar.
Eine def kann ja auch von überall her aufgerufen werden. Eine class doch auch. Oder wird die ausgeführt, wenn das Programm da vorbei kommt (eine def muss ja iwo aufgerufen werden)?
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Klasse kann Zustand haben. Als Freund von Elektronik ist dir vielleicht dieses Beispiel eingängig: eine Funktion (so heißt das, def ist nur ein Schlüsselwort) zb gut geeignet, einen ohmschen Widerstand zu modellieren. Eingabe sind zb Spannung und Widerstand, und geliefert wird der fließende Strom.

Ein Kondensator hingegen hat einen Widerstand, der von der im laufe der Zeit akkumulierten Ladung abhängt. Diese Ladung kann eine Funktion nicht speichern. Eine Klasse kann sich den aber merken, und zb über die Zeit akkumulieren.
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Ah, dann werden die Variablen-Werte in der Klasse gespeichert?
Die Variablen sind dann ausserhalb der Klasse nicht "belegt" (wie eine globale Variable)?
Und eine Klasse wird auch erst beim Aufruf von dieser ausgeführt. Also nicht dann, wenn der Interpreter da vorbei kommt?
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Klasse wird schon direkt ausgeführt. Erst danach existiert sie. Eine Blaupause muss man auch erstmal zeichnen. Und das gilt auch für eine Funktion. Die muss auch erstmal definiert werden. Darum heißt das ja auch “def blabla”. Vorher gibt’s auch kein blabla.

Aber danach werden eben wahlweise Aufrufe ( bei Funktionen) oder Instanzen (bei Klassen) erstellt. Und mit letzteren arbeitet man dann eben länger.
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Also wird die Klasse auch erst ausgeführt, wenn diese aufgerufen.
Also kann diese oben im Code stehen und da wird die erst definiert, aber noch nicht ausgeführt. Richtig?
Und das mit den Variablen (siehe oben)?
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Eine Klasse ist ein Bauplan für ein neues Objekt. Man nennt so ein neues Objekt auch Instanz einer Klasse. Es kann beliebig viele Instanzen, die nach dem Bauplan einer Klasse "gebaut" wurden geben.
Jede Instanz ist zwar nach dem Bauplan gebaut, verwaltet aber ihrer zugehörigen Daten separat von allen anderen Instanzen. (Mit Ausnahmen)
Bei Objekten also Instanzen von Klassen spricht man in der Regel nicht davon, dass sie ausgeführt werden.

Beipiel Taschenrechner:

Code: Alles auswählen

class TaschenrechnerBauplan:
    def __init__(self):
        """
        Initialisierung des Objekts mit eine Instanzvariablen Register
        self ist eine Referenz auf die jeweilige Instanz
        """
        self.register = 0

    def load(self, zahl):
        """ Instanzmethode (Funktion) zum laden einer Zahl ins Register"""
        self.register = zahl

    def addition(self, zahl):
        """ Instanzmethode zum Addieren einer Zahl zum Register"""
        self.register = self.register + zahl

    def ausgabe(self):
        """ Instanzmethode zur Ausgabe des Registers"""
        print(self.register)

# Bauen der Instanz "taschenrechner_instanz":
taschenrechner_instanz = TaschenrechnerBauplan()

# Benutzen der Instanz "taschenrechner_instanz"
taschenrechner_instanz.load(1)
taschenrechner_instanz.addition(2)
taschenrechner_instanz.ausgabe()

""" 
Ausgabe:
3
"""
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Gutes Bsp. Danke
Was bringt das aber nun, weil ja die load, addition und ausgabe Funktionen direkt aufgerufen werden könnten?
Ich sehe, dass einzig die Variable register gespeichert bleibt (der Wert).
Also ist das vorallem eine Möglichkeit, globale Variablen zu vermeiden?

__init__ wird nur ausgeführt, wenn kein Wert an die Klasse TaschenrechnerBauplan übergeben wird?
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

__inti__ wird direkt nach der Erzeugung aufgerufen. Ob da Argumente gebraucht werden oder nicht, hängt von der Klasse ab.

Und ja, es geht um Zustand. Globaler Zustand ist bestenfalls unübersichtlich. Schlimmstenfalls Quelle von Fehlern.
Benutzeravatar
spicer
User
Beiträge: 52
Registriert: Freitag 5. März 2021, 23:40
Kontaktdaten:

Vielen Dank.
Ich werde mir auf jeden Fall den Link zu deinem Bsp notieren.
Jetzt blicke ich besser dahinter.
Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine davon in einer Katastrophe endet oder sonstwie unerwünschte Konsequenzen nach sich zieht, dann wird es jemand genau so machen. Alles, was schiefgehen kann, wird auch schiefgehen.
(Murphys Gesetz)
Benutzeravatar
__blackjack__
User
Beiträge: 13240
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also mir gefällt ja das Taschenrechnerbeispiel nicht so wirklich. Von Funktionen kommend würde das so nicht entstehen, weil diese Funktionen so niemand schreiben würde. Man muss also OOP schon drauf haben um das so zu schreiben und es gibt keinen ”Schritt” von Nicht-OOP zu OOP, den man da nachvollziehen könnte. ”Historisch” ist das ja eher so das Objekte aus einem Verbunddatentyp (``RECORD`` in Pascal, ``TYPE`` in BASIC, ``struct`` in C) entstanden sind. Der OP kommt ja aus einer Sprache mit GOTO-Anweisung.

Sinnvoller aus der Ecke kommend ist IMHO eher ein Beispiel wo Funktionen verwendet werden, da aber mittlerweile zu viele Einzelwerte herum gereicht werden müssen, so dass man die sinnvoll zu einem Verbunddatentyp zusammenfassen kann/sollte, und wo man dann einen der Vorteile zeigen könnte die dadurch entstehen, dass man die Funktionen die darauf operieren mit in den Datentyp hineinzieht. Das wäre also Polymorphie als einfachster Vorteil. Blöderweise braucht man in Python schon Klassen wenn man das gar nicht braucht, weil das der einzige Verbunddatentyp ist. Andererseits macht es natürlich auch Sinn dafür keinen eigenen Typ einzuführen, wenn Klassen ja auch diese „plain old data“ (POD)/passive Datenstrukturen abdecken können, und letztlich in Python ja *jeder* Datentyp durch eine Klasse repräsentiert wird, ja werden muss.

OOP-Beispiele haben in der Regel das Problem, dass sie entweder sehr künstlich sind, und sich der Anfänger fragt, warum macht man dass, oder sie sind schon recht komplex, und überfordern damit Anfänger. Was in der Natur der Sache liegt, weil die Aufgabe OOP ist Komplexität zu organisieren und handhabbar zu halten. Wenn in dem Beispiel keine Polymorphie oder Vererbung vorkommt, dann ist es IMHO kein OOP-Beispiel, denn das könnte man dann auch genau so gut ohne OOP lösen.

Zurück zum Taschenrechnerbeispiel, das man in QBasic beispielsweise mit Verbunddatentyp und Prozeduren so schreiben würde:

Code: Alles auswählen

TYPE TTaschenrechner
  register AS INTEGER
END TYPE

SUB TaschenrechnerInit (rechner AS TTaschenrechner)
  rechner.register = 0
END SUB

SUB TaschenrechnerLadeRegister (rechner AS TTaschenrechner, zahl AS INTEGER)
  rechner.register = zahl
END SUB

SUB TaschenrechnerAddiere (rechner AS TTaschenrechner, zahl AS INTEGER)
  rechner.register = rechner.register + zahl
END SUB

SUB TaschenrechnerAusgabe (rechner AS TTaschenrechner)
  PRINT rechner.register
END SUB

DIM rechner AS TTaschenrechner

TaschenrechnerInit rechner
TaschenrechnerLadeRegister rechner, 1
TaschenrechnerAddiere rechner, 2
TaschenrechnerAusgabe rechner
Das sieht so schon nicht sinnvoll aus, und das auf Pseudo-OOP zu erweitern taugt IMHO nicht jemandem den Sinn von OOP näher zu bringen. Das hat keinen wirklichen Vorteil gegenüber:

Code: Alles auswählen

DIM register AS INTEGER

register = 0
register = 1
register = register + 2
PRINT register
Und das könnte man noch weiter vereinfachen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten