W pliku Core.py wystarczyłyby 4 funkcje których cały kod zmieściłby się na jednym ekranie może dwóch. Współczynniki i nazwy jednostek należałoby wywalić do tablicy z konfiguracją. W menu wtedy też nie musiałbyś mieć tylu opcji lub też menu mogłoby wygenerować się automatycznie ...
Otóż to. Tyle funkcji do każdej możliwej jednostki to jeden wielki WTF. A przecież większość tych jednostek opiera się na prostych zasadach (np. metr to 100 centymetrów), czemu w pamięci (albo z kalkulatorem) można to bez problemu policzyć, wiedząc, że np. metr to 100 centymetrów, a kilogram to 1000 gramów, a w kodzie napisałeś tak, jakby każdy przypadek był inny (a tu warto pomyśleć bardziej tak, żeby objąć jedną abstrakcją więcej przypadków naraz). Tak samo w każdej funkcji importujesz ConvertMenu
(co też jest bez sensu - wystarczyłoby raz zaimportować na początku pliku ConvertMenu
).
Tylko, że to ConvertMenu to do niczego ci nie potrzebne, a nawet nie powinieneś tego importować - to ConvertMenu przecież używa Core i wywołuje jej funkcje, więc Core(które gra tu rolę biblioteki narzędziowej) w ogóle nie powinno wiedzieć nic o ConvertMenu. Po co robić cykliczne zależności?
No i tak - twoje funkcje nazywają się tak, jakby służyły do konwersji jednostek (kilogram_to_gram
) - ale w rzeczywistości jakaś większa magia się dzieje - każda funkcja u ciebie nie tylko przelicza jednostki, ale też w każdej funkcji robisz print
oraz input
oraz wyświetlasz jakieś menu (ConverterMenu.menu()
).
def feet_to_inch():
feet = float(input())
inch = feet * 12.000
print(inch)
input("\nClick enter to proceed")
import ConverterMenu
ConverterMenu.menu()
To sprawia, że twoje funkcje są nieelastyczne i się nie przydadzą do niczego poza jednym konkretnym zastosowaniem.
Bo narobiłeś się, porobiłeś te konwertery. I załóżmy, że chcesz wykorzystać ten kod w jakimś innym projekcie, więc importujesz ten plik Core.py
w jakimś innym kompletnie projekcie, w którym robisz coś, co wymaga konwersji jednostek. I co? I figa. Nie wykorzystasz tego, bo każda funkcja robi jakieś print
, jakieś menu
, nawet jeśli tego nie potrzebujesz w danym momencie, zaśmieca ci output konsoli (a to inny projekt, więc nie będziesz chciał, żeby ci printowało do konsoli, tylko chcesz skonwertować jednostkę). Na dodatek każda funkcja bierze wartość ze standardowego wejścia, a przecież w innym projekcie możliwe, że wartości będą zakodowane w skrypcie, więc ten kod będzie miał zerową użyteczność w innym zastosowaniu niż to, które masz aktualnie.
Lepszy sposób pisania to taki, w którym funkcja przyjmuje dane w argumentach i zwraca wartość:
def feet_to_inch(feet):
return feet * 12.000
Prawda, że prościej?
Skąd będą dane brane, i co będzie potem robione z danymi (np. czy będą printowane, zapamiętane do zmiennej czy cokolwiek innego), to już nie powinno funkcji obchodzić. Funkcje konwertujące jednostki powinny konwertować jednostki, a nie robić tysiąc rzeczy naraz.