using _21_ConstructorChaining.Demos.DosyaIslemleri.Models;
using System.Text;
namespace _21_ConstructorChaining.Demos.DosyaIslemleri.Bases
{
abstract class OgrenciDosyaBase
{
#region Alanlar
protected string _dosyaYolu; // Metinsel dosyanın diskteki fiziksel yolu (absolute path) alan tanımı,
// alan sub class'larda kullanılabileceğinden protected tanımladık.
#endregion
#region Constructor
protected OgrenciDosyaBase(string dosyaYolu) // Parametre olarak aldığı dosyaYolu'nu _dosyaYolu alanına atar,
// böylece dosya yolu hem bu class'ta hem de protected olduğundan sub class'larda kullanılabilir.
// Abstract class'larda base class constructor genelde protected tanımlanır.
{
_dosyaYolu = dosyaYolu;
}
#endregion
#region Methodlar
/// <summary>
/// Metin dosyası içeriğini öğrenci listesi olarak dönen sanal method.
/// </summary>
/// <returns>List<Ogrenci></returns>
public virtual List<Ogrenci> OgrencileriGetir() // Sub class'larda override edilme ihtimali olduğundan virtual tanımladık.
{
List<Ogrenci> ogrenciler = new List<Ogrenci>(); // Dosyadan okuyacağımız öğrenci bilgilerini öğrenci objeleri
// üzerinden dolduracağımız koleksiyon.
Ogrenci ogrenci; // Koleksiyona dolduracağımız her bir öğrenci.
string satir; // Metinsel dosyadaki her bir satır.
// File class'ına alternatif olarak metinsel dosya okuma işlemleri StreamReader class'ı üzerinden de yapılabilir.
#region 1. Yöntem:
//StreamReader streamReader = new StreamReader(_dosyaYolu, Encoding.UTF8); // Encoding.UTF8 parametresi yazılmasa da olur ancak
// // eğer metinsel dosya içeriğinde Türkçe karakterler
// // (utf-8 karakter kümesi) varsa karakterlerde sorun
// // yaşanmaması için kullanılması iyi olur.
//while ((satir = streamReader.ReadLine()) is not null) // Metinsel dosyadan satırlar okunduğu sürece döngü devam edecek.
//{
// ogrenci = new Ogrenci() // Satır string'ini - karakterine göre parçalayarak ilk parçasını ad, ikinci parçasını soyad
// // ve üçüncü parçasını da yaş olarak öğrenci objesi özelliklerine atıyoruz.
// {
// Adi = satir.Split('-')[0],
// Soyadi = satir.Split('-')[1],
// Yasi = int.Parse(satir.Split('-')[2])
// };
// ogrenciler.Add(ogrenci); // Öğrenci objesini koleksiyona ekliyoruz.
//}
//streamReader.Dispose(); // StreamReader objesi new'lenip işlemler bittikten sonra kapatılarak (close) Garbage Collector'a işinin bittiği belirtilir.
#endregion
#region 2. Yöntem: using Kullanımı
// using kullanıldığında obje new'lenir, süslü parantezlerle belirlenen sınır (scope: *1 ... *2) içerisinde kullanılır ve
// kapanış süslü parantezinde (*2) kapatılarak (close) dispose edilir yani Garbage Collector'a işinin bittiği belirtilir.
// Dispose methodu bulunan tüm sınıflar için aynı şekilde using kullanılabilir.
using (StreamReader streamReader = new StreamReader(_dosyaYolu, Encoding.UTF8)) // Encoding.UTF8 parametresi yazılmasa da olur ancak
// eğer metinsel dosya içeriğinde Türkçe karakterler
// (utf-8 karakter kümesi) varsa karakterlerde sorun
// yaşanmaması için kullanılması iyi olur.
{ // *1
while ((satir = streamReader.ReadLine()) is not null) // Metinsel dosyadan satırlar okunduğu sürece döngü devam edecek.
{
ogrenci = new Ogrenci() // Satır string'ini - karakterine göre parçalayarak ilk parçasını ad, ikinci parçasını soyad
// ve üçüncü parçasını da yaş olarak öğrenci objesi özelliklerine atıyoruz.
{
Adi = satir.Split('-')[0],
Soyadi = satir.Split('-')[1],
Yasi = int.Parse(satir.Split('-')[2])
};
ogrenciler.Add(ogrenci); // Öğrenci objesini koleksiyona ekliyoruz.
}
} // *2
#endregion
return ogrenciler; // Koleksiyonu dönüyoruz.
}
/// <summary>
/// Parametre olarak gönderilen öğrenciyi metin dosyasına satır olarak ekleyen sanal method.
/// </summary>
/// <param name="ogrenci"></param>
public virtual void OgrenciEkle(Ogrenci ogrenci) // Sub class'larda override edilme ihtimali olduğundan virtual tanımladık.
{
string satir = $"{ogrenci.Adi}-{ogrenci.Soyadi}-{ogrenci.Yasi}"; // Metinsel dosyaya eklenecek satır.
// File class'ına alternatif olarak metinsel dosya yazma işlemleri StreamWriter class'ı üzerinden de yapılabilir.
#region 1. Yöntem:
//StreamWriter streamWriter = new StreamWriter(_dosyaYolu, true, Encoding.UTF8); // StreamWriter constructor'ının ikinci parametresi olan
// // ve true değerini gönderdiğimiz append parametresi
// // dosyanın sonuna ekleme yapılacaksa true,
// // dosya içeriği üzerine yazılacaksa (overwrite) false gönderilir.
// // Encoding.UTF8 parametresi yazılmasa da olur ancak
// // eğer metinsel dosya içeriğinde Türkçe karakterler
// // (utf-8 karakter kümesi) varsa karakterlerde sorun
// // yaşanmaması için kullanılması iyi olur.
//streamWriter.Write("\n" + satir); // Write methodu ile satır dosyaya yazılır.
//streamWriter.Dispose(); // StreamWriter objesi new'lenip işlemler bittikten sonra kapatılarak (close) Garbage Collector'a işinin bittiği belirtilir.
#endregion
#region 2. Yöntem: using Kullanımı
// using kullanıldığında obje new'lenir, süslü parantezlerle belirlenen sınır (scope: *1 ... *2) içerisinde kullanılır ve
// kapanış süslü parantezinde (*2) kapatılarak (close) dispose edilir yani Garbage Collector'a işinin bittiği belirtilir.
// Dispose methodu bulunan tüm sınıflar için aynı şekilde using kullanılabilir.
using (StreamWriter streamWriter = new StreamWriter(_dosyaYolu, true, Encoding.UTF8)) // StreamWriter constructor'ının ikinci parametresi olan
// ve true değerini gönderdiğimiz append parametresi
// dosyanın sonuna ekleme yapılacaksa true,
// dosya içeriği üzerine yazılacaksa (overwrite) false gönderilir.
// Encoding.UTF8 parametresi yazılmasa da olur ancak
// eğer metinsel dosya içeriğinde Türkçe karakterler
// (utf-8 karakter kümesi) varsa karakterlerde sorun
// yaşanmaması için kullanılması iyi olur.
{ // *1
streamWriter.Write("\n" + satir); // Write methodu ile satır dosyaya yazılır.
} // *2
#endregion
}
#endregion
}
}