JavaScript Bölüm 1’de GoF Tasarım Kalıpları: Singleton



  1. JavaScript Bölüm 1’de GoF Tasarım Kalıpları: Singleton

Gang of Four tasarım desenleri, bilindiği kadarıyla yaygın sorunlara kanıtlanmış çözümler topluluğudur. Peki ya bu tasarım modellerinin JavaScript diliyle ilgisi?


İşlevsel ve prototipik yönler sayesinde, tasarım modeli tarafından ele alınan problemlerin çoğu genellikle farklı şekilde çözülebilir veya karşılık gelen tasarım modelleri başka şekillerde uygulanabilir.

Bu yeni blog makaleleri dizisinde, bireysel GoF tasarım modellerini derinlemesine incelemek ve bir yandan olası çözümlere işaret etmek, diğer yandan da JavaScript geliştirmede ilgili modelin önemini tartışmak istiyorum. Singleton tasarım deseniyle başlayın.

Tasarım modelinin açıklaması


Sınıf tabanlı dillerde, varsayılan olarak, her sınıftan birden çok nesne örneği oluşturulabilir. Ama her zaman buna izin vermek istemezsin. Bazen, diğer birçok bileşen tarafından kullanılan yardımcı yöntemler gibi belirli özellikleri tek bir yerde yönetmek istersiniz. Singleton tasarım modelinin devreye girdiği yer burasıdır – bu, belirli bir sınıfın yalnızca bir örneğini oluşturabileceğiniz anlamına gelir.

Kural olarak, bu, tekil nesnenin örneğinin ilgili sınıf tarafından statik bir değişkende yönetileceği şekilde yapılır. Erişim daha sonra bir genel sınıf yöntemiyle yapılır. getInstance()bazen sınıf yüklendiğinde nesne örneği zaten oluşturulmaz, ancak yalnızca ilk çağrıda oluşturulur. getInstance() oluşturulan (tembel örnekleme).

JavaScript’te alaka düzeyi


JavaScript’te sınıf kavramı olmadığından, geliştiriciler tarafından oluşturulan her nesne tanım gereği dolaylı olarak bir tekildir. Bu nedenle aşağıdaki liste, JavaScript’teki bir tekil öğenin en basit biçimini gösterir:


var singleton = {};

ya da daha iyisi:

let singleton = {};

Veya bu şekilde istiyorsanız ve tutarlıysanız:

const singleton = {};

Elbette, bunun tekil tasarım modeliyle çok az ortak noktası vardır, çünkü en azından nesne örneğine erişmek için genel bir yöntem yoktur.

bekarlar ile getInstance()-Yöntem


Bu nedenle, kavramı getInstance()-Yöntem, farklı yaklaşımların olduğu JavaScript’e de aktarıldı. Öncelikle gereksinimleri tanımlayan aşağıdaki birim testi. yöntem getRandomNumber() her zaman aynı sayıyı döndürmelidir (rastgele oluşturulmuş):

'use strict';
const assert = require('assert');
describe('Singleton', () => {
describe('getInstance', () => {
it('should always return the same instance', () => {
assert.equal(Singleton.getInstance(), Singleton.getInstance());
});
describe('getRandomNumber', () =>
{
it('should always return same number', () =>
{
let firstResult = Singleton.getInstance().getRandomNumber();
let secondResult = Singleton.getInstance().getRandomNumber();
assert.equal(Singleton.getInstance(), Singleton.getInstance());
assert.equal(firstResult, secondResult);
});
});
});
});

JavaScript’te yöntem örneği erişiminin ve tembel örneklemenin eksik olan iki yönünü taklit etmek için, genellikle aşağıdaki listede gösterildiği gibi form tasarım modelini kullanırsınız (kendisi bir kapatma ve hemen adı verilen bir işlev ifadesinin birleşimi, kısa IIFE). Değişken tek kişilik bu durumda “sınıfı” temsil eder, içeri() özel ve getInstance() genel bir yöntem değişkendir misal henüz tanımlanmadı, ilk aradığınızda kullanılacak getInstance() İle ilgili içeri() hesaplandı veya başlatıldı.

'use strict';
let Singleton = ( function () {
let instance;
function init() {
let randomNumber = Math.random();
return {
getRandomNumber: function() {
return randomNumber;
}
};
};
return {
getInstance: function () {
if(!instance) {
instance = init();
}
return instance;
}
};
})();
Otomatik geçersiz kılma işlevli Singleton


Gösterilen tekniğe alternatif olarak, otomatik geçersiz kılma işlevi kullanılarak tembel örnekleme uygulanabilir. Hatırlatma: Aşağıdaki listede görüldüğü gibi bir fonksiyon çağrıldığında üzerine yazılır. İşte ilk arama getInstance() ilk değişken misal örneklendi ve sonra getInstance() sadece tanımlandı. Fonksiyonun diğer çağrıları, değişken doğrudan olduğundan, nesnenin başka örnekleriyle sonuçlanmaz. misal Iade edildi.

'use strict';
let Singleton = (
function () {
return {
getInstance: function () {
// Die Instanz wird nur einmal initialisiert
let instance = function(){
let randomNumber = Math.random();
return {
getRandomNumber : function() {
return randomNumber;
}
}
}();
// Neudefinition der Funktion
this.getInstance = function() {
return instance;
}
return this.getInstance();
}
};
})();
Sınıf sözdizimi ile Singleton


Yeni sınıf sözdizimini kullanarak, aşağıdaki listede gösterildiği gibi bir singleton uygulanabilir. Statik yöntem getInstance() ilk çağrıldığında “statik” özelliğini oluşturur misal ve kendini yeniden tanımlar (her zaman yukarıda açıklanan üzerine yazma işlevi ilkesini izleyerek). Yönteme yapılan sonraki tüm çağrılar daha sonra özelliği doğrudan döndürür.

'use strict';
class Singleton {
constructor() {
if(typeof Singleton.instance === 'object') {
return Singleton.instance;
} else {
this.randomNumber = Math.random();
Singleton.instance = this;
}
}
static getInstance() {
Singleton.instance = new Singleton();
Singleton.getInstance = function() {
return Singleton.instance;
}
return Singleton.instance;
}
getRandomNumber() {
return this.randomNumber;
}
}

içindeki kod yapıcı ()yöntem, bu arada, aynı zamanda, yoluyla başlatmaya çalışmanız durumunda da neden olur. yeni singleton() (ve yöntemde değil getInstance()) oluşturulur, ancak varsa, önceden oluşturulmuş nesne örneği kullanılır (ayrıca aşağıdaki birim testine bakın). Yeni sınıf sözdizimindeki yöntemler (dahil olmak üzere) olarak bundan kaçınılmalıdır. yapıcı ()yöntemi) özel olarak işaretlenemez.

it('should always return the same instance', () => {
assert.equal(new Singleton(), new Singleton());
assert.equal(Singleton.getInstance(), Singleton.getInstance());
assert.equal(Singleton.getInstance(), new Singleton());
assert.equal(new Singleton(), new Singleton());
});
Çözüm





GoF ve JavaScript kalıpları hakkında daha fazla bilgi edinin:



GoF ve JavaScript kalıpları hakkında daha fazla bilgi edinin: “Profesyonel JavaScript Geliştirme: Tasarım, Kalıp, Nasıl Yapılır İpuçları”



JavaScript söz konusu olduğunda, kesinlikle konuşursak, gerçek sınıflar kavramı mevcut olmadığından (veya yalnızca yüzeysel olarak ES2015’ten beri) tüm nesneler zaten tekildir. Bununla birlikte, tekilleri taklit etmek için çeşitli teknikler vardır. Singletons, JavaScript’te, örneğin yardımcı yöntemleri merkezi bir konumda yönetmek için anlamlıdır.

Bu dizinin gelecekteki makalelerinde, diğer GoF tasarım kalıplarını kademeli olarak genişletmek, uygulamaları göstermek ve bunların JavaScript için ne anlama geldiğini tartışmak istiyorum. Bu konuyla zaten ilgilenenler için, Rheinwerk Verlag tarafından yayınlanan ve tüm bir bölümü GoF tasarım modellerine ayırdığım “JavaScript ile profesyonel geliştirme – tasarım, desenler, pratik ipuçları” kitabımı öneriyorum.


()



Haberin Sonu
 
Üst