4.3 Modularitāte un koda sadalīšana
Stundas uzdevums: Izprast programmatūras arhitektūras pamatprincipus un sadalīt spēles loģiku vairākos izolētos failos, izveidojot pārskatāmu un profesionālu projekta struktūru.
70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - sadali kodu divos failos · 2. uzdevums (~25 min) - importē moduli un izsauc tā funkcijas · 3. uzdevums (~20 min) - salīdzini import un from import. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: atver VS Code projekta mapē. Šajā stundā strādāsi ar diviem failiem vienlaikus, tāpēc tiem jābūt vienā mapē.
Teorija: Koda arhitektūra un moduļi
Python valodā jebkurš fails ar .py paplašinājumu ir Module (Modulis). Koda dalīšana moduļos padara to lasāmu, novērš viena milzīga faila veidošanos un ļauj komandai strādāt vienlaicīgi pie dažādām projekta daļām.
- Absolute Import (Pilnā importēšana): Izmanto
import fails. Ielādē visu moduli. Izsaucot funkciju, obligāti jānorāda moduļa nosaukums.# Importē visu moduli import ieroci # Funkcijas izsaukums prasa moduļa prefiksu ieroci.saut() - Specific Import (Specifiskā importēšana): Izmanto
from fails import funkcija. Ielādē tikai konkrētu komponenti. Funkciju var izsaukt tieši, bet jāuzmanās no nosaukumu konfliktiem ar esošo kodu.# Importē tikai vienu funkciju from ieroci import saut # Funkciju var izsaukt tieši saut()
Visiem Tavas spēles moduļiem jāatrodas vienā Directory (Mapē), lai dators varētu tos automātiski atrast bez sarežģītas ceļu konfigurēšanas.
Praktiskie uzdevumi
1. uzdevums -
Sadali kodu divos failos
Beigās tavs projekts sastāvēs no moduļa un galvenā skripta.
- Izveido failu
punkti.py. - Ieraksti tajā funkciju
def aprekinat_bonusus(riks):, kas atgriež 15 marķierim un 5 pārējiem. - Izveido otru failu
main.pytajā pašā mapē. - Pārliecinies, ka abi faili ir vienā mapē, nevis dažādās.
- Palaid
punkti.pyun pieraksti, ko tas izdrukā.
Gatavs, kad: abi faili ir vienā mapē, un punkti.py palaižot neizdrukā neko, jo tajā ir tikai definīcija.
2. uzdevums -
Importē moduli un izsauc tā funkcijas
Beigās viens fails izmantos otra faila kodu.
- Ieraksti failā
main.pypirmajā rindāimport punkti. - Ieraksti
rezultats = punkti.aprekinat_bonusus("marķieris"). - Izdrukā rezultātu un palaid
main.py. - Izdzēs vārdu
punkti.no izsaukuma un palaid vēlreiz. - Pieraksti, kā sauc kļūdu, kas parādījās.
- Ieliec prefiksu atpakaļ un pārliecinies, ka kods atkal strādā.
Gatavs, kad: ar prefiksu punkti. kods strādā, bez tā rodas NameError.
3. uzdevums -
Salīdzini import un from import
Beigās tu zināsi divus veidus, kā ievest funkciju savā failā.
- Nomaini pirmo rindu uz
from punkti import aprekinat_bonusus. - Izdzēs prefiksu
punkti.no izsaukuma. - Palaid un pārliecinies, ka rezultāts nav mainījies.
- Pievieno
punkti.pyotru funkciju, piemēramaprekinat_sodu. - Mēģini to izsaukt, neko nepievienojot importa rindai, un izlasi kļūdu.
- Papildini importa rindu ar otro funkciju aiz komata.
- Pieraksti vienu secinājumu: kad ērtāks ir
import, kadfrom import.
Gatavs, kad: abi importa veidi dod vienu rezultātu, un tu vari nosaukt vienu priekšrocību katram.
Papildu uzdevums - Pievieno trešo moduli
Ja pamatdarbs ir gatavs, sadali projektu vēl sīkāk.
- Izveido failu
izvade.py. - Ieraksti tajā funkciju, kas glīti izdrukā rezultātu ar f-string.
- Importē šo funkciju failā
main.py. - Izsauc to ar aprēķināto rezultātu.
- Pārbaudi, ka
main.pyvairs nesatur nevienuprintizsaukumu.
Gatavs, kad: main.py tikai savieno moduļus, bet aprēķini un izdruka dzīvo atsevišķos failos.
Biežākās kļūdas (un kā tās labot):
- ModuleNotFoundError (Moduļa neatrašanas kļūda): Rodas, ja faila nosaukums ierakstīts nepareizi vai fails neatrodas vienā mapē ar skriptu, kurš to mēģina importēt.
# Slikti: (Ja fails patiesībā saucas ui.py) import UI_modulis # Labi: import ui - Circular Import (Cikliskais imports): Fails A importē B, bet fails B tajā pašā laikā importē A. Programma iesprūst bezgalīgā cilpā un izmet kļūdu.
# Slikti: # (Failā main.py): import kauja # (Failā kauja.py): import main # Labi: # Atstāj galveno loģiku main.py, bet palīgmoduļi tikai veic aprēķinus. - Sistēmas nosaukumu konflikti (Shadowing): Savas mapes failu nosaukšana iebūvēto bibliotēku vārdos (piemēram,
random.py). Python ignorēs sistēmas moduli un lādēs Tavu tukšo failu.# Slikti: # Sava faila nosaukšana par "random.py" un tad rakstīšana: import random # Python ielādēs tavu failu, un random.randint() nedarbosies. # Labi: # Faila nosaukums: "mans_ģenerators.py"
Koda piemērs: Koda sadalīšana
# ==========================================
# 1. fails: punkti.py (Modulis aprēķiniem)
def aprekinat_bonusus(riks):
if riks == "marķieris":
return 15
return 5
# ==========================================
# 2. fails: main.py (Galvenais skripts)
import punkti
speletaja_riks = "marķieris"
# Izsaucam funkciju, norādot moduļa vārdu "punkti"
bonuss = punkti.aprekinat_bonusus(speletaja_riks)
print(f"Tu izmanto {speletaja_riks} un iegūsti {bonuss} punktus!")