JavaScript’te “Factory Functions” (Nesne Üretim Fonksiyonları)

Bu dersimizde, JavaScript’te “factory functions” olarak bilinen “nesne üretim fonksiyonları” konseptini ele alacağız.

JavaScript’te “Factory Functions” Kullanımı

Bu fonksiyonlar, özellikle benzer yapıya sahip nesneleri tekrar tekrar oluşturmak gerektiğinde son derece kullanışlıdır. Şimdi bu fonksiyonların nasıl çalıştığına ve neden bu kadar kullanışlı olduklarına dair bazı noktalara göz atalım.

İlk olarak, neden adının “factory” olarak verildiğine değinelim. “Factory” yani “fabrika”, belirli bir şablon veya tasarıma göre ürün üreten bir yerdir. İşte “factory functions” da benzer bir mantıkla çalışmayı kast ettiği için bu adı almıştır. Zira belirli bir şablona ya da tasarıma göre nesne üretirler. Yani, bu fonksiyonlar, belli bir yapıda ve özelliklerde nesneleri üretmek için tasarlanmış “fabrika” gibidirler.

Peki, “factory functions” kullanmanın avantajları nelerdir? Bu fonksiyonlar, benzer özelliklere sahip nesneleri kolayca ve hızlı bir şekilde oluşturmamızı sağlamasının yanı sıra, oluşturulan nesnelerin iç yapısını dışarıya kapatarak, sadece belirli özellik ve metotlara erişim sağlarlar (kapsülleme).

Bunun yanı sıra, “factory functions” ile oluşturduğunuz nesneler aynı yapıya sahip olsalar dahi, her bir nesne için fonksiyonlara verilen parametrelere bağlı olarak farklı değerler ve özellikler tanımlayabiliriz.

Bir araba fabrikası düşünelim. Fabrikamız belirli özelliklere sahip arabaları üretsin, ancak bu arabaların farklı renkte, farklı bir motor gücünde veya farklı bir model yılında özellikleri olabilsin diyelim. “Factory function” kullanarak bu arabaları aşağıdaki gibi oluşturabiliriz:

function carFactory(color, horsepower, year) {
    return {
        color: color,
        horsepower: horsepower,
        year: year,
        drive: function() {
            console.log(`${this.year} model ${this.color} renkteki araba ${this.horsepower} beygir gücüyle sürülüyor.`);
        }
    };
}

const car1 = carFactory('kırmızı', 120, 2020);
const car2 = carFactory('mavi', 150, 2022);

car1.drive(); // 2020 model kırmızı renkteki araba 120 beygir gücüyle sürülüyor.
car2.drive(); // 2022 model mavi renkteki araba 150 beygir gücüyle sürülüyor.

“Factory Functions” ve “Constructor Functions” Farkları

İster istemez aklınıza, acaba yapıcı fonksiyonlardan (constructor functions) ne gibi farklılıkları var, gibi bir soru gelebilir. Bu soruya şöyle cevap verelim; her ikisi de belirli bir yapıda nesneler oluşturmak için kullanılırlar. Ancak kullanımları ve uygulanış biçimleri farklıdır.

Yapıcı fonksiyonlarda, yeni bir nesne oluşturmak için “new” anahtar kelimesiyle birlikte fonksiyon çağrılır. Fonksiyonun içinde “this” anahtar kelimesi, o an oluşturulan nesneyi temsil eder. Bu sayede, nesnenin özellikleri ve metotları olduğu gibi atanır. Böylece oluşturulan nesneler, fonksiyonun prototipine bağlı olur ve bu prototip üzerinde tanımlanan metotlara erişebilirler. Ayrıca fonksiyonumuzun isimlendirmesi büyük harfle başlayarak “PascalCase” şeklinde bir adlandırmaya sahiptir.

function Car(marka, model) {
    this.marka = marka;
    this.model = model;
    this.bilgi = function() {
        return this.marka + " " + this.model;
    };
}

const car1 = new Car("Toyota", "Corolla");
console.log(car1.bilgi());  // Toyota Corolla

Yukarıdaki örneğimizde, Araba adında bir “yapıcı fonksiyon” oluşturduk. “new” anahtar kelimesiyle birlikte bu fonksiyonu çağırarak araba1 adında bir nesne oluşturduk. Bu nesne, fonksiyonun prototipine bağlıdır ve bilgi metodu ile marka ve model bilgisi yazdırılır.

Öte yandan, “fabrika fonksiyonları” ile nesne ürettiğimizde “new” anahtar kelimesini kullanmayız. Bunun yerine, fonksiyon doğrudan çağrılır ve bir nesne döndürülür. Fabrika fonksiyonları genellikle kapsülleme yapar, yani oluşturduğu nesnenin iç yapısını dışarıdan gizler. Bu nesneler, genellikle fonksiyon içerisinde oluşturulan yerel değişkenlere veya fonksiyonlara erişim sağlayamazlar. Ayrıca fonksiyonumuzun isimlendirmesi küçük harfle başlayarak “pascalCase” şeklinde bir adlandırmaya sahiptir.

function carFactory(marka, model) {
    return {
        marka,
        model,
        bilgi: function() {
            return marka + " " + model;
        }
    };
}

const car2 = carFactory("Honda", "Civic");
console.log(car2.bilgi());  // Honda Civic

Bu iki örnekte de görüldüğü üzere, yapıcı fonksiyonlar prototip tabanlı bir yapıya sahipken, fabrika fonksiyonları her çağrıldığında tamamen yeni ve bağımsız bir nesne döndürür. Bu durumu performans açısından değerlendirmek önemlidir. Eğer birçok nesne oluşturulacak ve her birinin kendine ait metotları olacaksa, fabrika fonksiyonları bellek kullanımı açısından maliyetli olacaktır.

Sonuç olarak, her iki fonksiyon türü de belirli bir yapıda nesneler oluşturma amacıyla kullanılır, ancak kullanım biçimleri ve bazı teknik yönleri farklıdır. Hangi yöntemin kullanılacağı, projenizin ihtiyaçlarına ve kişisel tercihinize bağlıdır.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu