Какова наилучшая практика для организации фрагмента кода для повторного использования? - PullRequest
0 голосов
/ 15 января 2019

Я создаю текстовую игру для шифрования и дешифрования. Существуют разные уровни, и каждый уровень использует свой шифр для шифрования текста. Я пытаюсь найти наилучшую практику для серии вопросов и подсказок (описательной части), которую я даю пользователю, чтобы определить, хочет ли он попрактиковаться, выполнить тест, зашифровать или расшифровать. 90% повествования одинаковы для каждого уровня, поэтому я не хочу повторяться с идентичным кодом. Каков наилучший способ сделать это?

Моей первой мыслью было определить функцию, которая содержала бы общий сценарий, и вызывать конкретные функции в качестве параметров. (Это то, что я пытался сделать ниже). Но я, кажется, столкнулся с проблемой масштаба. Когда я вызываю функцию caesar() в качестве одного из аргументов функции script(), мне нужно ввести текст для шифрования, но этот текст не предоставляется пользователем, пока функция script() уже не запущена .

Должен ли я использовать class для определения описательной части программы, а затем наследовать более конкретные типы?

Или мне просто повторить повествовательный код на разных уровнях?

Вот рассказ script():

def script(encrypt, decrypt):
    """Asks user if they want to practice (encode or decode) or take the
    test, and calls the corresponding function."""
encrypt = encrypt
decrypt = decrypt

    while True:
        print('Type Q to quit.  Type M to return to the main menu.')
        prac_test = input('would you like to practice or take the test? P/T')
        if prac_test.lower() == 'p':
            choice = input('Would you like to encrypt or decrypt? E/D ')
            if choice.lower() == 'e':
                text = input('Enter the text you would like to encode: ')
                encrypt
            elif choice.lower() == 'd':
                text = input('Enter the text you would like to decode: ')
                key = int(input('Enter the key: '))
                decrypt
            else:
                print('You must enter either "E" or "D" to encode or decode a
                  text. ')
        elif prac_test.lower() == 't':
            text = random.choice(text_list)
            encrypted_text = encrypt
            print(encrypted_text[0])
            answer = input('s/nCan you decode this string? ')
            if answer.lower() == ran_str.lower():
                print('Congrats! You solved level 1!\n')
                pass
            elif answer != ran_str:
                print("Sorry, that's not correct.  Why don't you practice some
                   more?\n")
                script(encrypt, decrypt)
        elif prac_test.lower() == 'q':
            exit()
        elif prac_test.lower() == 'm':
            break
        else:
            print('Please enter a valid choice.')

Вот один из уровней, использующих шифр Цезаря:

def caesar(mode, text, key=None):
    """
...
The dictionaries that convert between letters and numbers are stored in the .helper file, imported above.
    """
    mode = mode
    if mode == 'encrypt':
        key = random.randint(1, 25)
    elif mode == 'decrypt':
        key = key
    str_key = str(key)
    text = text.lower()
    # converts each letter of the text to a number
    num_list = [alph_to_num[s] if s in alph else s for s in text]
    if mode == 'encrypt':
        # adds key-value to each number
        new_list = [num_to_alph[(n + key) % 26] if n in num else n for n in
                    num_list]
    elif mode == 'decrypt':
        # subtracts key-value from each number
        new_list = [num_to_alph[(n - key) % 26] if n in num else n for n in
                    num_list]
    new_str = ''
    for i in new_list:
        new_str += i
    return new_str, str_key

А вот кто бы я попытался использовать их вместе:

script(caesar('encrypt' text), caesar('decrypt', text, key))

Пожалуйста, сообщите мне, как лучше организовать этот многократно используемый повествовательный код.

1 Ответ

0 голосов
/ 15 января 2019

Вы, вероятно, хотите использовать несколько функций:

  • Один, который мы назовем main(), для отображения меню и взаимодействия с пользователем
  • Класс Caesar, который предоставляет две функции: encrypt(text, key) и decrypt(text, key)

Простая программа может выглядеть как

def main():
    print("Welcome to the game")
    action = input("Would you like to encrypt or decrypt a text [e/d]">).lower()
    text = input("What is the text you want to test on ? >")
    key = input("What's your key")
    # optionnaly, ask for what kind of cipher they want to use, then use a dict to chose the right class
    cipher = Caesar()
    if action == "e":
         output = cipher.encrypt(text, key=key)
    else:
         output = cipher.decrypt(text, key=key)

    print(output)
    print("Thanks for playing!")
...