Bir cümle, kelimelerden; kelime ise harflerden meydana gelmektedir. Haliyle böyle bir metinsel düzeni Composite pattern ile gerçekleştirelim.
ÇÖZÜM
Adım 1(Component Soyut Sınıfının Tasarlanması)
Bir metni ifade edecek olan; cümle, kelime ve harf diziliminin ortak yapılanması olan Component arayüzü aşağıdaki gibi olacaktır.
//Component
abstract class Text
{
public abstract void PrintThisBefore();
public abstract void PrintThisAfter();
public virtual void Print()
{
PrintThisBefore();
PrintThisAfter();
}
}
Burada dikkat ederseniz ‘PrintThisBefore’ ve ‘PrintThisAfter’ metotları mevcuttur. Bu metotlar ile ilgili söz öğesinin öncesi ve sonrası durumlarına göre Composite ve Leaf sınıflarında gerekli işaretlemelerde bulunuyor olacağız. Misal olarak; kelimelerden önce boşluğun gelmesi ya da cümlelerin sonunda nokta gelmesi gibi…
//Component
abstract class TextComposite : Text
{
protected List<Text> _texts = new();
public void AddText(Text text)
=> _texts.Add(text);
public void RemoveText(Text text)
=> _texts.Remove(text);
public override void Print()
{
PrintThisBefore();
foreach (Text text in _texts)
text.Print();
PrintThisAfter();
}
}
Adım 2(Composite Sınıfının Tasarlanması)
Bir metin yapılanmasında kelimeler ve cümleler olmak üzere iki adet Composite sınıf bulunmaktadır. Şimdi gelin bu iki sınıfı sırasıyla tasarlayalım;
//Composite
class Word : TextComposite
{
public override void PrintThisBefore()
=> Console.Write(" ");
public override void PrintThisAfter() { /* Boş */ }
}
‘Word’ sınıfına göz atarsanız eğer ‘PrintThisBefore’ metodunda her kelimeden önce gelecek olan boşluk karakteri yazdırılmaktadır. ‘PrintThisAfter’ metodunda ise, her kelimeden sonra boşluk ya da nokta gelebilme ihtimali olduğu için herhangi bir işlem gerçekleştirilmemektedir.
//Composite
class Sentence : TextComposite
{
public override void PrintThisBefore() { /* Boş */ }
public override void PrintThisAfter()
=> Console.Write(".");
}
Benzer mantıkla yukarıdaki ‘Sentence’ sınıfında ise ‘PrinThisBefore’ metodu boş geçilmiş lakin ‘PrinThisAfter’ metodunda ise her cümle sonunda nokta geleceği ifade edilmiştir.
Adım 3(Leaf Sınıfının Tasarlanması)
Metin dizelerinde Leaf olarak tasarlanabilecek tek yapı harflerdir. Haliyle hemen ilgili sınıf tasarımını gerçekleştirelim;
//Leaf
class Letter : Text
{
char _character;
public Letter(char character)
{
_character = character;
}
public override void PrintThisBefore()
=> Console.Write(_character);
public override void PrintThisAfter() { /* Boş */ }
}
‘Letter’ sınıfına göz atarsanız eğer bir ‘char’ türünden karakter almakta ve ‘PrinThisBefore’ metodunda bu karakteri ekrana yazdırmaktadır.
Adım 4(Test)
Yapılan bu inşayı aşağıdaki örnek çalışmayla test edersek eğer;
Bir insanın yardım etme hissiyatı, diğerinin acizliği ya da ezikliğinden değildir. Bilakis onu kendinden çok insan sıfatıyla görmesindendir. Çünkü, insana hizmet etmek insana yakışır.
Bu alanda veya başka bir alanda, benim ve diğer yardımcı insanların paylaşımlarına lütfen acizliğiniz ve ezikliğinizle yaklaşmayınız. İzin istemek, benim hükmüm altına girmeniz anlamına gelmemektedir.