E-öğrenme Platformu
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 68 / 70.
Görev
KolayKursları, öğrencileri ve kayıtları yöneten bir e-öğrenme platformu inşa edelim! Bu meydan okuma, OOP hakkında öğrendiğiniz her şeyi - sınıflar, kalıtım, arayüzler, kapsülleme ve temiz bir mimaride birlikte çalışan servisler - bir araya getiriyor.
Kodunuzu beş dosya halinde düzenleyeceksiniz:
Lesson.cs:ELearning.Modelsad alanında (namespace) birLessonsınıfı oluşturun. Her dersin, yapıcı (constructor) aracılığıyla atanan salt okunurTitle(string) veDurationMinutes(int) özellikleri vardır.Course.cs:ELearning.Modelsad alanında birCoursesınıfı oluşturun. Bir kursun salt okunurId(string),Title(string) veInstructor(string) özelliklerinin yanı sıra birLessonslistesi vardır. BirAddLesson(Lesson lesson)metodu ve tüm ders sürelerinin toplamını hesaplayan salt okunur birTotalDurationözelliği ekleyin.Student.cs:ELearning.Modelsad alanında salt okunurId(int) veName(string) özelliklerine sahip birStudentsınıfı oluşturun. Öğrenciler, kurs ID'lerini tamamlanan ders sayısıyla eşleştiren özel (private) bir sözlük (dictionary) aracılığıyla ilerlemelerini takip ederler. İlerlemeyi artırmak içinCompleteLesson(string courseId)ve tamamlanan ders sayısını döndürmek için (veya kayıtlı değilse 0)GetProgress(string courseId)metodlarını ekleyin.EnrollmentService.cs:ELearning.Servicesad alanında birEnrollmentServicesınıfı oluşturun. Bu servis, kursları ve kayıtları özel koleksiyonlar kullanarak yönetir. Şunları uygulayın:AddCourse(Course course)- platforma bir kurs eklerEnroll(Student student, string courseId)- kayıt başarılı olursatrue, kurs mevcut değilse veya öğrenci zaten kayıtlıysafalsedöndürürGetEnrolledCourses(Student student)- öğrencinin kayıtlı olduğu kurs ID'lerinin bir listesini döndürürGetCourse(string courseId)- kursu döndürür veya bulunamazsanulldöndürür
Program.cs: Dersleri olan kurslar oluşturarak, öğrencileri kaydederek, ilerlemeyi takip ederek ve girdilere göre sonuçları görüntüleyerek her şeyi bir araya getirin.
Aşağıdaki girdileri alacaksınız:
- Oluşturulacak kurs sayısı
- Her kurs için: ID, başlık, eğitmen, ders sayısı ve ardından her ders için: başlık ve süre (dakika)
- Öğrenci ID'si ve adı
- Gerçekleştirilecek işlem sayısı
- Her işlem için: işlem türü (
enroll,complete,progressveyainfo) ve ardından kurs ID'si
Çıktı formatları:
enroll:Enrolled in: {CourseTitle}veyaEnrollment failed: {courseId}yazdırıncomplete:Completed lesson in {CourseTitle}yazdırın (ilerlemeyi 1 artırın)progress:{CourseTitle}: {completed}/{total} lessonsyazdırıninfo:{CourseTitle} by {Instructor} - {TotalDuration} minutesyazdırın
Örneğin, girdiler şunlarsa:
2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999Çıktı şu şekilde olmalıdır:
Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999Servisin öğrenciler ve kurslar arasındaki ilişkiyi nasıl yönettiğine, her sınıfın ise kendi sorumluluklarını nasıl yerine getirdiğine dikkat edin. Öğrenci kendi ilerlemesini takip eder, kurslar toplam sürelerini hesaplar ve kayıt servisi her şeyi koordine eder - sorumlulukların temiz bir şekilde ayrılması (separation of concerns)!
Kendin dene
using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;
class Program
{
public static void Main(string[] args)
{
// Kurs sayısını oku
int numCourses = Convert.ToInt32(Console.ReadLine());
// TODO: Bir EnrollmentService örneği oluşturun
// TODO: Her bir kursu dersleriyle birlikte okuyun ve oluşturun
// Her kurs için: ID, başlık, eğitmen ve ders sayısını oku
// Her ders için: başlık ve süre oku
// Dersleri kursa ekle, ardından kursu servise ekle
// Öğrenci bilgilerini oku
int studentId = Convert.ToInt32(Console.ReadLine());
string studentName = Console.ReadLine();
// TODO: Bir Student örneği oluşturun
// İşlem sayısını oku
int numOperations = Convert.ToInt32(Console.ReadLine());
// TODO: Her bir işlemi işle
// Her işlem için: eylem ve courseId oku
// Şunları yönet: enroll, complete, progress, info
// Eyleme göre uygun mesajı yazdır
}
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları