|
|
Yayınlandı 30.07.2018 10:30:45
|
|
|

Giriş
Flyweight modu, paylaşım teknolojisi çalıştırarak çok sayıda ince taneli nesneyi etkili şekilde destekler; aynı içeriğe sahip çok sayıda küçük sınıfın (örneğin bellek tüketimi) için ek yükü önler ve herkesin bir sınıfı paylaşmasına izin verir (meta-sınıf).
Programlamada, bazen veriyi temsil etmek için çok sayıda ince taneli sınıf örneği üretmek gerekir ve bu örneklerin temel olarak aynı ek yüke sahip olduğunu görürseniz, birkaç parametre dışında oluşturulması gereken sınıf sayısı büyük ölçüde azalabilir. Bu parametreleri sınıf örneğinin dışına taşıyıp metod çağrıldığında iletebilirseniz, paylaşarak bireysel örnekler sayısını büyük ölçüde azaltabilirsiniz.
Ya JavaScript'te meta modunu uygularsan ne olur? İki yol vardır, ilki veri katmanına uygulanır, özellikle bellekteki çok sayıda benzer nesneye; İkincisi, ana konteynerdeki her bir alt öğeye olay tutamaçları eklemek için merkezi olay yöneticisinde kullanılabilir DOM katmanına uygulanır.
Metaverse ve veri katmanlarının tadını çıkarın
Flyweight'te iki önemli kavram vardır - içsel durum içsel ve dışsal durum; iç durum nesnede iç yöntemlerle yönetilir ve harici bilgiler dıştan silinebilir veya kaydedilebilir.
Açıkça söylemek gerekirse, önce orijinal bir modeli çalmak, ardından farklı durumlar ve ortamlarla tutunmak, ardından kendi özelliklerine sahip özel modeller üretmektir; tabii ki burada farklı yeni nesneler oluşturulmalıdır; bu yüzden fabrika modu genellikle Flyweight modunda görünür, Flyweight'in iç durumu paylaşmak için kullanılır ve Flyweight fabrikası, iç durumun nesnelerini depolamak için bir Flyweight havuzu (pattern pool) sürdürmekten sorumludur.
Yuanyuan modunu kullanın
Eğer tüm kitapları yönetecek bir kütüphanemiz olsaydı, her kitabın meta verilerinin geçici olarak şu şekilde görüneceğini gösterelim:
ID Başlık Yazar Tür Sayfa sayısı Yayıncı Kimliği ISBN Ayrıca her kitabın ne zaman ve kim tarafından alındığını, dönüş tarihini ve erişilebilirliğini de tanımlamamız gerekiyor:
checkoutDate checkoutÜyelik dueReturnDate Kullanılabilirlik Kitap nesnesi aşağıdaki koda ayarlandığından, kodun henüz optimize edilmediğini unutmayın:
Program başta iyi olabilir, ancak zamanla kitap sayısı büyük miktarlarda artabilir, her kitabın farklı versiyonu ve miktarı vardır ve sistemin giderek daha yavaş ilerlediğini göreceksiniz. Hafızadaki binlerce kitap nesnesi hayal edilebilir ve bunları paylaşım moduyla optimize etmemiz gerekiyor.
Verileri iki tür veriye ayırabiliriz: iç ve hariç, kitap nesnesine (başlık, yazar vb.) ilişkin veriler ise iç özelliklere atfedilebilirken, (checkoutMember, dueReturnDate vb.) dış özelliklere atfedilebilir. Bu şekilde, aşağıdaki kod aynı kitapta aynı nesneyi paylaşabilir, çünkü kitabı kim ödünç alırsa alsın, kitap aynı kitap olduğu sürece temel bilgiler aynıdır:
Temel fabrikayı tanımlayın
Kitaptaki nesnenin daha önce oluşturulup oluşturulmadığını kontrol etmek için temel bir fabrika tanımlayalım, varsa geri dönelim, yoksa yeniden oluşturup saklayalım; böylece her kitap türü için sadece bir nesne oluşturuyoruz:
Dış durumu yönet
Dış durum nispeten basittir, kapsüllediğimiz kitap hariç, diğer her şey burada yönetilmeli:
Bu şekilde, aynı kitabın aynı bilgisini bir kitap yöneticisi nesnesine kaydedebiliriz ve sadece bir kopyayı kaydedebiliriz; Önceki kodla karşılaştırıldığında, çok fazla bellek kaydedildiği görülebilir.
Meta modunun ve DOM'un tadını çıkarın
Burada DOM köpüklenmesi olayı hakkında çok fazla bir şey söylemeyeceğim, herkesin zaten bildiğine inanıyorum, iki örnek verelim.
Örnek 1: Merkezi Olay Yönetimi Örneğin, tıklama olayını izlemek için birçok benzer öğe veya yapı türü varsa (örneğin menüler veya ul'de birden fazla li) her bir öğeyi olay bağlaması için bağlamamız gerekir, çok çok fazla öğe varsa, performans hayal edilebilir ve köpüklenme bilgisiyle birleştiğinde, herhangi bir çocuk öğenin bir olay tetikleyicisi varsa, tetiklendikten sonra olay daha yüksek elemana kabarır, bu özelliği kullanarak Xiangyuan modunu kullanabiliriz. Bu benzer elemanların ana elemanlarının olaylarını izleyebilir ve hangi alt elemanın bir olayın tetiklendiğini belirleyebiliriz, ardından daha sonraki işlemlere geçebiliriz.
Burada jQuery'nin bind/unbind yöntemlerini örnek olarak birleştireceğiz.
HTML:
JavaScript:
Örnek 2: Performansı artırmak için Xiangyuan modunu uygulayın
Başka bir örnek, hâlâ jQuery ile ilgili, genellikle öğe nesnesini olayın çağrı fonksiyonunda kullanırız, genellikle $(this) formunu kullanırız, aslında bu tekrar tekrar yeni bir nesne oluşturur, çünkü bu çağrı fonksiyonunda zaten DOM öğesi olduğu için aşağıdaki kodu kullanmalıyız:
Aslında, $(this) gibi bir şey kullanmamız gerekirse, tek örnek deseninin kendi versiyonunu da uygulayabiliriz; örneğin, jQuery.signle(this) gibi bir fonksiyon uygulayarak DOM öğesinin kendisini döndürebiliriz:
Nasıl kullanılır:
Bu, jQuery nesnesi oluşturmadan DOM öğesini olduğu gibi döndürür.
özet
Flyweight modu, programın verimliliğini ve performansını artıran bir moddur ve bu da programın çalışma hızını büyük ölçüde hızlandırır. Birçok uygulama vardır: örneğin, bir veritabanından bir dizi diziyi okumak istiyorsanız, bunların çoğu kopya olan bir dizi diziyi Flyweight havuzunda depolayabiliriz.
Bir uygulama çok sayıda nesne kullanıyorsa ve bu çok sayıda nesne çok fazla depolama mutluluğuna neden oluyorsa, paylaşım modunu kullanmayı düşünmelidir; Nesnenin dış durumunu silerseniz, birçok nesne grubunu nispeten az sayıda paylaşılan nesne ile değiştirebilir ve Xiangyuan modunu kullanmayı düşünebilirsiniz.
Referans adresi:http://www.addyosmani.com/resour ... ok/#detailflyweight
|
Önceki:İkon simgelerini bulmak için 3 web sitesi önerinÖnümüzdeki:BeklemedeMesajlar, MesajlarSırada, Mesaj...
|