Spiel: Kleines FakeHackprogramm Frage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gary123456 hat geschrieben: Sonst noch was auszusetzen? :)
Ja, der Thread hier wird durch die ellenlangen Code-Passagen stark unterbrochen. Wie ich Dir schon empfahl, solltest Du das besser in Pastebins auslagern (in Zukunft). Speziell bei gist.github.com hättest Du jetzt für jedes Update einfach dein Gist überarbeiten können.

Inhaltlich habe ich mir das noch nicht angeguckt...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, also generell vermischst Du viel zu sehr Logik mit Darstellung bzw. Benutzerinteraktion. Wieso muss das Speichern von Werten direkt in derselben Funktion stehen, wie die Eingabe durch den Benutzer?

Vieles lässt sich auch besser kapseln, etwa die immer ähnlichen Menü-Fragmente. Mal willst Du nur Ja oder Nein, mal 1 oder 2 usw. Das kann man sicherlich besser generalisieren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ziemlich viele Leerzeilen.
Habe es jetzt editiert.
Ja, der Thread hier wird durch die ellenlangen Code-Passagen stark unterbrochen. Wie ich Dir schon empfahl, solltest Du das besser in Pastebins auslagern (in Zukunft). Speziell bei gist.github.com hättest Du jetzt für jedes Update einfach dein Gist überarbeiten können.
Werde mir das jetzt mal anschauen. Ich denke, dass das letzte Mal wegen des neuen Editors was schiefgelaufen ist. Werde das jetzt berücksichtigen.
Ok, also generell vermischst Du viel zu sehr Logik mit Darstellung bzw. Benutzerinteraktion. Wieso muss das Speichern von Werten direkt in derselben Funktion stehen, wie die Eingabe durch den Benutzer?
Warum nicht? Ist es besser/übersichtlicher, wenn man für jede Aktion eine eigene Funktion aufbaut? Dann wären das aber recht viele Funktionen.
Vieles lässt sich auch besser kapseln, etwa die immer ähnlichen Menü-Fragmente. Mal willst Du nur Ja oder Nein, mal 1 oder 2 usw. Das kann man sicherlich besser generalisieren.
Werde versuchen, da eine bessere Lösung zu finden.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

für text-basierte Interaktion (also mehr als 1 oder 2 Eingaben) finde ich ja das cmd-Modul aus der Standardbibliothek sehr praktisch...

Gruß, noisefloor
BlackJack

Würde sich hier IMHO auch ganz gut eignen weil man sich da auch so einen schönen Retro-mässigen Prompt für die Eingaben mit basteln kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gary123456 hat geschrieben: Warum nicht? Ist es besser/übersichtlicher, wenn man für jede Aktion eine eigene Funktion aufbaut? Dann wären das aber recht viele Funktionen.
Ja, so ist das bei Programmen ;-) Aber es ist immer besser Funktionen so weit zu zerlegen, dass diese eher klein und überschaubar für sich sind. Man sollte sie auch immer so halten, dass Funktionen genau *eine* Aufgabe erledigen und nicht mehrere auf einmal. Eine Aufgabe kann es sein, Daten vom Benutzer abzufragen. Eine andere, diese in eine passende Datenstruktur zu packen, eine weitere dann schließlich, diese irgend wie zu speichern.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Werde den COde jetzt mal total umändern :)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Neuer Code:

http://www.python-forum.de/pastebin.php?mode=view&s=331

@Hyperion) Von der Aufteilung her besser?

@ noisefloor and BlackJack) Werde mir jetzt das Modul ansehen!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hum, `register` ist ein reichlich komplizierter Weg um `hack` aufzurufen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Warum kompliziert? Verstehe Dich ehrlicherweise nicht. :cry:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Warum kompliziert? Du hast 7 ueberfluessige und 2 tote Code Zeilen. Die 10. ruft `hack()` auf. Wenn du das nicht verstehst, gehe mal Zeile fuer Zeile durch.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Du machst ja immer noch nichts mit username/password bzw. all_user/all_password! Wenn du nur ein Registrieren vortäuschen willst, kannst du ja auch einfach nur zweimal input() aufrufen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Warum werden in den Funktionen mittels return andere Funktionen aufgerufen ?

Code: Alles auswählen

if register_query == "1":
        return register()
Hier werden ja keine Rückgabewerte erwartet, sondern wie es für mich aussieht willst du nur die nächste Funktion aufrufen.

Gruss Kev
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich habe return falsch interpretiert. Ich denke, ich les mir nochmal das ganze Kapitel durch. Später folgt neuer Code.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Code: Alles auswählen

import sys
import time

def phase1():

    with open("info.txt", "w") as file2:
        #content of the file
        file2.write("Name des Opfers ")
        file2.write(input("Geben Sie hier den Namen des Opfers ein!"))
        file2.write("IP des Opfers ")
        file2.write(input("Geben Sie hier die IP des Opfers ein!"))
        file2.write("Über welchem Port: ")
        file2.write(input("Geben Sie hier die Portnummer ein."))
    time.sleep(5.0)
    print("Verbindung aufgenommen!")
    time.sleep(5.0)
    print("Daten erfolgreich gestohlen")

    with open("Daten.txt", "w") as file:
        file.write("Ebay - Passwort: Hekdlaien33 ")
        file.write("FB - Passwort: ji87z78zhihg76 ")
        file.write("READY")
    print("Das Spiel ist jetzt beendet")


def hack():

    hack_query = input("Wollen Sie wirklich hacken? Wenn ja drücken Sie die 1.")

    if hack_query == "1":
        phase1()
    else:
        sys.exit()
    
def register():
    username = input("Geben Sie hier Ihren gewünschten Benutzernamen ein!")
    password = input("Geben Sie hier Ihr gewünschtes Passwort ein!")

    hack()

def main():
    register_query = input("Wenn Sie sich registrieren wollen, drücken Sie die 1.")

    if register_query == "1":
        register()
    else:
        sys.exit()

if __name__ == '__main__':
    main()
Man könnte doch vor jedem sys.exit() ein return setzen, da ich ja die Funktion beenden will. Oder ist das dann wieder unnötig, ich ja das Programm beenden will?

Weitgehenst sollte der Code stimmen.
BlackJack

@Gary123456: Wenn Du *vor* irgend etwas ein ``return`` setzt, dann wird das danach nicht mehr ausgeführt weil das ``return`` die Abarbeitung der Funktion oder Methode beendet.

Soweit ich das sehe sind die `sys.exit()`-Aufrufe beide überhaupt nicht nötig.

Die Funktionen sind so aber nicht gut aufgeteilt. Man benutzt Funktionen ja um sie wiederverwenden, austauschen, und einzeln testen zu können. Wenn eine Funtkion immer die nächste aufruft, dann geht das aber nicht.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Man benutzt Funktionen, um

- ein größeres Programm besser einteilen zu können, das dient der Lesbarkeit des Codes
- um den Code kürzer zu machen, wenn man diesselbe Zeilen mehrmals braucht -> somit nur Aufruf einer Funktion
- den Programmablauf simpler zu gestalten

Ja, jetzt sehe ich auch dass die beiden Funktionen sys.exit unnötig sind, da das Programm sich eh automatisch schließz, wenn falsch Eingabe betätigt wird. sys.exit() verlängert nur unnötig den Code.


So sollte der Code richtig sein:

Code: Alles auswählen

import sys
import time

def phase1():

    with open("info.txt", "w") as file2:
        #content of the file
        file2.write("Name des Opfers ")
        file2.write(input("Geben Sie hier den Namen des Opfers ein!"))
        file2.write("IP des Opfers ")
        file2.write(input("Geben Sie hier die IP des Opfers ein!"))
        file2.write("Über welchem Port: ")
        file2.write(input("Geben Sie hier die Portnummer ein."))
    time.sleep(5.0)
    print("Verbindung aufgenommen!")
    time.sleep(5.0)
    print("Daten erfolgreich gestohlen")
    with open("Daten.txt", "w") as file:
        file.write("Ebay - Passwort: Hekdlaien33 ")
        file.write("FB - Passwort: ji87z78zhihg76 ")
        file.write("READY")
    print("Das Spiel ist jetzt beendet")


def hack():

    hack_query = input("Wollen Sie wirklich hacken? Wenn ja drücken Sie die 1.")
    if hack_query == "1":
        phase1()

    
def register():
    username = input("Geben Sie hier Ihren gewünschten Benutzernamen ein!")
    password = input("Geben Sie hier Ihr gewünschtes Passwort ein!")
    hack()

def main():
    register_query = input("Wenn Sie sich registrieren wollen, drücken Sie die 1.")
    if register_query == "1":
        register()

if __name__ == '__main__':
    main()
Man könnte das Programm natürlich auch funktionslos schreiben, dennoch, finde ich, trägt das nicht der Lesbarkeit bei. Oder stimmt das nicht, was ich hier behaupte?
BlackJack

@Gary123456: Das stimmt schon, aber *die* Aufteilung beziehungsweise dieses von einer Funktion immer zu nächsten springen ist nicht gut. Ich sage ja nicht das man es ohne Funktionen schreiben sollte, nur dass man es nicht *so* mit Funktionen schreiben sollte. Eine Funktion sollte in der Regel genau *eine* in sich abgeschlossene Sache machen. Die `register()`-Funktion sollte nur das Registrieren machen, und nicht auch noch das Hacken. Die `hack()`-Funktion ist im Grunde nichts für sich abgeschlossenes, das hätte man auch mit in `main()` oder in `phase1()` schreiben können.
Antworten