Pytanie o poprawność i prawidłowość kodu

Odpowiedz Nowy wątek
2019-11-02 14:40
0

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.

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.

Byłbym wdzięczny za wskazanie innych problemów w tym "frontend'dzie"

Na razie jest to tylko wersja konsolowa i bardzo prymitywna, więc proszę traktować te spacje przed napisem menu za nieśmieszny żart :D

import Converter
import os

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")

    try:

        choice = int(input("Enter the category number you are interested in:"))

        if choice == 1:
            os.system('cls')
            print("You selected a Temperature Scales")
        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")
        else:
            print("")
            input("Please, Try again")
            os.system('cls')
            menu()

    except ValueError:
        print("")
        input("Please, Try again")
        os.system('cls')
        menu()

menu()
popraw tagi, python i noob mogłyby opisywać 95% wątków w tej kategorii - superdurszlak 2019-11-02 15:14
A czy tagi nie mają opisywać stanu faktycznego? W takim razie na jakie tagi zamienić? - Attrazione 2019-11-02 15:21
no tak, ale zbyt ogólne tagi są bezużyteczne - superdurszlak 2019-11-02 15:55
Dodam zaraz jakieś bardziej sprecyzowane - Attrazione 2019-11-02 15:57

Pozostało 580 znaków

2019-11-02 15:42
0
Attrazione napisał(a):

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:

  1. if 'kaczka' == 'obwarzanek': jest tak samo dobre jak if 5 == 3:.
  2. zamiast rzutować do int i porównywać na liczbach możesz swoje 'opcje' przechowywać jako tekst i tym sposobem uniknąć
  3. ergo blok try .. except jest niepotrzebny
  4. 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 excepta finalem 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.


Nie znam się, ale się wypowiem

Pozostało 580 znaków

2019-11-02 16:12
0
superdurszlak napisał(a):
Attrazione napisał(a):

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:

  1. if 'kaczka' == 'obwarzanek': jest tak samo dobre jak if 5 == 3:.
  2. zamiast rzutować do int i porównywać na liczbach możesz swoje 'opcje' przechowywać jako tekst i tym sposobem uniknąć
  3. ergo blok try .. except jest niepotrzebny
  4. 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 excepta finalem 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.

Bardzo dziękuje za odpowiedź, poprawię ten pożal się boże kod, obiecuje :D

        else:
            print("")
            input("Please, Try again")
            os.system('cls')
            menu()

Pomijając wszystko inne, drukowanie na ekran tuż przed wyczyszczeniem jest bez sensu :]

Tak w sumie to tylko miało wyglądać w konsoli ładnie, a te drukowanie to tylko, żeby estetycznie to wyglądało.

A najbardziej dziękuje za opcję z słownikami, ponieważ jest ona wspaniała i tego mi brakowało.

Jeszcze raz dzięki za taką "krótką" odpowiedź na szybko :D

jeszcze jedno: odpowiadając nie cytuj całego posta, jeśli nie jest to do niczego potrzebne (np. nie odnosisz się do jakiegoś konkretnego fragmentu), szczególnie gdy jest długi - superdurszlak 2019-11-02 16:36
Nie wiedziałem jak cię oznaczyć, że ci odpowiadam bez cytowania całego posta. - Attrazione 2019-11-02 17:51
tak: @nick albo @{nick ze spacjami} - superdurszlak 2019-11-02 17:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0