Objective-C'nin Nesne Yönelimli Yapısı

Objective-C'nin Nesne Yönelimli Yapısı

Objective-C programlama dili, nesne yönelimli yapısıyla öne çıkıyor Bu yapının temel özelliklerini öğrenmek istiyorsanız doğru adrestesiniz! İncelemelerimizle Objective-C'nin nesne yönelimli yapısını yakından tanıyın

Objective-C'nin Nesne Yönelimli Yapısı

Objective-C, Apple tarafından geliştirilen ve macOS ve iOS gibi Apple platformları için özel olarak tasarlanmış bir programlama dilidir. Nesne yönelimli bir paradigma kullanır ve bu da objelere dayalı bir programlama yaklaşımıdır. Bu yaklaşımın temelinde, programlama problemlerine nesnelerin birbirleriyle etkileşimleri üzerinden yaklaşma felsefesi yatar.

Objective-C'deki temel yapıların sınıflar ve nesneler olduğunu söylemek mümkündür. Sınıflar, nesneleri oluşturmanın bir yoludur ve nesneler ise sınıfların bir örneğidir. Sınıflar, benzer nesneler arasındaki ortak özellikleri tanımlamak için kullanılır. Nesne yönelimli programlama paradigmalarının bir diğer özelliği de sınıflar arasında kalıtım ilişkilerinin kullanımıdır. Bu sayede alt sınıflar, üst sınıflarda tanımlanan özellikleri ve davranışları kullanabilirler.

Objective-C'deki bir diğer önemli yapı da örüntülerdir. Örüntüler, programlama problemlerinin çözümü için kanıtlanmış bir yaklaşım sunar. Bu yapılar, sıklıkla kullanılan işlevleri ve kodu tekrar tekrar yazmaktan kaçınarak zaman tasarrufu sağlar. Objective-C'deki örüntülerin bazıları faça tasarım örüntüsü, singleton örüntüsü ve delegate örüntüsüdür.


Sınıflar ve Nesneler

Objective-C, Nesne Yönelimli Programlama (NYP) paradigmasını kullanır ve bu nedenle sınıflar ve nesneler gibi NYP kavramları temel bir öneme sahiptir. Sınıflar, nesnelerin taslakları gibidir, yani bir objenin özellikleri, davranışları ve yöntemleri sınıf tarafından tanımlanır. Nesne ise sınıfın örneğidir. Bu nedenle, sınıf tanımı, bir nesne oluşturmak için kullanılır.

Objective-C'deki sınıflar, temelde "root class" olan NSObject sınıfından türetilir ve tüm sınıfların yapısı belirli bir sınıfın "miras alınması" ilkesine dayanır. Bu, mevcut bir sınıfın özelliklerini ve yöntemlerini kullanarak yeni bir sınıf tanımlamanın kolay olduğu anlamına gelir. Ayrıca, bir sınıfın özellikleri bellekte ayrılabilir hale getirilir ve ilgili objelerin birden fazla örneği oluşturulabilir.

Her nesne, bir sınıfın bir örneğidir ve önceden tanımlanmış özellikleri ve yöntemleri adlandırılmış bir arayüzle kullanılabilir hale getirilir. Bu, objelerin birbirleriyle etkileşim kurmasını sağlar. Özellikle, bu, bir objenin başka bir sınıfa ait bir örneği olan bir "child object" içerebileceği anlamına gelir. İletişimler genellikle nesneler arası bir protokol tarafından tanımlanır ve genellikle özellikler, yöntemler veya sınıflar arasındaki veri aktarımını içerir.

Özetle, Objective-C'de sınıflar ve nesneler yoğun bir şekilde kullanılır. Sınıflar, taslaklar olarak hizmet eder ve nesneler, bu taslakların örneğidir. Nesneler, birbirleriyle iletişim kurabilir ve bu iletişimler sınıflar arasındaki tanımlanan protokollerle belirlenir.


Örüntüler ve Özellikler

Objective-C, örüntüler ve özellikler kullanarak nesne yönelimli programlama paradigmalarını destekler. Bu özellikler, kodun tekrar kullanılabilirliğini artırır ve yazılım geliştirme sürecini daha verimli hale getirir.

Örüntüler

Objective-C, yazılım geliştirme sürecinde tasarım kalıplarını kullanmanıza olanak tanır. Tasarım kalıpları, sık karşılaşılan yazılım problemlerine uygulanan çözümlerdir. Bu kalıplar, tekrar kullanılabilir kod blokları sağlayarak yazılımı daha da geliştirir.

Objective-C'deki en popüler örüntülerden biri, Façade Tasarım Örüntüsüdür. Bu örüntü, yazılım bileşenlerini müşteri bileşenlerinden gizleyerek yazılımın daha kolay kullanılmasını sağlar. Bu örüntü sayesinde, yazılımın bakımı, genişletilmesi ve müşterilere sunulması daha kolay hale gelir.

Objective-C'deki diğer bir popüler örüntü ise Singleton Örüntüsüdür. Bu örüntü, bir sınıfın bir nesnesinin yalnızca bir kez yaratılmasını sağlar. Bu örüntü, global ya da paylaşılan bir özellik gerektiren yazılımlar için idealdir.

Delegate Örüntüsü ise Objective-C'deki en sık kullanılan örüntülerden biridir. Bu örüntü, bir nesne tarafından sağlanan özellikleri diğer nesnelere aktararak kodda daha fazla esneklik sağlar.

Özellikler

Objective-C'deki özellikler, nesne yönelimli programlama sürecinde kullanılan değerli araçlardır. Bir sınıfın özellikleri, diğer sınıflar tarafından kullanılabilen değerlerdir. Bu özellikler, en çok, sınıfın davranışı hakkında bilgi sağlar.

Özellikler, Objective-C'deki nesnelerin özelliklerinin tanımlanmasını sağlar. Bu özellikler, bir nesnenin davranışını ve durumunu tanımlayan göstericilerdir. Bu göstericiler, bir nesnenin özelliklerini özelleştirmenize olanak tanır.

Objective-C'deki özellikler, bir nesnenin özelliklerine erişim sağlamak için kullanılan anahtar kelimelerdir. Bu özellikler, özelleştirilmiş nesneler geliştirirken önemli bir rol oynar. Özellikleri tanımlamak, nesnelerin verimli bir şekilde kullanılmasını ve kodun daha iyi bir şekilde organize edilmesini sağlar.

Sonuç olarak, Objective-C, örüntüler ve özellikler kullanarak, nesne yönelimli programlamayı destekler. Bu özellikler, tekrar kullanılabilir kod blokları sağlar ve yazılım geliştirme sürecini daha da verimli hale getirir. Objective-C ile yazılım geliştirirken, örüntüler ve özellikler hakkında daha fazla bilgi edinerek kodunuzu daha da geliştirebilirsiniz.


Façade Tasarım Örüntüsü

Façade tasarım örüntüsü, uygulamalarda büyük ölçekli bir sistemin daha küçük ve daha erişilebilir bir arayüze sahip hale getirilerek daha kullanışlı ve anlaşılabilir hale getirilmesini sağlar.

Objective-C'deki façade tasarım örüntüsü, uygulama altında bulunan daha karmaşık sınıflar ve alt sistemlerin arayüzleri üzerinde çalışır. Bununla birlikte, kullanıcı veya başka bir uygulama bileşeni, alt sistemlerin ve sınıfların karmaşıklığından kurtulur ve daha basit bir gösterimle uygulamanın fonksiyonlarını kullanabilir.

Objective-C'deki façade tasarım örüntüsü, olay yönetimi sınıflarından, veritabanı işleme sınıflarına ve hatta web hizmeti sınıflarına kadar her türlü alt sistem ve sınıf için kullanılabilir.

Façade tasarım örüntüsü, Objective-C uygulamaları için düzenli olarak kullanılan bir örüntüdür ve karmaşık büyük ölçekli sistemlerin anlaşılabilirliğini ve kullanılabilirliğini arttırmak için sıklıkla tercih edilir. Bu sayede, kullanıcıların uygulamanın sunduğu hizmetlerden daha kolay bir şekilde faydalanması sağlanır.


Singleton Örüntüsü

Singleton Örüntüsü, bir sınıftan yalnızca bir tane örnek oluşturmayı sağlayan tasarım bir örüntüsüdür. Bu örüntü, özellikle uygulamalardaki kaynak tüketimini azaltmak için kullanılır.

Objective-C'de singleton örüntüsü, + (instancetype)sharedInstance yöntemi kullanılarak uygulanır. Bu yöntem, sınıfın yalnızca bir örneğini oluşturmaya izin verir ve her çağrıda aynı örneği döndürür.

Singleton örüntüsü, uygulamalardaki özellikle veritabanı sınıfları, ses öğeleri, kullanıcı tercihleri gibi belirli sınıfların yalnızca bir örneği oluşturulması gerektiği durumlarda kullanılır. Bu sayede, fazla bellek kullanımı ve performans sorunları önlenir.

Bir singleton sınıfının örneği yaratıldığında, tüm özellikleri ve metodları tüm uygulama tarafından paylaşılır. Bu sayede, bir sınıfın örneğinin kontrolsüz olarak nesne yığına atılması veya sürekli yaratılması önlenir.

Günümüzde, singleton örüntüsü özellikle mobil uygulamalar ve client-server uygulamalarında sıklıkla kullanılır. Ancak, aynı zamanda kötü kodlama pratikleri ile de karşı karşıya kalabilir. Bu nedenle, doğru bir şekilde kullanılması ve gereksiz yere kullanılmaması önemlidir.


Delegate Örüntüsü

Delegate örüntüsü, Objective-C programlama dilinde oldukça yaygın olarak kullanılmaktadır. Bu örüntü, bir nesnenin diğer nesnelerle etkileşiminde bir arayüz sağlama amacını gütmektedir. Bu arayüz, nesnelerin birbirleriyle iletişim kurabilmesini sağlayan bir yapıdır.

Delegate örüntüsü, bir nesnenin bir başka nesneye belirli bir işlevsel görevi atamasına olanak tanır. Bu şekilde, atanan görevi yerine getirmek üzere o nesneye ait metotlar çağrılır. Bu metotlar, diğer sınıflar tarafından oluşturulan nesnelerdeki işlemleri gerçekleştirmek için kullanılır.

Objective-C uygulamalarında delegate örüntüsü, özellikle arayüz tasarımlarında sıklıkla kullanılmaktadır. Örneğin, bir UIButton nesnesinin tıklanması sonrasında gerçekleşmesi gereken işlemleri yürütmek için bir delegate özelliği atanabilir. Bu özellik, o nesnenin tıklanmasıyla birlikte oluşan etkinliği yakalayarak gerçekleştirilmesi gereken işlemleri yürüten bir sınıfın metotlarını çağırır.

Delegate örüntüsü, Objective-C'deki adaptasyon ve genişletilebilirlik açılarından da oldukça önemlidir. Bir sınıfın bir başka sınıf tarafından kullanılabilmesi için, aralarındaki iletişim bir delegate örneği vasıtasıyla gerçekleştirilir. Bu sayede, aralarındaki iletişim kabiliyeti artar ve sınıflar birbirleriyle uyumlu hale getirilebilir.

Sonuç olarak, Objective-C'deki delegate örüntüsü, nesneler arasındaki etkileşimleri sağlamak üzere tasarlanmış bir arayüzdür. Uygulamalarda özellikle arayüz tasarımlarındaki işlemler için oldukça yaygın olarak kullanılmaktadır. Ayrıca adaptasyon ve genişletilebilirlik açılarından da oldukça önemli bir rol oynamaktadır.


Özellikler

Objective-C'deki özellikler sınıf özellikleri ve özünde tutulan verilerin nasıl erişileceği konusunda bir ara yüzdür. Sınıf tanımında değişkenlerin tanımlaması yerine özellikler kullanılarak yapılabilir. Bir özelliğin bir adı, bir tipi ve bir davranışı vardır. Özellikler, sınıfın özel verilerine otomatik erişim sağlayan bir araçtır.

Objective-C'de özellikleri tanımlamak için `@property` anahtar kelimesi kullanılır. Özelliklere erişmek ve verileri okumak veya yazmak için `getter` ve `setter` yöntemleri kullanılır. Bu yöntemler otomatik olarak oluşturulur veya manuel olarak tanımlanabilir.

Bir özellik, `readonly` veya `readwrite` olarak tanımlanabilir. `readonly` tanımlanırsa, sadece verilerin okunabilmesine izin verilir. `readwrite` tanımlanırsa, verilerin okunup yazılmasına izin verilir.

Ayrıca, özellikler `nonatomic` veya `atomic` olarak tanımlanabilir. Thread-Safety konusunda, `nonatomic` kullanımı tavsiye edilir. `atomic` kullanıldığı durumlarda özelliklere eşzamanlı erişim için bir kilitleme yapılır.

Özellikler ayrıca `strong`, `weak`, veya `assign` olarak da tanımlanabilir. Bu belirteçler, hangi türde bir referans sayacı kullanılacağını ve ne türde bir nesne örneği saklanacağını belirler. `strong` özelliği ile bir nesne örneği saklanırken, örnek sayacı referansını tutmak için arttırılır. `weak` özelliği ile referans sayacının artırılmadan depolanan bir nesne örneği saklanır. `assign` özelliği ise basit tiplerin saklanması için kullanılır.

Tablolar ve listeler, özellikler hakkında daha ayrıntılı bilgi sağlamak için kullanılabilir. Özet olarak, Objective-C'deki özellikler, değişkenlere daha kolay ve daha erişilebilir bir şekilde erişim sağlar ve kodun okunabilirliğini ve özelleştirilebilirliğini artırır.


Hafıza Yönetimi

Objective-C, düşük seviye bir programlama dili olsa da, hafıza yönetimi konusunda oldukça esnektir. Hafıza yönetimi, Objective-C uygulamalarında kritik bir öneme sahiptir ve doğru bir şekilde yapılması, uygulamaların daha hızlı ve güvenilir çalışmasını sağlar.

Objective-C'deki hafıza yönetimi iki farklı yolla yapılabilir: MRC (Elle Yönetilen Referans Sayacı) ve ARC (Otomatik Referans Sayacı). MRC, Objective-C ile birlikte gelen eski bir hafıza yönetimi yöntemidir. Bu yöntemde, geliştiriciler, bellek tahsisi ve belleğin serbest bırakılması için kodlar yazmak zorundadır. Bu nedenle, MRC kullanarak hafıza yönetimi yapmak oldukça zor ve hataya açıktır.

Diğer yandan, ARC, bellek yönetimini otomatikleştirir. Bu sayede, geliştiriciler bellekle ilgili kod yazma zorunluluğundan kurtulur ve bellek tahsisatı ve serbest bırakmayı otomatik olarak yapar. ARC kullanımı, Objective-C uygulamalarının daha hızlı ve daha güvenilir çalışmasını sağlar. Ancak, ARC'nin kullanımı bazı kısıtlamaları da beraberinde getirir.

ARC, Objective-C 2.0'dan sonra kullanılmaya başlanmıştır. Bu nedenle, daha eski sürümlerde ARC kullanılamaz. Ayrıca, ARC'nin tamamı otomatik değildir. Özellikle, C dilini kullanan C++ gibi diller ile Objective-C arasında etkileşim olduğunda, bellek yönetimi sorunları ortaya çıkabilir.

Hafıza yönetimi, Objective-C uygulamalarının performansı ve güvenliği için önemlidir. Geliştiriciler, uygulamalarında hangi hafıza yönetimi yöntemini kullanacaklarına karar verirken, uygulamanın ihtiyaçlarına ve gereksinimlerine göre karar vermelidir.


ARC

Objective-C'nin hafıza yönetimi, uygulamaların performansı ve güvenilirliği açısından oldukça önemlidir. ARC (Otomatik Referans Sayacı) ise Objective-C'de kullanılan bir hafıza yönetimi modelidir. ARC, geliştiricilerin otomatik olarak bellek yönetimini yapmasına olanak tanır ve manuel MEMORY MANAGEMENT işleminin gerektirdiği zaman alıcı kod yazımından tasarruf sağlar.

ARC, Objective-C uygulamalarında kullanılan referans sayacı prensibini kullanarak otomatik olarak bellek yönetimini gerçekleştirir. Bu, uygulamanın bellek kullanımını daha etkili bir şekilde kontrol etmesine olanak tanır. ARC, gereksiz bellek önleyici kullanımı ve özelleştirilmiş bellek yönetim kodu yazımı ihtiyacını ortadan kaldırarak uygulamanın hafıza yönetimini büyük ölçüde kolaylaştırır.

ARC MRC
ARC, bellek yönetiminde tamamen otomatiktir. MRC, manuel bellek yönetimi gerektirir.
ARC, bellek sızıntısını önlemek için tasarlanmıştır. MRC, bellek sızıntısı sorunlarına yol açabilir.
ARC, Xcode'un önerilen hafıza yönetimi yöntemidir. MRC, daha eski Objective-C kodlarında kullanılır.

ARC, Objective-C'nin dikkatle kontrol edilmesi gereken kritik unsurlarından biridir. İyi bir bellek yönetimi modelinin kullanılması, uygulamanın performansını artırabilir ve bellek sızıntısı gibi sorunların oluşmasını önleyebilir.

  • ARC, Objective-C 2.0'dan itibaren kullanılmıştır.
  • ARC, geçerli bir bellek yönetimi modeli olarak kabul edilir.
  • ARC, daha az bellek kullanımı ve daha az bellek sızıntısı ile sonuçlanır.

ARC, Objective-C uygulama geliştiricileri tarafından geniş çapta benimsenmiştir. Bellek yönetim konusunda daha önce tecrübesi olmayan geliştiriciler için bile, ARC'nin kullanımı birçok sorunu önlemekten ve uygulamalarını daha güvenilir hale getirmekten başka bir şey değildir.


MRC

Objective-C'de Elle Yönetilen Referans Sayacı (MRC), hafıza yönetiminin bir diğer türüdür. MRC, otomatik olarak hafıza yönetimi yapmaz, ancak bellek yönetimini manuel olarak programlamacının eline bırakır. MRC, Objective-C'deki önceki sürümlerde yaygın olarak kullanılıyordu, ancak ARC'in (Otomatik Referans Sayacı) geliştirilmesi nedeniyle yerini aldı.

MRC, programcının hangi bellek alanlarının ne zaman bellekten alınacağına veya iade edileceğine karar vermesine izin verir. Bu tür bir yönetim, otomatik referans sayacı yöntemine göre daha fazla kontrol ve özelleştirme olanağı sağlar.

MRC kullanarak, programcı hafıza yönetimini daha ince ayarlayabilir ve uygulamanın ihtiyaçlarına uyacak şekilde özelleştirebilir. Ancak, bu yöntem otomatik referans yöntemine göre daha zor ve hata yapma riski daha yüksektir.

MRC yönetiminde, programcının bellek alanlarını manuel olarak bellekten almaları ve serbest bırakmaları gerekir. Yani, programcı her bir nesne için ne zaman bellekten alınacağını ve ne zaman serbest bırakılacağını belirlemelidir.

MRC yönetimi, Objective-C uygulamalarındaki hafıza yönetimi konusunda daha fazla esneklik sağlar, ancak yine de programcının manuel olarak işlem yapması gerektiği için tercih edilmeyebilir. Bununla birlikte, bazı durumlarda MRC kullanmak gerekebilir, özellikle mevcut bir uygulamanın güncellenmesi söz konusu olduğunda ve otomatik referans sayacının kullanımı öngörülemiyorsa.


Protokoller ve Kategoriler

Objective-C'deki protokoller ve kategoriler, programlamada büyük bir öneme sahip olan öğelerdir. Protokoller, bir sınıfın hangi yöntemleri ve özellikleri uygulaması gerektiğini belirleyen bir arayüz tanımlar. Bu şekilde, birden fazla sınıfın aynı protokolü uygulaması sayesinde, bu sınıfları birbirine bağlamak ve birlikte kullanmak daha kolay hale gelir. Protokoller, kodların daha modüler hale getirilmesine olanak tanır.

Kategoriler ise, bir sınıfın özelliklerine yeni özellikler veya davranışlar eklemek için kullanılır. Bu şekilde, mevcut sınıfların üzerine ek özellikler eklenebilir ve daha önce tanımlanmış metotların tekrar tanımlanmasına gerek kalmadan kullanımı kolay hale getirilebilir. Kategoriler, bir sınıfın mevcut kodunu değiştirmeden genişletmek için kullanışlı bir araçtır.

Objective-C'de protokollerin tanımlanması için @protocol anahtar kelimesi kullanılır ve uygulamaları yapmak için bir protokolü uygulamak için @interface anahtar kelimesinin ardından protokol eklenmelidir. Kategorilerin tanımlanması için ise @interface anahtar kelimesi kullanılır ve mevcut bir sınıfa ekstra özellikler eklemek için bu sınıfın adından sonra, kategori adı girilir.

Özetlemek gerekirse, protokoller ve kategoriler, Objective-C programlamasında bool, integer gibi temel veri tipleri gibi önemli bir yere sahiptir. Protokoller, bir sınıfın nasıl kullanılacağını belirleyen bir arayüz oluştururken, kategoriler mevcut sınıflara ek özellikler eklemek için kullanılır. Bu öğelerin kullanımı, kodların yeniden kullanılabilir olmasına yardımcı olur ve programcıların daha fonksiyonel ve yenilikçi uygulamalar geliştirmelerine olanak tanır.


Protokoller

Objective-C'deki protokoller, birbirine benzeyen sınıfların farklı davranışlar göstermesi için kullanılan bir araçtır. Protokoller, bir sınıfın hangi yöntemlerin uygulanacağını bildirmesine olanak tanır ve bu sayede sınıflar arasında iletişim kurulabilir.

Protokoller, bir arayüzü tanımlayabilir ve sınıfların bu arayüzü uygulamalarını sağlayabilir. Bir sınıf, bir ya da daha fazla protokolü uygulayabilir. Protokollerin kullanımı, code reusability'yi arttırır ve birbirine benzeyen sınıfların kod tekrarını azaltır.

Bir protokol tanımlamak için, @protocol ifadesi kullanılır. Protokol, çeşitli metodlar içerebilir ve her biri somut bir uygulama sağlar. Her metod için, parametreler belirtilebilir ya da belirtilmeyebilir.

Protokolün uygulanması için, @interface yerine @interface sınıfı : üstSınıfı < protokolAdı > kullanıldığında protokol adı listesi eklenir.

Örneğin, bir Animal sınıfı oluşturabilir ve buna bir AnimalNoises protokolü eklenebilir. Protokol, Animal'ın somut uygulamalarına izin verir ve uygun davranışı sağlar.

Ana Sınıf Protokol
Animal AnimalNoises

Bu örnek, AnimalNoises protokolü ile Animal sınıfının davranışlarını kontrol eder ve uygulamayı daha yönetilebilir hale getirir. Protokollerin kullanımı, Objective-C'deki güçlü nesne yönelimli programlama özelliklerinden biridir ve kod tekrarını en aza indirgemek için kullanılabilir.


Kategoriler

Kategoriler, Objective-C'deki nesnelerin özelliklerini genişletmek için kullanılır. Bir sınıfta tanımlanmış olan özellikler, kategori kullanımıyla başka özellikler ekleyerek genişletilir. Kategoriler, sınıfın orijinal kodunun değiştirilmesine gerek kalmadan daha fazla işlevsellik eklemek için kullanılır.

Kategori oluşturmak için, söz diziminin şu şekilde olması gerekmektedir:

@interface SınıfAdı (KategoriAdı)// Kategori özellikleri ve metodları buraya yazılır.@end

Bir kategori, sınıf tanımı yapısı gibi başlık ve uygulama bölümlerine bölünür. Başlık bölümünde, ana sınıfın tanımı tekrarlanır ve kategori özellikleri ve metodları tanımlanır. Uygulama bölümü, metodların koduyla ilgilidir. Kategoriler, bir sınıfta tanımlanmış olan özelliklerin değiştirilmesine izin vermez, ancak yeni özellikler eklerler.

Bir örnekle daha iyi anlaşılabilir. Örneğin, bir NSString sınıfına bir kategori ekleyelim:

@interface NSString (İlkHarfiBüyükYap)- (NSString *)ilkHarfiBüyükYap;@end@implementation NSString (İlkHarfiBüyükYap)- (NSString*)ilkHarfiBüyükYap {  if ([self length] > 0) {    NSString *ilkHarf = [[self substringToIndex:1] uppercaseString];    NSString *sonrakiKarakterler = [self substringFromIndex:1];    return [NSString stringWithFormat:@"%@%@", ilkHarf, sonrakiKarakterler];  }  return self;}@end

Bu kategori, NSString sınıfına yeni bir özellik ekleyerek, NSString'in ilk harfini büyük yapar. Bu özellik, kategori olarak eklendiği için, ana sınıfın orijinal kodunda değişiklik olmadan kullanılabilir.

Kategori kullanarak, farklı sınıflar arasında belirli bir süreci paylaşan özellikleri tek bir yerde toplayabiliriz. Böylece, kod tekrarını azaltır ve daha kolay anlaşılabilir hale getiririz.