Как научиться рефакторить код? pyhton

Всем привет! Написал простую прогу на tkinter. По сути прога регистрации с базой данных (sqlite3).

Так вот сейчас, на мой взгляд, это выглядит не очень красиво. Да и мне советовали провести рефакторинг кода, а как сделать это не знаю. Хотя саму суть ООП я понимаю.

Код:

from tkinter import Tk, Label, Entry, Button, StringVar, Toplevel, messagebox
import sqlite3

def check_user(login, password):
    conn = sqlite3.connect('users.db')
    c = conn.cursor()

    c.execute('''CREATE TABLE IF NOT EXISTS users
    (id INTEGER PRIMARY KEY, 
    login TEXT, 
    password TEXT)''')

    c.execute("SELECT login, password FROM users WHERE login = ?", (login, ))
            
    data_select_user = c.fetchone()
    data_submit_uesr = (login, password)

    if data_select_user == data_submit_uesr:
        messagebox.showinfo(title="Welcome!",  message="It's Ok!")
    else:
        messagebox.showerror(title="REGISTER!",  message="REGISTER PLEASE!")
                
            
    conn.commit()
    conn.close()


def insert_user(login, password):
    conn = sqlite3.connect('users.db')
    c = conn.cursor()

    c.execute('''CREATE TABLE IF NOT EXISTS users
    (id INTEGER PRIMARY KEY, 
    login TEXT, 
    password TEXT)''')

    c.execute("INSERT INTO users (login, password) VALUES (?,?)", (login, password))
            
    conn.commit()
    conn.close()

def submit():
    login = login_var.get()
    password = password_var.get()
    # print('its ok')
    check_user(login, password)
    login_var.set("")
    password_var.set("")

class root2:
    def __init__(self):
        super().__init__()
            
        def submit2():
            login = login_var2.get()
            password = password_var2.get()
            insert_user(login, password)
            login_var2.set("")
            password_var2.set("")
                    
        root2 = Toplevel(root)
        root2.title("Register Form")

        def call_func2():
            close2()
            submit2()

        def close2():
            root2.destroy()
                
        login_var2 = StringVar()
        password_var2 = StringVar()

        Label(root2, text="Login:").grid(row=0, column=0)
        Entry(root2, textvariable=login_var2).grid(row=0, column=1)

        Label(root2, text="Password:").grid(row=1, column=0)
        Entry(root2, textvariable=password_var2, show='*').grid(row=1, 
        column=1)

        Button(root2, text="Submit", command=call_func2).grid(row=2, column=1)



root = Tk()
root.title("Login Form")
root.resizable(False, False)

login_var = StringVar()
password_var = StringVar()

def click():
    root = root2()

def close():
    root.destroy()

def call_func():
    # close()
    submit()


Label(root, text="Login:").grid(row=0, column=0)
Entry(root, textvariable=login_var).grid(row=0, column=1)

Label(root, text="Password:").grid(row=1, column=0)
Entry(root, textvariable=password_var, show='*').grid(row=1, column=1)

Button(root, text="Submit", command=call_func).grid(row=2, column=1)
Button(root, text="Create new account", command=click).grid(row=3, 
column=1)

root.mainloop()

Ответы (1 шт):

Автор решения: Pak Uula

Не знаю, что называют рефакторингом те, кто советовал вам ими заняться, но по канону (Мартин Фаулер) рефакторингом называется эквивалентная трансформация программы. То есть такое изменение программы, при которой её функциональность не меняется.

Самые простые способы рефакторинга, это переименование переменной и вынос кода в функцию. Эти трансформации, как правило, поддерживают все современные IDE. Но к более сложным видом рефакторинга нужно подходить осторожно.

Поэтому, прежде чем браться за рефакторинг кода, нужно как следует покрыть его тестами. Как иначе вы узнаете, что ваш рефакторинг ничего не сломал? В этом плане графические приложения весьма сложно рефакторить. Жизнь гораздо упростится, если следовать модели model-view-controller, в которой разделены бизнес-логиком, окошки и виджеты, и обработка событий. Всю бизнес-логику стоит вынести в отдельные классы и функции, которые можно по-юнитно протестировать.

Такое разделение само по себе будет отличным рефакторингом;)

Рекомендую начать с первооснов: Мартин Фаулер, Улучшение существующего кода. Там то ли про Смоллток, то ли про Джаву, я сейчас уже не помню. Но конкретный язык не важен, главное в книге идеи. Одна из немногих книг, которые повлияли на мое мировоззрение. Рекомендую.

→ Ссылка