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!
Görev
KolayBu 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ürenenroll(Student student)ve int döndürengetEnrolledCount()metotlarını bildirmelidir.User.java: Platformdaki herhangi bir kullanıcıyı temsil eden soyut bir temel sınıf oluşturun.id(String) vename(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 birgetRole()metodu ekleyin.Student.java:Usersı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 veaddCourse(String courseId)ilegetEnrolledCourseCount()metotlarını ekleyin.toString()metodunu"Student: [name] ([enrolledCount] courses)"döndürecek şekilde geçersiz kılın (override).Instructor.java:Usersı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 vetoString()metodunu"Instructor: [name] - [specialty]"döndürecek şekilde geçersiz kılın.Course.java:Enrollablearayü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, öğrencininaddCourse()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 birgetDetails()metodu ekleyin.Main.java: Platformunuzu oluşturun! Virgülle ayrılmış komutlardan oluşan bir dize alacaksınız:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO: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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı