2013-07-20 12 views
9

Uczę matematyków 8- 9 podstawowych programów komputerowych przez dwa tygodnie, a wczoraj próbowałem pokazać im, jak mogą tworzyć prawdziwe proste przygodowe gry tekstowe w Pythonie.Unikaj używania globalnego, nie myląc nowych studentów programowania w Pythonie?

Sceny są funkcje (np dragons_cave()), które składają się z niektórych stwierdzeń druku, a następnie wezwanie do input(), prosząc odtwarzacza gdzie chcą iść dalej, który następnie zostaje przekazana do globals() aby znaleźć odpowiednią funkcję, a następnie tzw. Wiem, że to nie jest idealne (w którym momencie ogromny łańcuch funkcji zaczynałby stawać się problemem?), Ale z tego, co przeszło mi przez myśl, wydaje się być dla nich najprostszy, przy jednoczesnym niewielkim handwavingu.

Mój problem dotyczy stanu globalnego - np. gracz otrzymuje klucz w jednej scenie i tylko wtedy może odblokować bramę w innej scenie. Kiedy mam globalne niezmienne, takie jak łańcuchy lub booleany, Python chce, abym użył słowa kluczowego global na początku funkcji.

global hasKey 
hasKey = True 

jestem całkiem w porządku z tym, ale mam niejasne poczucie (odebrał od Stackoverflow wśród innych miejsc w Internecie), który global jest mile widziana i zawsze ma wyższą odpowiednika. Mógłbym mieć słownik globalny lub zawinąć wszystko w klasie, ale nie jestem pewien, czy mógłbym bronić tych opcji wyraźnie moim dzieciom (które wciąż zastanawiają się nad implikacjami zmiennych).

Niezależnie od tego, czego używam, chcę móc wyjaśnić bezpośrednio moim dzieciom, dlaczego robimy to w ten sposób i dlaczego należy to robić w ten sposób. global wydaje się mieć obie te właściwości, ale czy to jest złe?

+0

Istnieje wiele dobrych powodów, aby uniknąć globalnego, istnieje również wiele doskonałych powodów, aby korzystać z globali. tylko moje 2c ... dla początkujących jest to łatwiejsza do zrozumienia koncepcja, ale może prowadzić do złych nawyków w przyszłości. –

+0

Chciałbym zagłosować, po prostu uczciwie i z góry o tym. "Kiedy stajesz się bardziej doświadczonym programistą, dowiesz się, że istnieją lepsze metody niż używanie globaliów, na razie pomaga nam to zachować prostotę, podczas gdy uczymy się podstaw.Jeśli chcesz dowiedzieć się, jak to zrobić bez globali, zapytaj mnie po lekcji. "Niewiele osób, które znam, nauczyło się chodzić w obuwiu." –

Odpowiedz

7

Chciałbym zachęcić ich do rozpoczęcia OO Uczenie

class Location: 
    name="a place" 
    description = "A dark place. there are exits to the North and East" 
    exits = "North","East" 
    def __str__(self): 
     return "%s\n%s"%(self.name,self.description) 


class Player: 
    current_location = "Home" 
    inventory = ["Blue Key","Magic Thumbtacks"] 
    health = 100 
    name = "Unknown" 
    def __init__(self,name): 
     self.name = name 

player = Player("Player 1") 
loc = Location() 
print loc 
x = input("Input:") 

Szczerze mówiąc gra jest pojęciem trudnym (nawet przygoda tekst). Ale zacznę je bezpośrednio od koncepcji OO, na dłuższą metę skorzystają na tym więcej.

Przyznany ten przykład jest bardzo mały i pozostawia wiele szczegółów dotyczących implementacji.

niezwiązane ale lepszym przykładem OO byłoby:

class Animal: 
    voice = '...' 
    def speak(self): 
     return "A %s Says '%s'"%(self.__class__.__name__, self.voice) 

class Dog(Animal): 
    voice = "Bark, Bark" 

class Duck(Animal): 
    voice = "Quack, Quack" 

print Dog().speak() 
print Duck().speak() 
+0

Podczas gdy zachęcanie do projektowania OO to dobry pomysł, nie jestem pewien, czy zajęcia z mnóstwem zmiennych klasowych są dobrymi przykładami.To w zasadzie tylko globals ponownie, po prostu spakowany w przestrzeni nazw klasy (która jest lepsza niż nic, ale nadal nie jest naprawdę świetna). Przypuszczam, że można przesłonić zmienne klasy w podklasach, ale to nie jest bardzo wspólny styl kodowania: – Blckknght

+0

Po prostu chciałem pokazać bardzo prosty przykład OO i dziedziczenia, co jasno demonstruje te zasady (przynajmniej imho). W rzeczywistości klasy byłyby znacznie bardziej atrakcyjne, –

+0

jak piękny przykład! – Martian2049

7

Zakładając chcesz zachować rzeczy tak proste, jak to możliwe (nie OO) i chcą, aby uniknąć wprowadzenia słowa kluczowego global, można zamiast tego użyć słownika państwowej i przypisz tam zmienne.

state['hasKey'] = True 

ponieważ dostęp do tej dict nie jest przypisanie zmiennej można uniknąć wprowadzając słowa kluczowego global i jednocześnie może uczyć, jak korzystać z dict (sprawdzanie kluczy itp)

Oczywiście nadal używaj zmiennej globalnej i tak naprawdę nie rozwiązuj problemu dobrego stylu kodowania.

Powiązane problemy