ebSkola

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.

2.4.15. Veido modulāras programmas un funkcijas. 2.4.6. Plāno un dokumentē programmatūras izstrādes procesu.

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.

  1. Izveido failu punkti.py.
  2. Ieraksti tajā funkciju def aprekinat_bonusus(riks):, kas atgriež 15 marķierim un 5 pārējiem.
  3. Izveido otru failu main.py tajā pašā mapē.
  4. Pārliecinies, ka abi faili ir vienā mapē, nevis dažādās.
  5. Palaid punkti.py un 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.

  1. Ieraksti failā main.py pirmajā rindā import punkti.
  2. Ieraksti rezultats = punkti.aprekinat_bonusus("marķieris").
  3. Izdrukā rezultātu un palaid main.py.
  4. Izdzēs vārdu punkti. no izsaukuma un palaid vēlreiz.
  5. Pieraksti, kā sauc kļūdu, kas parādījās.
  6. 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ā.

  1. Nomaini pirmo rindu uz from punkti import aprekinat_bonusus.
  2. Izdzēs prefiksu punkti. no izsaukuma.
  3. Palaid un pārliecinies, ka rezultāts nav mainījies.
  4. Pievieno punkti.py otru funkciju, piemēram aprekinat_sodu.
  5. Mēģini to izsaukt, neko nepievienojot importa rindai, un izlasi kļūdu.
  6. Papildini importa rindu ar otro funkciju aiz komata.
  7. Pieraksti vienu secinājumu: kad ērtāks ir import, kad from 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.

  1. Izveido failu izvade.py.
  2. Ieraksti tajā funkciju, kas glīti izdrukā rezultātu ar f-string.
  3. Importē šo funkciju failā main.py.
  4. Izsauc to ar aprēķināto rezultātu.
  5. Pārbaudi, ka main.py vairs nesatur nevienu print izsaukumu.

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!")
Tu izmanto marķieris un iegūsti 15 punktus!