Sınıf tanımlama ve kullanımı, programlama dünyasında önemli bir konudur Bu konu hakkında bilgi edinmek isteyenler için hazırladığımız kapsamlı içeriğimizle kod yazımında sınıf tanımlama ve kullanımı hakkında herşeyi öğrenebilirsiniz Sınıf tanımlama ve kullanımı konusunda uzmanlaşmak isteyenler için doğru adrestesiniz!
JavaScript, nesne yönelimli bir programlama dilidir ve sınıflar ve nesneler oluşturmak için kullanılır. Sınıf tanımlamak için class anahtar kelimesi kullanılırken, yeni bir nesne oluşturmak için new anahtar kelimesi kullanılır. Sınıflar, nesnelerin özelliklerini ve metodlarını tutar ve oluşturulan nesneler bu özellikleri ve metodları miras alır.
Sınıf tanımlama ve kullanımı, JavaScript uygulamalarında oldukça önemlidir. Sınıflar sayesinde kodun daha düzenli ve okunabilir hale gelmesi sağlanır. Bunun yanı sıra, nesneler arasındaki ilişkiler, kalıtım ve polimorfizm gibi kavramları kullanarak kodun fonksiyonelliği arttırılabilir.
JavaScript’te sınıf tanımlamak ve kullanmak oldukça kolaydır. Sınıf kurucu fonksiyonları ve miras alma işlemleri ile birlikte, statik metotlar ve özellikler gibi özellikler de kullanılabilir. Ayrıca, nesneler arasındaki ilişkileri daha da geliştirmek için tasarım desenleri de kullanılabilir.
Kurucu Fonksiyonlar
Kurucu fonksiyonlar, sınıfların oluşturulması sırasında çağrılan özel bir fonksiyondur. Bu fonksiyon, sınıfa ait özellikleri ve metotları tanımlamak için kullanılır. Kurucu fonksiyonlar, constructor adıyla tanımlanır ve her zaman sınıfın ismiyle aynıdır.
JavaScript'te kurucu fonksiyonlar, class anahtar kelimesi ile tanımlanır. Aşağıdaki örnek, Öğrenci isimli bir sınıfın kurucu fonksiyonunu tanımlar:
Kurucu Fonksiyon Örneği | |
---|---|
class Öğrenci { | Bu örnekte, Öğrenci sınıfı ad, soyad ve yaş özelliklerini içeren bir kurucu fonksiyona sahiptir. Kurucu fonksiyonda, this anahtar kelimesi kullanılarak sınıfın özellikleri belirtilir. |
Kurucu fonksiyonları kullanarak, sınıfların özelliklerinin ve davranışlarının nasıl olacağını belirleyebiliriz. Bir sınıftan yeni bir nesne oluşturulduğunda, kurucu fonksiyon otomatik olarak çalıştırılır ve nesnenin özellikleri tanımlanır.
Bunun yanı sıra, kurucu fonksiyonlar, sınıflar arasında kalıtım kullanılması durumunda da önemlidir. Ebeveyn sınıfın kurucu fonksiyonu, alt sınıflarının da kurucu fonksiyonu olacak şekilde çağrılabilir.
Miras Alma
JavaScript'te sınıflarının bir diğer özelliği de miras alma işlemidir. Bu özellik, bir sınıfın diğerinden bazı özelliklerini ve metodlarını devralması anlamına gelir. Bu sayede yazılım geliştiricileri tarafından kodlama işlemi daha hızlı ve düzenli hale getirilmektedir.
JavaScript'te miras alma işlemi prototip tabanlıdır. Bir sınıfın özellikleri ve metotları, diğer bir sınıf tarafından kullanılmak istendiğinde öncelikle bu sınıfa erişim sağlamak için prototipi kullanılır. Böylece bir sınıf içerisinde yer alan bulmayan bir özellik veya metod, miras aldığı sınıfın prototipi aracılığıyla bulunabilir.
Bir sınıfın diğerinden miras alınması için ‘extends’ anahtar kelimesi kullanılır. Aşağıdaki örnek bunu daha iyi açıklayacaktır:
class Arac{ constructor(marka,model,uretimYılı){ this.marka=marka, this.model=model, this.uretimYılı=uretimYılı }}class Araba extends Arac{ constructor(marka,model,uretimYılı,koltukSayisi){ super(marka,model,uretimYılı), this.koltukSayisi=koltukSayisi; }}
Yukardaki kod bloğunda, Arac adında bir ana sınıf (parent class) yer alırken, Araba adında bir alt sınıf (child class) bulunmaktadır. Araba sınıfı, Arac sınıfından miras almaktadır. Bu sayede Arac sınıfındaki özellikler Araba sınıfı içerisinde de kullanılabilmektedir. Örneğin:
let araba = new Araba("Mercedes","C200",2019,5);console.log(araba.marka) //Mercedesconsole.log(araba.uretimYılı) //2019
Bu örnekte, Araba sınıfından oluşturduğumuz bir nesne üzerinden marka ve üretim yılı özelliklerine erişim sağlandı. Bunun sebebi ise Araba sınıfının, Arac sınıfından bu özellikleri miras almasından kaynaklanmaktadır.
Yukarıdaki örnekte tek bir özellik kullanılmış olsa da daha karmaşık senaryolarda miras alma işlemi oldukça kullanışlı olabilir. Farklı sınıflar arasında ortak özellik ve metotları belirleyerek, yazılım geliştirme süreci daha da hızlandırılabilir.
Ebeveyn Sınıftan Özellik ve Fonksiyonlar Devralma
Ebeveyn sınıftan özellik ve fonksiyonların devralınması, JavaScript'teki sınıflar arasında oldukça kullanışlı bir özelliktir. Bir alt sınıfa, üst sınıftan belirli özelliklerin ve fonksiyonların devralınması, kodun okunabilirliğini artırır. Bu sayede, benzer özelliklerin tekrar edilmesi engellenir.
Ebeveyn sınıftan özellik ve fonksiyonların devralınması, super anahtar kelimesiyle gerçekleştirilir. Super anahtar kelimesi, alt sınıfı üst sınıfına bağlar ve devralınacak özellikleri belirtir. Devralınan özellikler, alt sınıfın constructor() yöntemi aracılığıyla kullanılabilir.
Örnek olarak, bir araba nesnesi üst sınıfında, motor ve model adı özellikleri bulunabilir. Bunlar, alt sınıftan kumanda edilebilir. Alt sınıfta, model adı ve motor özelliği devralınabilir. Bu sayede, araba nesnesinin alt sınıfına ait olan diğer özellikler, daha özel bir kullanım alanında kullanılabilir.
Aşağıdaki örnek kodda, ÜstSınıf'tan model adı ve renk özellikleri miras alınmıştır:
```class ÜstSınıf { constructor(model, renk) { this.model = model; this.renk = renk; }}
class AltSınıf extends ÜstSınıf { constructor(model, renk, yıl) { super(model, renk); this.yıl = yıl; }}```
Özelliklere ek olarak, ebeveyn sınıftan fonksiyonların da miras alınması mümkündür. Bu özellik, bir alt sınıfta kullanılacak benzer metotların tekrarının önüne geçer ve kodun okunabilirliğini artırır.
Bu özellik, büyük projelerde oldukça kullanışlıdır. Ancak, dikkatli kullanılması gerekmektedir. Ebeveyn sınıfta değiştirdiğiniz bir özellik, tüm alt sınıflarda da değişime neden olabilir. Bu nedenle, ebeveyn sınıftaki özelliklerin mümkün olduğunca değiştirilmeden kullanılması, kodunuzun daha güvenli olmasını sağlar.
Javascript'te Çoklu Kalıtım İmkanı
JavaScript'te çoklu kalıtım, bir sınıfın birden fazla sınıftan özellik ve fonksiyon miras almasını sağlayacak şekilde tasarlanmamıştır. Bunun yerine, alternatif yöntemler kullanılabilir. Bu yöntemlerden biri, sınıflar arasında prototip zinciri oluşturmak ve nesnelerin prototiplerini paylaşmaktır.
Başka bir yöntem de, bir sınıfın, bir başka sınıfın özelliklerini kopyalamak yerine, özelliklerin referansını saklamasıdır. Bu, sınıfın, diğer sınıfın özelliklerini kullanabilirken, özellikleri kopyalamak zorunda olmayacağı anlamına gelir.
Çoklu kalıtımın imkanı olmaması, yazılım tasarımı açısından bazı avantajlar sağlar. Çoklu kalıtım, programcıların her türlü durumu hesaba katması ve özelliklerin çakışmasını önlemesi gereken karmaşık bir süreçtir.
Karmaşık Kalıtım Senaryoları
Karmaşık kalıtım senaryoları, birden fazla sınıfları birbirine bağlayarak oluşturulabilen karmaşık yapıları ifade eder. Bu yapılar, özellikle büyük proje geliştirmelerinde sıkça kullanılmaktadır.
Birkaç sınıf arasında kalıtım yaparken dikkat edilmesi gereken bazı noktalar bulunmaktadır. İlk olarak, kalıtılan sınıf sayısının mümkün olduğunca az olması tercih edilmelidir. Çünkü çok fazla kalıtım yapmak, kodun okunmasını zorlaştırabilir ve sınıf hiyerarşisinin karmaşık hale gelmesine neden olabilir.
Ayrıca, kalıtımın bir sınıf için gerekliliği yüksekse, ancak diğer sınıflar için gereksiz ise, o sınıfın ayrı bir katman olarak oluşturulması daha uygun olabilir. Bu sayede, kodun daha anlaşılır olması sağlanabilir.
Karmaşık kalıtım senaryolarında, sınıf hiyerarşisinde bazı özelliklerin ezilmesi (override) gerekebilir. Bu durumda, ana sınıfın özellikleri değiştirilmeden sadece bazı özellikleri daha özelleştirilmiş hale getirilir. Bu sayede, hem kodda tekrar önlenir hem de ihtiyaçlara daha uygun bir yapı sağlanır.
Sonuç olarak, karmaşık kalıtım senaryolarının oluşturulması için dikkatli bir planlama yapılması gerekmektedir. Sınıfların birbirleriyle olan ilişkileri doğru bir şekilde oluşturulmalı ve kalıtım hiyerarşileri mümkün olduğunca basitleştirilmelidir. Bu sayede, projenin sürdürülebilirliği arttırılabilir ve kodun daha kolay bir şekilde okunması sağlanabilir.
Statik Metotlar ve Özellikler
Sınıflar, JavaScript kodlarını obje yönelimli (OOP) hale getirmekte kullanılan önemli araçlardır. Bu nesne yönelimli programlama yaklaşımında sınıflara eklenen statik metot ve özellikler, sınıfların kullanımını daha da geliştirmektedir.
Statik metotlar, sınıfın örneği olmadan doğrudan sınıf adı üzerinden çağrılabilen metotlardır. Bu metotlar, benzer işlemlerin yinelendiği durumlarda örnekleme zahmeti olmaksızın kullanılabilir.
Örneğin, bir matematik sınıfı içinde ki üçgenin alanını hesaplayacak fonksiyonu düşünelim. Bu fonksiyonu, matematik sınıfının statik metodu olarak tanımlarsak, herhangi bir üçgen nesnesi oluşturmadan direk kullanabilirsiniz:
class Matematik { static ucgenAlaniHesapla(taban, yukseklik) { return (taban * yukseklik) / 2; }}Matematik.ucgenAlaniHesapla(10, 5); // 25 döndürür
Bir sınıfın statik özelliği, sınıf nesnesinin kendisine ait bir özelliktir. Bu özellik yalnızca sınıf tarafından kullanılabilir ve bu nesne oluşturulmadan önce erişilebilir.
class Gecikme { static gecikmeZaman = 3000; bilgiler = ['Bilgi 1', 'Bilgi 2']; async bilgiYolla() { await new Promise(resolve => setTimeout(resolve, this.gecikmeZaman)); return this.bilgiler; }}console.log(Gecikme.gecikmeZaman); // 3000 döndürür
Bu sınıf örneği oluşturulmadan önce, sınıfın statik özelliği olan gecikmeZaman özelliği çağrılabilir. Bu fonksiyon, asenkron olarak verilen süre bekletildikten sonra bilgiler özelliğini geri döndürür.
Statik metot ve özellikler, sınıfların daha da etkileyici ve ölçeklenebilir olmasını sağlar. Bu özellikler, birçok farklı yerde kullanılabilir ve üst düzey sınıflar, isim alan çakışmalarından kaçınmak için kullanılabilir.
Somutlaştırma ve Soyutlama
Somutlaştırma ve soyutlama, nesneler ve sınıflar arasındaki ilişkileri ifade etmek için kullanılan önemli kavramlardır. Somutlaştırma, belirli bir varlığın gerçek dünyadaki özelliklerinin programlama dili içindeki yansımasıdır. Örneğin, bir kedi nesnesi somut bir varlıktır ve özellikleri arasında cinsi, rengi ve yaşadığı yer vardır.
Diğer yandan, soyutlama, bir varlığın sadece belirli yönlerini öne çıkararak programlanmasına denir. Somut özellikleri belirli değildir, ancak bu varlık için ilgili olan özellikler ve işlevler vurgulanır. Örneğin, bir hayvan sınıfı hayvanların genel özelliklerini kapsar, ancak bu sınıfın somut özelliklerini belirtmez.
Somutlaştırma ve soyutlama, programlama dillerinde farklı şekillerde uygulanabilir. Nesne yönelimli programlama (OOP), somut nesneler ve soyut sınıflar arasındaki ilişkiyi ifade etmek için önemli bir kavramdır. Bir sınıfın somut özelliklerini miras alarak yeni bir sınıf oluşturabilirsiniz. Örneğin, bir maymun sınıfı, genel hayvan sınıfından miras alabilir ve somut özelliklerini kendi özellikleriyle birleştirerek türetilmiş bir sınıf oluşturabilirsiniz.
- Somutlaştırmada, gerçek dünyadaki varlıkların özellikleri programlama dili içinde yansıtılır.
- Soyutlamada ise belirli yönleriyle öne çıkarılarak programlama dili içinde ifade edilir.
- Bu kavramlar, nesne yönelimli programlamada kullanılır ve somut nesneler ile soyut sınıflar arasındaki ilişkiyi ifade eder.
Somutlaştırma ve soyutlama, programlama dünyasında oldukça önemli kavramlardır. Doğru bir şekilde uygulandıklarında, nesnelerin ve sınıfların arasındaki ilişkiyi daha net bir şekilde ifade edebilirsiniz. Bu sayede kodlama süreci daha verimli hale gelebilir ve yapısal olarak daha tutarlı bir program ortaya çıkabilir.
İnterface Kullanımı
JavaScript programlama dilinde, interface ya da arayüz özellikle nesne yönelimli programlama (OOP) için oldukça önemli bir kavramdır. Interface, programcıların sınıflarını oluştururken bir tutarlılık ve yapısal uygunluk sağlamasına yardımcı olan bir yapıdır. Interface'in temel tanımı, bir sınıfın uyması gereken işlevlerin ve özelliklerin belirlenmesidir. Bir başka deyişle, arayüz, bir sınıfın benimsemesi gereken davranışlar ve özellikler hakkında bir sözleşmedir.
Interface kullanmak, genişletilebilir, değişen ihtiyaçlar için uygun bir yapı oluşturmaya yardımcı olur. Çünkü bu sayede güncellendiğinde ya da ihtiyaçlar değiştiğinde kodu tekrar yazmak yerine o arayüzü uygulayan sınıfların yalnızca bu arayüzle uyumlu hale getirilmesi yeterlidir.
JavaScript'te interface kullanımı oldukça basittir. Bir sınıfa arayüzü dahil etmek için aşağıdaki gibi bir kod kullanılabilir:
class Interface { method1(); method2(a,b);}class Sample implements Interface { method1(){ console.log("Method 1"); } method2(a,b){ console.log(a + " " + b); }}
Bu kod, Interface adında bir arayüz tanımlar ve bu arayüzü uygulayan bir Sample sınıfı yaratır. Bu Sample sınıfı artık Interface arayüzünden gelen tüm özellikleri de içerecektir.
İnterface kullanımının bir diğer faydası, kod tekrarını azaltmaktır. Örneğin, bir sınıf birden fazla arayüzü uygulayabilir. Bu şekilde, bu sınıf hem birden fazla yerde kod tekrarı yapılmadan kullanılabilir hem de ihtiyaçlar değiştiğinde tek bir arayüzden tüm sınıflar kolayca güncellenebilir.
Interface kullanımı, yalnızca kodun daha okunaklı ve yapısal olarak daha düzgün hale getirmekle kalmaz, aynı zamanda koddaki hataların da önlenmesine yardımcı olur. Bu nedenle, bir JavaScript programcısının, arayüzün tanımı ve kullanımı hakkında kesinlikle bilgi sahibi olması gerekmektedir.
Polimorfizm
Polimorfizm kavramı ve nesne yönelimli programlama açısından kullanım şekilleriPolimorfizm, nesne yönelimli programlama kavramlarının en temel özelliklerinden biridir. Bu kavram, herhangi bir sınıfın farklı örneklerinin, aynı işlevi yerine getirirken farklı davranışlar sergilebileceği anlamına gelir. Polimorfizmin temel fikri, aynı işlevi birden fazla şekilde gerçekleştirme kabiliyetidir.
JavaScript'te polimorfizmin kullanımı, genellikle fonksiyonların esnek olması sayesinde sağlanır. Bir fonksiyon, farklı türlerdeki parametreleri alabilir ve bu parametrelerin veri tiplerine veya bağlamına göre farklı işlemler gerçekleştirebilir. Bu sayede, aynı fonksiyonu farklı bağlamlarda kullanarak farklı sonuçlar elde edebiliriz.
Polimorfizm, JavaScript'teki nesne yönelimli programlama açısından da oldukça önemlidir. Bir sınıfın, başka bir sınıf tarafından kalıtım alınarak kullanılması durumunda, bu sınıfın özellik ve metotlarının ezilmesiyle birlikte farklı davranışlar sergilemesi mümkündür. Bu sayede, kalıtım alan sınıfın işlevselliği artırılabilir ve kod tekrarından kaçınılarak daha verimli bir programlama yapılabilebilir.
Polimorfizmin farklı şekillerde kullanımı bulunmaktadır. Örneğin, aynı adı taşıyan farklı sınıfların aynı arayüzü paylaşması, bir türden bir nesnenin, başka bir türe dönüştürülmesi ve çok biçimli sınıfların kullanımı bu kavramın farklı kullanım şekilleridir.
Polimorfizm, özellikle büyük ölçekli JavaScript uygulamalarında oldukça önemlidir. Farklı sınıfların ve nesnelerin aynı işlevi yerine getirdiği, ancak farklı davranışlar sergilediği bir yapı sayesinde, kodun sürdürülebilirliği ve genişletilebilirliği artırılabilir. Bu sayede, daha temiz, düzenli ve anlaşılır kodlar yazılabilir.
Tasarım Desenleri
JavaScript, web uygulamalarının geliştirilmesinde sıkça kullanılan bir dildir. Bu dilin kullanıldığı uygulamalar, daha etkili ve işlevsel hale getirmek için tasarım desenleri kullanabilirler. Tasarım desenleri, belirli bir durumu veya problemi ele almak için ortak tasarım ve yapılandırma yaklaşımlarıdır. JavaScript uygulamalarında kullanılabilen bazı tasarım desenleri şunlardır:
- Singleton Tasarım Deseni: Singleton tasarım deseni, bir sınıfın örneğinin yalnızca bir kez oluşturulmasını sağlayan bir desendir. Bu yöntem, birden fazla örneğin oluşmasını engeller ve uygulamanın performansını arttırır. Singleton tasarım deseni, özellikle veritabanı bağlantıları gibi sık kullanılan ancak yüksek maliyetli nesneler için idealdir.
- Observer Tasarım Deseni: Observer tasarım deseni, bir nesnenin durumundaki değişiklikleri izleyen ve başka nesnelere bildiren bir desendir. Bu sayede, nesnenin durumuna göre farklı işlemler yapabilir ve gereksiz kod tekrarından kaçınabilirsiniz. Observer tasarım deseni, özellikle kullanıcı etkileşimi gibi dinamik bir ortamda uygulama geliştirirken idealdir.
Bunlar sadece JavaScript uygulamalarında kullanılabilecek temel tasarım desenlerindendir. Uygulamanızın gereksinimlerine bağlı olarak farklı tasarım desenleri de kullanabilirsiniz. Tasarım desenleri, uygulamanızın performansını artırabilir ve kodunuzu daha düzenli ve bakımı daha kolay hale getirebilir.
Singleton Tasarım Deseni
Singleton tasarım deseni, bir sınıfın yalnızca bir örneğinin oluşturulmasına izin veren bir tasarım desenidir. Bu desenin kullanımı, programlama dillerinin birçoğunda mümkündür. Singleton tasarım deseni sayesinde, sınıfın yalnızca bir örneği oluşturulduğundan, daha az hafıza kullanılır ve daha az işlem yapılır. Bu nedenle, özellikle büyük ölçekli uygulamalarda, performance açısından önemli bir rol oynar.
Singleton tasarım deseni kullanımında, örneğin oluşturulması gereken bir yer varsa, öncelikle sınıfın örneğinin zaten oluşturulup oluşturulmadığı kontrol edilir. Sınıfın örneği zaten oluşturulmuşsa, varolan örnek döndürülür. Ancak, sınıfın örneği daha önce hiç oluşturulmadıysa, önce sınıf örneği oluşturulur ve daha sonra bu örneğin referansı geri döndürülür.
Singleton Tasarım Deseni Uygulama Örnekleri |
---|
|
Singleton tasarım deseni, aynı zamanda birçok tasarım deseni için de temel bir yapı taşıdır. Tek örneği olan bir sınıf oluşturmak, birçok tasarım deseninde gereksinim duyulur.
Singleton tasarım deseni, performans açısından büyük bir avantaj sağlamasına rağmen, bu tasarım deseni yanlış kullanılırsa sorunlara yol açabilir. Örneğin, birden fazla örneği olan bir sınıfı Singleton olarak tanımlarsanız, bu, performans yerine program hatası nedeniyle sorunlara yol açabilir. Bu nedenle, Singleton tasarım deseni kullanılacaksa, dikkatlice kullanılmalı ve doğru bir şekilde uygulanmalıdır.
Observer Tasarım Deseni
Observer tasarım deseni, nesne yönelimli programlama (OOP) açısından oldukça önemli bir konudur. Bu tasarım deseni, bir nesnenin durumunda meydana gelen değişikliklerde diğer nesnelere bu değişiklikleri bildirir ve bu nesnelerin durumunu günceller. Bu sayede bir nesnenin değişimleri diğer nesnelerde otomatik olarak yansıtılmış olur.
Observer tasarım deseni, çok sayıda kullanım alanı vardır. Örneğin, bir e-ticaret sitesinde bir ürün fiyatı değiştirildiğinde, detay sayfasında bu ürünü takip eden kullanıcılara, fiyat değişikliğinden haberdar olmaları için bir uyarı mesajı gösterilebilir. Ayrıca, bir haber sitesinde haberlerin güncellendiği zaman, bu haberleri takip eden kullanıcıların otomatik olarak yeni haberlerden haberdar edilmesi sağlanabilir. Bunun yanı sıra, oyun programlamada, seviyelerin geçilmesi ya da oyunun ilerlemesi gibi durumlarda da observer tasarım deseni kullanılabilir.
Observer tasarım deseni uygulamaları genellikle bir ana nesne ve birden çok alt nesne içerir. Ana nesne, alt nesnelerin değiştirilmesi sonucu oluşan değişiklikleri takip eder ve alt nesnelere bu değişiklikleri haber verir. Alt nesneler ise bu bildirimleri alarak, kendi durumlarını güncellerler. Bu sayede tüm nesnelerin tutarlı bir şekilde güncellenmesi sağlanır.
Observer tasarım deseni uygulamalarında, değişiklikleri takip eden ana nesne genellikle bir interface ile birleştirilir. Bu sayede alt nesneler, ana nesnenin kullandığı metodları doğrudan kullanabilirler. Ayrıca, observer tasarım deseni, kodun modüler bir şekilde yazılmasına ve kolayca genişletilmesine olanak tanır.
Özetle, observer tasarım deseni nesne yönelimli programlama açısından oldukça önemli bir konudur ve birçok kullanım alanına sahiptir. Bu desen, değişiklikleri takip eden bir ana nesne ve birden çok alt nesne üzerine kurulu bir yapıya sahiptir ve bu sayede tüm nesnelerin durumlarının tutarlı bir şekilde güncellenmesi sağlanır.