2013-07-20 8 views
9

İki hafta boyunca 8. sınıf 9. sınıflar için temel bilgisayar programlamayı öğretiyorum ve dün onlara Python'da nasıl basit bir metin-macera oyunları yapabileceklerini göstermeye çalıştım.Python'da yeni programlama öğrencilerine kafa karıştırmadan global kullanmaktan kaçının mı?

Sahneler sonra uygun işlevi bulmak için globals() geçirilen ve daha sonra çağrılan bir sonraki gitmek istiyorum oyuncuyu soran bazı baskı tablolar ve sonra input() bir çağrı, oluşan fonksiyonlar, (örneğin dragons_cave()) bulunmaktadır. İdeal olmadığını biliyorum (hangi noktada büyük fonksiyon zinciri problem olmaya başlıyordu?) Ama aklımdan geçenlerin sadece küçük bir el atışı yaparken en basitleri olduğu görülüyor.

Sorunum global durumla - örn. Oyuncu bir sahnede bir anahtar alır ve ancak başka bir sahnede kapıyı açabilir. Python, dizeler veya boole gibi global immutables'lere sahip olduğumda, işlevin başında global anahtar sözcüğünü kullanmamı istiyor.

global hasKey 
hasKey = True 

ben bunu oldukça iyiyim, ama ben global üzerine hoş ve her zaman üstün bir karşılığı yoktur ki (İnternet'teki diğer yerler arasında Stackoverflow dan aldı) belirsiz bir duygusu var. Küresel bir sözlüğe sahip olabilirim ya da her şeyi bir sınıfa sığdırabilirdim, ancak bu seçenekleri açıkça benim çocuklarıma (değişkenlerin sonuçlarıyla ilgili düşünenleri) savunabilsem de emin değilim.

Kullandığım her ne olursa olsun, çocuklarıma bu şekilde neden bu şekilde yaptığımızı ve neden bu şekilde yapılmasının gerekli olduğunu açık bir şekilde anlatabiliyorum. global, bu özelliklerin her ikisine de sahip gibi görünüyor, ancak kötü mü?

+0

Küreselleşmeyi önlemek için pek çok iyi neden vardır, ayrıca globileri kullanmak için pek çok mükemmel neden vardır. sadece benim 2c ... yeni başlayanlar için daha kolay bir kavramdır ama gelecekte kötü alışkanlıklara yol açabilir. –

+0

Size oy vermek istiyorum dürüst ve bu konuda önünüzde. "Daha başarılı programcılar olduğunuzda, daha çok globals kullanmaktan daha iyi yöntemler olduğunu öğreneceksiniz. Şimdilik, temelleri öğrenirken işleri basit tutmamıza yardımcı oluyor.Bunu nasıl yapmadan öğrenmek istersen, dersten sonra bana sor. "Bildiğim çok az kişi ayakkabılarını giymeyi öğrendi. –

cevap

7

Ben öğrenme OO başlaması için teşvik ediyorum

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

bir oyun zor bir kavram (hatta bir metin macera) 'dir Dürüst olmak gerekirse. Ama onları doğrudan OO konseptlerinde başlatacağım, uzun vadede bundan daha fazla faydalanacaklar.

Verilen bu örnek çok küçüktür ve çok fazla uygulama ayrıntısı bırakır.

Bir ilişkisiz ama daha iyi OO örnek olacaktır:

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

OO tasarımını cesaretlendirmek iyi bir fikir olsa da, bu sınıflardan çok emin değilim. sınıf değişkenlerinin iyi örnekleri: Bu sadece temelde sadece bir sınıf ad alanında bir araya getirilmiş bir globals (hiçbir şeyden daha iyi değil, ama yine de gerçekten harika değil). Alt sınıflardaki sınıf değişkenlerini geçersiz kılabileceğinizi sanıyorum, ama bu çok da değil kodlama ortak tarzı – Blckknght

+0

Sadece basit bir OO ve kalıtım örneğini göstermek istedim ve bu açıkça bu prensipleri (en azından imho) gösterir. Gerçekte sınıflar çok daha fazla olabilir –

+0

ne kadar güzel örnek! – Martian2049

7

(hiçbir OO) mümkün olduğunca basit yürümesini istiyoruz ve global anahtar kelimeyi tanıtan önlemek istiyorsanız varsayarsak, bunun yerine bir devlet sözlüğü kullanabilirsiniz ve orada değişkenleri atayın. Bu dict erişim yana

state['hasKey'] = True 

Eğer global anahtar kelimeyi almaktan kaçınması değişken atama değildir ve aynı zamanda bir dict yine Tabii

(anahtarlar vb kontrol) nasıl kullanılacağını öğretir global bir değişken kullanın ve iyi kodlama stili konusunu ele almayın.

İlgili konular