Witam, od dość niedawna robię mały projekt, który w przyszłości chcę jak najbardziej rozbudować, aby zyskać jakiekolwiek doświadczenie z projektami dłuższymi niż napisanie--->działa---->koniec.
Ok, to tak na szybko
Moje pytanie zaczyna się od tego, iż nie wiem czy poprawnie wykorzystałem try i except oraz czy takie rozwiązanie mogę pozwolić sobie stosować tylko w takich mikro projektach,czy jest to janusz programowania.
Na dłuższą metę się wykończysz. Ogółem to owszem, jest to mocny janusz programowania:
-
if 'kaczka' == 'obwarzanek':
jest tak samo dobre jak if 5 == 3:
.
- zamiast rzutować do int i porównywać na liczbach możesz swoje 'opcje' przechowywać jako tekst i tym sposobem uniknąć
- ergo blok
try .. except
jest niepotrzebny
- skoro jest niepotrzebny to jednak warto się go pozbyć
Generalnie w idealnym świecie nie powinieneś musieć zawracać sobie głowy wyjątkami. Masz dość prosty przypadek i możesz łatwo uczynić krok w kierunku idealnego świata, pisząc kod który będzie jednocześnie:
- prostszy
- bardziej czytelny
- bardziej idiotoodporny
- bez wyjątkowo wyjątkowej dziabaniny gdzie
try
except
a final
em pogania
Obsługę wyjątków zarezerwuj sobie na sytuacje, gdzie faktycznie coś może pójść nie tak i nie masz na to wpływu np. łączysz się z serwerem i nie masz wpływu na to, że serwer przestał odpowiadać -> to jest wyjątkowa sytuacja
Byłbym wdzięczny za wskazanie innych problemów w tym "frontend'dzie"
:D
def menu():
print(" Menu")
print("1.Temperature Scales")
print("2.Weight Scales")
print("3.Length Scales")
print("4.Percents")
print("5.Figure Fields")
print("6.Fibonacci Numbers")
print("7.Time Scales")
*ekhm* multiline string *ekhm*
*ekhm* biblioteka standardowa*ekhm*
*ekhm* wspomagajki do formatowania (np wyśrodkowania) tekstu w kolumnie*ekhm*
try:
choice = int(input("Enter the category number you are interested in:"))
Jak już mówiłem - to jest niepotrzebne
if choice == 1:
os.system('cls')
print("You selected a Temperature Scales")
Absolutnie wszędzie wołasz os.system('cls')
. Wiem, że wychodzi więcej linijek kodu, więc nie wygląda tak biednie, ale zdecydowanie warto jest wyciągać powtarzające się rzeczy przed blok warunkowy. Trochę kontaktu z większymi projektami i będzie Cię głowa boleć na samą myśl o tym, że trzeba napisać dużo kodu, a potem lekki ból przekształci się w migreny, gdy trzeba go będzie utrzymywać (czytaj: wracać do czegoś co napisałeś 3 miesiące wcześniej i poprawiać jakiegoś buga albo dokładać nowy ficzer)
elif choice == 2:
os.system('cls')
print("You selected a Weight Scales")
elif choice == 3:
os.system('cls')
print("You selected a Length Scales")
elif choice == 4:
os.system('cls')
print("You selected a Percents")
elif choice == 5:
os.system('cls')
print("You selected a Figure Fields")
elif choice == 6:
os.system('cls')
print("You selected a Fibonacci Numbers")
elif choice == 7:
os.system('cls')
print("You selected a Time Scales")
A gdybyś pisał bardzo rozbudowane narzędzie i miał 1000 różnych opcji, to strzeliłbyś if...else
na 1000 rozgałęzień?
Bierzesz słownik
choices = {
'first choice': 'You chose first choice',
'second choice': 'You chose second choice'
}
Wyciągasz odpowiedni tekst (lub wartość czegoś, lub obiekt, lub funkcję do wywołania, lub cokolwiek jest Ci potrzebne - słowniki są w tym względzie naprawdę elastyczne) i go używasz.
Czy to poprzez np. sprawdzenie czy input użytkownika jest kluczem:
if x in choices.keys():
y = choices[x]
# użyj y
else:
# zgłoś błąd etc
Czy np. poprzez dict.get()
:
y = choices.get(x)
if y is not None:
# użyj y
else:
# zgłoś błąd etc
else:
print("")
input("Please, Try again")
os.system('cls')
menu()
Pomijając wszystko inne, drukowanie na ekran tuż przed wyczyszczeniem jest bez sensu :]
except ValueError:
print("")
input("Please, Try again")
os.system('cls')
menu()
Taka bezwarunkowa rekurencja to przepis na kłopoty. Bezwarunkowa rekurencja to przepis na większe kłopoty. Bezwarunkowa rekurencja w bloku except to już konkretny bałagan w sterowaniu i logice aplikacji - skoro menu
to jakaś normalna część aplikacji robiąca rzeczy, to dlaczego jest wywoływana w bloku except
który jest przeznaczony dla nienormalnych sytuacji? Ten blok służy do obsłużenia wyjątku.
menu()
Zapoznaj się z pojęciem nieskończonej pętli, jeśli chcesz mieć... nieskończoną pętlę. Nieskończona rekurencyjna pętla kiedyś wybuchnie Ci w twarz, bo zabraknie miejsca na stosie.