Menu
Coddy logo textTech

E-Öğrenme Platformu

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 88 / 91.

challenge icon

Görev

Kolay

Kursları, öğrencileri ve eğitmenleri yöneten bir E-Öğrenme Platformu inşa edelim. Bu kapsamlı meydan okuma; kalıtım (inheritance), arayüzler (interfaces), kapsülleme (encapsulation) ve tasarım desenlerini uyumlu bir sistemde bir araya getiriyor.

Kodunuzu altı dosya halinde düzenleyeceksiniz:

  • User.php — Hem öğrenciler hem de eğitmenler için temel teşkil eden soyut bir User sınıfı oluşturun. Her ikisi de public readonly olan id (int) ve name (string) için constructor promotion kullanın. Alt sınıfların uygulaması gereken soyut bir getRole(): string metodu ekleyin.
  • Student.php — User dosyasını dahil edin. User sınıfını genişleten bir Student sınıfı oluşturun. Öğrenciler, kayıt oldukları kursları özel (private) bir dizide ve her kurs için ilerlemelerini (tamamlanma yüzdesi) takip ederler. Şunları uygulayın:
    • getRole(): string"Student" değerini döndürür
    • enrollInCourse(Course $course): string — Kursun kapasitesi varsa öğrenciyi kaydeder; başarı veya başarısızlık mesajı döndürür
    • getEnrolledCourses(): array — Kayıt olunan kursların dizisini döndürür
    • updateProgress(string $courseTitle, int $percent): void — Bir kurs için ilerlemeyi ayarlar (0-100)
    • getProgress(string $courseTitle): int — İlerleme yüzdesini döndürür, kayıtlı değilse 0 döndürür
  • Instructor.php — User dosyasını dahil edin. User sınıfını genişleten bir Instructor sınıfı oluşturun. Eğitmenler kurs oluşturabilir ve yönetebilir. Şunları uygulayın:
    • getRole(): string"Instructor" değerini döndürür
    • createCourse(string $title, int $capacity): Course — Bu eğitmenin atandığı yeni bir Course nesnesi oluşturur ve döndürür
  • Course.php — Instructor dosyasını dahil edin. title (string, public readonly), instructor (Instructor, public readonly) ve capacity (int, private) için constructor promotion kullanan bir Course sınıfı oluşturun. Kayıtlı öğrencileri özel (private) bir dizide takip edin. Şunları uygulayın:
    • getCapacity(): int — Maksimum kapasiteyi döndürür
    • getEnrolledCount(): int — Mevcut kayıtlı öğrenci sayısını döndürür
    • hasCapacity(): bool — Daha fazla öğrenci kayıt olabiliyorsa true döndürür
    • addStudent(Student $student): bool — Kapasite uygunsa öğrenciyi ekler, başarı durumunu döndürür
    • getStudents(): array — Kayıtlı öğrencilerin dizisini döndürür
  • Platform.php — Course ve Student dosyalarını dahil edin. Tüm sistemi yöneten bir Platform sınıfı oluşturun. Kursları ve kullanıcıları özel (private) dizilerde saklayın. Şunları uygulayın:
    • addCourse(Course $course): void — Platforma bir kurs ekler
    • findCourse(string $title): ?Course — Başlığa göre bir kurs bulur
    • enrollStudent(Student $student, string $courseTitle): string — Bir öğrenciyi kursa kaydeder. "Course not found", "Course is full" veya "[name] enrolled in [title]" döndürün
    • getCourseStats(string $title): string"[title]: [enrolled]/[capacity] students" veya "Course not found" döndürür
  • main.php — Platform dosyasını dahil edin. Üç girdi alacaksınız: eğitmen verisi (JSON), oluşturulacak kurslar (JSON) ve gerçekleştirilecek işlemler (JSON).

    Eğitmen JSON formatı:

    {"id": 1, "name": "Dr. Smith"}

    Kurslar JSON formatı:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    İşlemler JSON formatı:

    [{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]

    Platformu, eğitmeni ve tüm kursları (eğitmenin createCourse metodunu kullanarak) oluşturun. Kursları platforma ekleyin. Ardından her bir işlemi işleyin:

    • "enroll" — Yeni bir Student oluşturun ve onu kaydedin; enrollStudent() metodundan gelen sonucu yazdırın
    • "progress" — Öğrenci ilerlemesini güncelleyin; "[name] progress in [course]: [percent]%" yazdırın
    • "stats"getCourseStats() metodundan gelen sonucu yazdırın

    Oluşturulan öğrencileri ID'lerine göre takip edin, böylece ilerlemelerini daha sonra güncelleyebilirsiniz. Her işlemin sonucunu yeni bir satıra yazdırın.

Bu meydan okuma; kalıtımın nasıl temiz bir kullanıcı hiyerarşisi oluşturduğunu, kapsüllemenin kayıt verilerini nasıl koruduğunu ve platformun kurslar, öğrenciler ve eğitmenler arasındaki ilişkileri yöneten bir koordinatör olarak nasıl hareket ettiğini göstermektedir.

Kendin dene

<?php

require_once 'Platform.php';

// Girdileri oku
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);

// TODO: Platformu oluşturun

// TODO: instructorData'dan eğitmeni oluşturun

// TODO: Eğitmenin createCourse metodunu kullanarak tüm kursları oluşturun
// ve bunları platforma ekleyin

// TODO: Oluşturulan öğrencileri ID'lerine göre takip edin
$students = [];

// TODO: Her bir işlemi işleyin
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: "enroll" işlemini yönetin
    // Yeni bir Öğrenci oluşturun ve kaydını yapın
    // enrollStudent() metodundan dönen sonucu yazdırın
    
    // TODO: "progress" işlemini yönetin
    // Öğrenci ilerlemesini güncelleyin
    // "[name] progress in [course]: [percent]%" formatında yazdırın
    
    // TODO: "stats" işlemini yönetin
    // getCourseStats() metodundan dönen sonucu yazdırın
}

?>

Nesne Yönelimli Programlama bölümündeki tüm dersler