Codefeedback: Wie findet ihr diesen?

  • Hey zusammen,


    ich habe in der letzten Stunde in PHP die Cäser-Verschlüsselung durch Transposition entwickelt. Ich nutze zum Teil redunanten Code und habe auch ein paar notwendige Verzweigungen drin. Ich finde, dass man diesen Code noch deutlich komprimieren kann nur komme zur Zeit nicht drauf wie.


    Nun möchte ich einfach mal euer Feedback zu diesem Anwendungscode hören. Was findet ihr gut? Was findet ihr nicht gut? Was kann ich besser machen? Wie kann ich den Code komprimieren?


    Ich würde mich sehr über euer Feedback freuen.


    Schöne Grüße,
    Stef

  • Ich empfehle sowas immer ohne HTML zu schreiben.

    Schreib Funktionen, oder Objekte, aber keine Loops mit HTML :)


    $alphabetkannst Du schon mal generieren.

    So in etwa (ungetested)

    PHP
    1. $alphabet = [];
    2. // Note: start with $i = 1 for 1-26 array offsets.
    3. for ($i = 1, $char = 'a'; $i <= 26; $i++) {
    4. $alphabet[$i] = $char;
    5. // Note: PHP gets the next char in alphabet on ++.
    6. $char++;
    7. }

    Und schon diese kleine Sache packst Du einfach schon mal weg in eine Funktion (z.B: generateAlphabetArray()).


    Als nächstes willst Du ja en- und de-coden.

    Also wird es sicher eine soUndSoEncode und soUndSoDecode Funktion geben.


    Diese beiden werden dann sicherlich gemeinsamen Code nutzen (können).

    Also packst Du diesen Code, wenn auch nur kleine Loops ect, in eine Funktion,

    die beide dann nutzen können.


    Oft schreib ich mir erstmal runter, wie ich das Ganze dann eigentlich aufrufen will,

    ohne zu wissen, was mich erwaret.

    In etwa (als Objekt (OOP)):

    Code
    1. // clear text example input
    2. $text = 'foo bar baz';
    3. // encode
    4. $caesar = new Caesar();
    5. $encryptedText = $caesar->encrypt($text); 
    6. // decode
    7. $clearText = $caesar->decrypt($encryptedText);

    So wüsste ich schon mal, was ich für (public) Funktionen haben wöllte.

    Dir selbst oder jemand, der es später nutzen würde, ist es dann relativ egal, was da drin passiert.

    Hauptsache der Call ist "angenehm".


    Wenn Du das dann als Webseite anzeigen willst, dann ist der Einbau ja recht einfach.

    Es ist aber schön getrennt - Funktion (Caesar) und Controller (Input|output (HTML, ....)).

  • Hey cottton,


    herzlichen dank dir für dein Feedback zu meinem Code.


    Aus diesem konnte ich jetzt viel hilfreiches herauspicken und auch neues lernen.


    Danke! :)


    Eine Frage habe ich dazu noch, bei der ich bisher überhaupt nicht weiterkomme. Meine Verschlüsselung gibt immer nur Kleinbuchstaben aus, da ich in dem Array Alphabet nur Kleinbuchstaben stehen habe und daher nur mit Kleinbuchstaben arbeiten kann. Wie kann ich es nun so lösen, dass dabei auch die Groß- und Kleinschreibung beachtet wird, sodass beim verschlüsseln und entschlüsseln der Text so ausgegeben wird, wie er eingegeben wurde?


    Hast du da für mich Tipps oder auch Denkanstöße?


    Schöne Grüße,
    Stef

  • Naja, ich würde in dem Fall auch nur das Array mit Gross- und Kleinbuchstaben füllen.

    Die Zeile $plainTextArray = str_split(strtolower($plainText));musst Du dann natürlich ändern, damit nicht alles auf Kleinbuchstaben gezwungen wird.

    Also strtolowerweg.


    Jetzt fehlen Dir ja dann auch noch andere Zeichen, Wie z.B. der Punkt, Komma, ... .

    Musst Du dann eben noch in das $alphabet array packen.


    BTW, was ich schon eher hätte erwähnen können: range()

    https://www.php.net/manual/de/function.range.php

    Siehe comment: https://www.php.net/manual/de/function.range.php#114493

    Code
    1. echo implode("",range("q","9 "));
    2. // prints qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654

    Sieht interessant aus. Evtl kannst Du damit ein array mit Sonderzeichen erstellen.

  • Das Ganze geht theoretisch in einer Zeile Code (bis auf glaube ich Nummern und andere Zeichen gehen nicht):

    Code
    1. echo str_rot13("Hallo Welt!");


    Ansonsten könntest du vielleicht mit ctype_upper() checken, ob der jeweilige Buchstabe groß ist und dann mit strtoupper() auch in der Verschlüsselung groß schreiben.

  • Guten Tag zusammen,


    ich konnte mit Hilfe eurer Tipps und Empfehlungen die Verschlüsselung nun erweitern. Neben Kleinbuchstaben können nun auch Großbuchstaben und 26 Sonderzeichen (inklusive Zahlen) verschlüsselt werden.


    Während der Implementierung der weiteren Zeichen stand ich vor kleineren Herausforderungen zu denen ich bisher noch keine optimale Lösung, sondern eher eine Übergangslösung gefunden habe.


    Beim Erstellen des Sonderzeichen-Arrays musste ich 3 Elemente löschen. Nun ist zwischen de Arrayelementen, vor und nach den drei gelöschten Elementen, der Array-Key um den Wert drei unterschiedlich. Also:


    Code
    1. array(
    2. .....
    3. 22 => "#",
    4. 25 => ",",
    5. ....
    6. )


    Ich brauche das Array jedoch mit fortlaufenden Keys ohne eine Lücke.


    Meine Frage dazu ist: Wie kann ich nach dem Löschen von Array Keys die dahinterliegenden Array Keys durch die gelöschten Array Keys ersetzen, damit keine Lücke entsteht?


    Dazu habe ich noch keine Lösung gefunden.


    Bei meinem Lösungsweg habe ich aus dem Array eine Zeichenkette erstellt und dann diese nochmal am Seperator gesplittet damit die Array Keys nun fortlaufend ohne Lücke sind. Nun ist es so, dass ich die Array Keys von 1-26 und nicht von 0-25 brauche. Nun stand ich vor dem Problem, wie ich die Array Keys um eins hochzählen kann. Da fand ich nur einen Umweg über eine for-Schleife in der ich das Array nochmal komplett neu erstellt habe.


    Meine Frage dazu ist: Gibt es eine Funktion mit der ich alle Array Keys um 1 hochzählen kann?


    Nun möchte ich auch nochmal den Code mit euch teilen:

    Schöne Grüße,
    Stef

  • Ich brauche das Array jedoch mit fortlaufenden Keys ohne eine Lücke.

    Das geht mit array_values().

    Meine Frage dazu ist: Gibt es eine Funktion mit der ich alle Array Keys um 1 hochzählen kann?

    Mit array_values() bekommst Du alle values.
    Mit range erstellst Du ein Array mit values von 1 bis {soviele, wie es values gibt}.

    Mit array_combine() kombinierst Du die keys mit den values.