šŸ šŸ“— Bagian 2 (Struktur Data, OOP & Proyek) • Modul 10 100% Standar Industri & Vokasi

Studi Kasus Proyek Komprehensif

Implementasi nyata menggabungkan seluruh konsep: Aplikasi Manajemen Keuangan / Kasir POS Berbasis Terminal dengan penyimpanan file dan OOP.

Target Pembelajaran:
  • Mampu mengintegrasikan modul-modul logika ke dalam arsitektur aplikasi utuh.
  • Membangun aplikasi CLI interaktif dengan menu navigasi perulangan.
  • Menerapkan penyimpanan persisten berbasis JSON dan penanganan error.

1. Proyek 1: Aplikasi To-Do List dengan Penyimpanan JSON

Arsitektur 3-Layer Bersih Pemisahan Peran (Separation of Concerns) Aplikasi CLI Python.
Gambar 10.1: Arsitektur 3-Layer Bersih Pemisahan Peran (Separation of Concerns) Aplikasi CLI Python.

Aplikasi manajemen daftar tugas harian lengkap dengan fitur Tambah, Lihat, Tandai Selesai, Hapus, dan simpan otomatis ke file todos.json.

python (todo_app.py)
import json
import os

FILE_STORAGE = "todos.json"

def muat_tugas():
    if not os.path.exists(FILE_STORAGE):
        return []
    try:
        with open(FILE_STORAGE, "r", encoding="utf-8") as f:
            return json.load(f)
    except Exception:
        return []

def simpan_tugas(daftar):
    with open(FILE_STORAGE, "w", encoding="utf-8") as f:
        json.dump(daftar, f, indent=4)

def main():
    tugas_list = muat_tugas()

    while True:
        print("\n=== APLIKASI TO-DO LIST ===")
        print("1. Lihat Daftar Tugas")
        print("2. Tambah Tugas Baru")
        print("3. Tandai Tugas Selesai")
        print("4. Hapus Tugas")
        print("5. Keluar")
        
        pilihan = input("Pilih menu (1-5): ").strip()

        if pilihan == "1":
            if not tugas_list:
                print("[!] Belum ada tugas yang tersimpan.")
            else:
                print("\nDAFTAR TUGAS ANDA:")
                for idx, t in enumerate(tugas_list, 1):
                    status = "[āœ”ļø Selesai]" if t["selesai"] else "[ā³ Tertunda]"
                    print(f"{idx}. {status} {t['judul']}")

        elif pilihan == "2":
            judul = input("Masukkan nama tugas baru: ").strip()
            if judul:
                tugas_list.append({"judul": judul, "selesai": False})
                simpan_tugas(tugas_list)
                print(f"[+] Tugas '{judul}' berhasil ditambahkan!")

        elif pilihan == "3":
            if not tugas_list:
                print("[!] Tidak ada tugas untuk diselesaikan.")
                continue
            nomor = int(input("Nomor tugas yang selesai: "))
            if 1 <= nomor <= len(tugas_list):
                tugas_list[nomor - 1]["selesai"] = True
                simpan_tugas(tugas_list)
                print("[+] Status tugas diperbarui menjadi Selesai!")

        elif pilihan == "4":
            nomor = int(input("Nomor tugas yang ingin dihapus: "))
            if 1 <= nomor <= len(tugas_list):
                dihapus = tugas_list.pop(nomor - 1)
                simpan_tugas(tugas_list)
                print(f"[-] Tugas '{dihapus['judul']}' berhasil dihapus.")

        elif pilihan == "5":
            print("Terima kasih telah menggunakan aplikasi!")
            break
        else:
            print("[X] Pilihan tidak valid!")

if __name__ == "__main__":
    main()

2. Proyek 2: Mini Game Tebak Angka Acak

Siklus Kerja Lingkungan Virtual (venv) dan Manajemen Paket pip.
Gambar 10.2: Siklus Kerja Lingkungan Virtual (venv) dan Manajemen Paket pip.

Game interaktif di mana komputer memilih angka rahasia antara 1 sampai 100 secara acak (menggunakan modul random), dan pemain diberi petunjuk "terlalu besar" atau "terlalu kecil" dengan batasan jumlah nyawa.

python (tebak_angka.py)
import random

def main_game():
    angka_rahasia = random.randint(1, 100)
    kesempatan = 7
    skor = 100

    print("========================================")
    print("šŸŽÆ SELAMAT DATANG DI GAME TEBAK ANGKA šŸŽÆ")
    print("Komputer telah memilih angka antara 1 - 100.")
    print(f"Anda memiliki {kesempatan} kesempatan menebak!")
    print("========================================")

    while kesempatan > 0:
        try:
            tebakan = int(input(f"\n[Sisa Nyawa: {kesempatan}] Masukkan tebakan Anda: "))
        except ValueError:
            print("Masukan harus berupa angka bulat!")
            continue

        if tebakan == angka_rahasia:
            print(f"\nšŸŽ‰ SELAMAT! Anda menebak dengan BENAR angka {angka_rahasia}!")
            print(f"šŸ† Skor Akhir Anda: {skor} Poin")
            return
        elif tebakan < angka_rahasia:
            print("šŸ“‰ Terlalu KECIL! Coba angka yang lebih besar.")
        else:
            print("šŸ“ˆ Terlalu BESAR! Coba angka yang lebih kecil.")

        kesempatan -= 1
        skor -= 15

    print(f"\nšŸ’€ GAME OVER! Kesempatan habis. Angka rahasianya adalah {angka_rahasia}.")

if __name__ == "__main__":
    main_game()

3. Langkah Lanjut & Roadmap Belajar Python

Peta Jalan (Roadmap) Karir dan Spesialisasi Python Professional (Web, AI, DevOps).
Gambar 10.3: Peta Jalan (Roadmap) Karir dan Spesialisasi Python Professional (Web, AI, DevOps).

Setelah menguasai seluruh materi dasar di portal ini, Anda siap melangkah ke spesialisasi tingkat lanjut:

🌐 Web Backend

Bangun API & website modern dengan framework FastAPI, Flask, atau Django.

šŸ“Š Data & AI

Olah dan visualisasikan data dengan Pandas, NumPy, Matplotlib, dan Scikit-Learn.

⚔ Otomasi & Bot

Buat skrip web scraping (BeautifulSoup, Selenium) dan bot otomatisasi tugas harian.

šŸ“‹ Cheat Sheet: Arsitektur Proyek & Entry Point
Cheat Sheet
Sintaks / Perintah Keterangan Fungsi
if __name__ == "__main__": Guard entry point standar memastikan skrip dieksekusi langsung
from pathlib import Path Manipulasi path file lintas sistem operasi secara portabel
import json Modul bawaan untuk membaca dan menyimpan data struktur JSON
json.dump(data, f, indent=2) Menyimpan struktur data Python ke dalam file format JSON
data = json.load(f) Membaca isi file JSON kembali menjadi list/dict Python
import sys; sys.exit(0) Mengakhiri jalannya program dengan kode status exit tertentu
šŸ› ļø Praktikum Terkait

Jobsheet 06: File I/O, Eksepsi & Mini Proyek Terpadu

Rancang dan jalankan mini proyek aplikasi kasir konsol atau sistem inventaris terpadu dari awal hingga akhir.

āš ļø Perangkap Pemula: Hardcoded Absolute Path pada Sistem Berbeda
Waspada Error

Menuliskan path file secara kaku (hardcoded C:\Users\...) yang dipastikan gagal dan memicu FileNotFoundError di komputer lain.

Kode Salah (Memicu Error)
# Path absolut kaku (Pasti error di komputer teman / OS Linux / Web):
with open("C:\\Users\\Budi\\Documents\\data_produk.json", "r") as f:
    data = f.read()
Solusi Benar & Aman
from pathlib import Path

# Menggunakan path relatif dinamis berbasis lokasi skrip:
BASE_DIR = Path(__file__).resolve().parent
file_path = BASE_DIR / "data_produk.json"

with open(file_path, "r", encoding="utf-8") as f:
    data = f.read()
Penyebab & Solusi: Jalur absolut mengikat program pada struktur folder satu komputer saja. Manfaatkan library bawaan pathlib.Path atau os.path agar aplikasi portabel dan dapat dijalankan di lingkungan mana pun.
šŸ’” Tips Pythonic: Entry Point if __name__ == "__main__"
Standar PEP 8

Pisahkan kode deklarasi fungsi/kelas dari eksekusi utama skrip agar kode modular dan dapat digunakan kembali.

Kurang Pythonic (Hindari)
# Kurang Pythonic (Semua kode berjalan di global namespace)
import math

print("=== APLIKASI KASIR SEDERHANA ===")
total_belanja = 0
# 100 baris logika bercampur langsung di root file...
# Jika file ini di-import oleh file lain, kode langsung berjalan liar!
Pythonic Way (Direkomendasikan)
# Pythonic (Entry Point Standar Industri)
def proses_transaksi():
    # Logika bisnis terisolasi rapi
    print("Memproses transaksi...")

def main():
    print("=== APLIKASI KASIR SEDERHANA ===")
    proses_transaksi()

if __name__ == "__main__":
    main()
Mengapa if __name__ == "__main__"? Blok ini memastikan fungsi main() hanya dieksekusi ketika file dijalankan secara langsung sebagai skrip utama, bukan saat file diimpor sebagai modul oleh program lain.
šŸŽÆ

Cek Pemahaman Mandiri

Uji pemahaman Anda terhadap konsep bab ini dengan feedback evaluasi instan.

2 Soal Pilihan Ganda
Q1

Mengapa modularitas (memisahkan kode ke dalam fungsi dan class terpisah) sangat krusial dalam membangun proyek aplikasi besar?

šŸ’” Pembahasan: Modularitas membagi kompleksitas sistem menjadi bagian-bagian kecil yang mandiri (Separation of Concerns), sehingga mudah dikembangkan, diuji, dan diperbaiki tanpa merusak komponen lain.

Q2

Format data lokal standar apa yang paling umum dan mudah diintegrasikan dengan Python untuk penyimpanan data terstruktur non-database?

šŸ’” Pembahasan: Format JSON sangat mudah dibaca manusia dan memetakan struktur Dictionary serta List Python secara alami menggunakan fungsi json.dump() dan json.load().