Menu
Coddy logo textTech

E-Öğrenme Platformu

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

Final Meydan Okumalar bölümüne hoş geldiniz! Bu meydan okumalar, bu kurs boyunca öğrendiğiniz tüm OOP kavramlarındaki uzmanlığınızı test etmek için tasarlanmıştır.

Bu meydan okumada; kalıtım, arayüzler, çok biçimlilik, kapsülleme ve tasarım desenlerini uyumlu bir uygulama içinde birleştiren bir E-Öğrenme Platformu sistemi inşa edeceksiniz.

Platformunuz kurslar, öğrenciler ve eğitmenler arasındaki ilişkileri modellemelidir. Bir User temel sınıfının Student ve Instructor sınıfları tarafından nasıl genişletilebileceğini, kursların dersleri nasıl içerdiğini ve öğrenciler ile kurslar arasındaki kayıt takibinin nasıl çalıştığını düşünün.

Hangi OOP prensiplerinin geçerli olduğunu düşünün: kullanıcı verilerini korumak için kapsüllemeyi (encapsulation), ortak davranışları paylaşmak için kalıtımı (inheritance), Enrollable veya Completable gibi sözleşmeleri tanımlamak için arayüzleri (interfaces) ve farklı kullanıcı türlerini tek tipte işlemek için çok biçimliliği (polymorphism) kullanın.

Öğrendiğiniz her şeyi uygulamada başarılar!

challenge icon

Görev

Kolay

Bu kurs boyunca ustalaştığınız tüm OOP kavramlarını bir araya getiren bir E-Öğrenme Platformu inşa edelim! Kalıtım, arayüzler, polimorfizm ve kapsülleme kullanarak kurslar, öğrenciler ve eğitmenler arasındaki ilişkileri modelleyen bir sistem oluşturacaksınız.

Kodunuzu altı dosya halinde düzenleyeceksiniz:

  • Enrollable.java: Kayıt işlemleri için sözleşmeyi tanımlayan bir arayüz oluşturun. Boolean döndüren enroll(Student student) ve int döndüren getEnrolledCount() metotlarını bildirmelidir.
  • User.java: Platformdaki herhangi bir kullanıcıyı temsil eden soyut bir temel sınıf oluşturun. id (String) ve name (String) için özel (private) alanlar, her ikisini de başlatan bir yapıcı (constructor), uygun getter metotları ve kullanıcının rolünü açıklayan bir String döndüren soyut bir getRole() metodu ekleyin.
  • Student.java: User sınıfını genişleten bir sınıf oluşturun. Kayıt olunan kurs ID'lerini takip etmek için özel bir ArrayList ekleyin. Üst sınıf yapıcısını çağıran bir yapıcı ekleyin, getRole() metodunu "Student" döndürecek şekilde uygulayın ve addCourse(String courseId) ile getEnrolledCourseCount() metotlarını ekleyin. toString() metodunu "Student: [name] ([enrolledCount] courses)" döndürecek şekilde geçersiz kılın (override).
  • Instructor.java: User sınıfını genişleten bir sınıf oluşturun. specialty (String) için özel bir alan ekleyin. id, name ve specialty alanlarını alan bir yapıcı ekleyin, getRole() metodunu "Instructor" döndürecek şekilde uygulayın, specialty için bir getter ekleyin ve toString() metodunu "Instructor: [name] - [specialty]" döndürecek şekilde geçersiz kılın.
  • Course.java: Enrollable arayüzünü uygulayan bir sınıf oluşturun. courseId (String), title (String), instructor (Instructor) ve kayıtlı öğrencilerden oluşan bir ArrayList için özel alanlar ekleyin. Yapıcı; courseId, title ve instructor parametrelerini alır. enroll(Student student) metodunu, öğrenciyi listeye ekleyecek, öğrencinin addCourse() metodunu bu kursun ID'si ile çağıracak ve true döndürecek şekilde uygulayın. getEnrolledCount() metodunu uygulayın. "[courseId] [title] by [instructorName]" döndüren bir getDetails() metodu ekleyin.
  • Main.java: Platformunuzu oluşturun! Virgülle ayrılmış komutlardan oluşan bir dize alacaksınız:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    Eğitmen, öğrenci ve kurs koleksiyonlarını yönetin. Her komutu işleyin ve şunları yazdırın:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: Kullanıcının toString() çıktısını yazdırın

    Tüm komutlardan sonra, --- Platform Summary --- yazdırın ve ardından her kursun detaylarını ve kayıt sayısını [courseDetails] - [count] student(s) formatında listeleyin.

Bir girdi alacaksınız: virgülle ayrılmış komut dizesi.

Örneğin, ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001 girdisi ile çıktınız şöyle olmalıdır:

Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)

Bu meydan okuma; kalıtım (User hiyerarşisi), arayüzler (Enrollable), polimorfizm (kendi toString uygulamalarına sahip farklı kullanıcı türleri) ve kapsüllemeyi (kontrollü erişime sahip özel alanlar) uyumlu bir sistemde birleştirir!

Kopya kağıdı

Bu final görevi, birden fazla OOP kavramını uyumlu bir sistemde birleştirir:

Arayüzler (Interfaces)

Sınıfların uygulaması gereken davranışlar için sözleşmeler tanımlayın:

public interface Enrollable {
    boolean enroll(Student student);
    int getEnrolledCount();
}

Soyut Sınıflar (Abstract Classes)

Paylaşılan davranışlara ve soyut metotlara sahip temel sınıflar oluşturun:

public abstract class User {
    private String id;
    private String name;
    
    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public abstract String getRole();
}

Kalıtım (Inheritance)

Özelleştirilmiş türler oluşturmak için temel sınıfları genişletin:

public class Student extends User {
    private ArrayList<String> enrolledCourses;
    
    public Student(String id, String name) {
        super(id, name);
        this.enrolledCourses = new ArrayList<>();
    }
    
    @Override
    public String getRole() {
        return "Student";
    }
}

Arayüzleri Uygulama (Implementing Interfaces)

Sınıflar, sözleşmeleri yerine getirmek için arayüzleri uygulayabilir:

public class Course implements Enrollable {
    private ArrayList<Student> enrolledStudents;
    
    @Override
    public boolean enroll(Student student) {
        enrolledStudents.add(student);
        student.addCourse(courseId);
        return true;
    }
    
    @Override
    public int getEnrolledCount() {
        return enrolledStudents.size();
    }
}

Çok Biçimlilik (Polymorphism)

Farklı sınıflar, özelleştirilmiş davranış sağlamak için metotları geçersiz kılabilir:

@Override
public String toString() {
    return "Student: " + name + " (" + enrolledCourses.size() + " courses)";
}

Kapsülleme (Encapsulation)

Veri bütünlüğünü korumak ve nesneler arasındaki ilişkileri sürdürmek için metotlar aracılığıyla kontrollü erişime sahip özel alanlar kullanın.

Kendin dene

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Eğitmenleri, öğrencileri ve kursları saklamak için koleksiyonlar oluşturun
        // Hint: Kolay arama için id'yi anahtar olarak kullanan HashMap kullanın
        
        // TODO: Bireysel komutları almak için girişi virgülle ayırın
        
        // TODO: Her komutu işleyin:
        // - ADD_INSTRUCTOR:id:name:specialty -> Eğitmen oluşturun, koleksiyona ekleyin, "Instructor added: [name]" yazdırın
        // - ADD_STUDENT:id:name -> Öğrenci oluşturun, koleksiyona ekleyin, "Student added: [name]" yazdırın
        // - ADD_COURSE:courseId:title:instructorId -> Eğitmenle birlikte kurs oluşturun, koleksiyona ekleyin, "Course added: [title]" yazdırın
        // - ENROLL:studentId:courseId -> Öğrenciyi kursa kaydedin, "[studentName] enrolled in [courseTitle]" yazdırın
        // - INFO:userId -> Kullanıcıyı (öğrenci veya eğitmen) bulun ve toString() metodunu yazdırın
        
        // TODO: Tüm komutları işledikten sonra "--- Platform Summary ---" yazdırın
        
        // TODO: Her kurs için "[courseDetails] - [count] student(s)" yazdırın
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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