Smalltalk'in 'haline geldiği' ne yararları var?


12

become:Smalltalk içindeki mesaj, bir nesnenin diğerine değişmesine neden olarak ona yapılan tüm referansları etkiler.

Bu dil özelliğinin kullanım alanları nelerdir? Gerçek kodda kullanılıyor mu? Sadece bir merak mı? Kullanmak iyi / kötü bir uygulama mıdır?

Yanıtlar:


11

Gilad Bracha bir süreden bahsediyor become::

Smalltalk'in en eşsiz ve güçlü özelliklerinden biri de Smalltalk topluluğu dışında en az bilinenlerden biridir. Olmak denilen küçük bir yöntem:.

Ne olur: alıcısının kimliğini ve argümanını değiştirir. Yani, sonra

olmak: b

çağrı noktasından önce a ile gösterilen nesneye yapılan tüm başvurular, b ile gösterilen nesneye atıfta bulunur.

Bunu içselleştirmek için bir dakikanızı ayırın; önemsiz bir şey olarak yanlış anlayabilirsiniz. Bu, iki değişkeni değiştirmekle ilgili değildir - kelimenin tam anlamıyla bir nesnenin diğerine dönüşmesi ile ilgilidir. Bu özelliğe sahip başka bir dil bilmiyorum. Bu muazzam bir güç ve tehlikenin bir özelliğidir.

Kalıcı nesneleri desteklemek için dilinizi genişletme görevini düşünün. Diyelim ki bir nesneyi diskten yüklemek istiyorsunuz, ancak referansta bulunduğu tüm nesneleri geçici olarak yüklemek istemiyorsunuz (aksi takdirde, sadece düz nesnenin serileştirmesi). Böylece, nesnenin kendisini yüklersiniz, ancak doğrudan referanslarını yüklemek yerine, bunları kabuk nesneleriyle değiştirirsiniz.

Kabuklar ikincil depolamaya ilişkin gerçek veriler için duruyor. Bu veriler tembel olarak yüklenir. Bir kabuk üzerinde bir yöntemi çağırmanız gerektiğinde, doesNotUnderstand: yöntemi ilgili veri nesnesini diskten yükler (ancak yine geçişli değil).

Daha sonra, bir hale gelir:, kabuğa yapılan tüm referansları yeni yüklenen nesneye yapılan referanslarla değiştirir ve çağrıyı yeniden dener.

Bazı ısrar motorları bu tür şeyleri onlarca yıldır yapıyorlar - ancak genellikle temsile düşük seviyeli erişime güveniyorlardı. Become: Bunu kaynak kodu düzeyinde yapmanızı sağlar.

Şimdi bunu Java ile yapın. Veya başka bir dinamik dilde bile. Bu şekilde genel bir vadeli işlemler ve dolayısıyla tembellik yapabileceğinizi fark edeceksiniz. Hepsi uygulamanın çalışmalarına ayrıcalıklı erişim olmadan. Şema gelişimi için de yararlıdır - örneğin bir sınıfa bir örnek değişkeni eklediğinizde. Tüm örnekleri gerektiği gibi "yeniden şekillendirebilirsiniz".

Tabii ki olmak için kullanmamalısınız: raslantı. Birçok uygulamada engelleyici olabilecek bir maliyetle gelir. Erken Smalltalks'ta, haline gel: ucuzdu, çünkü tüm nesnelere dolaylı olarak bir nesne tablosu aracılığıyla başvuruldu. Bir nesne tablosunun yokluğunda, haline: yığını bir çöp toplayıcıya benzer şekilde geçirir. Ne kadar fazla belleğe sahip olursanız, o kadar pahalı hale gelir: olur.

Bir nesne tablosuna sahip olmak depolamayı alır ve erişimi yavaşlatır; ama size çok fazla esneklik sağlıyor. Donanım desteği performans cezasını azaltabilir. Avantajı, ön tablonun bir nesne tablosu üzerinden dolaylı maliyet ödemek istiyorsanız, birçok zor sorunun oldukça izlenebilir hale gelmesidir. Unutmayın: bilgisayar bilimindeki her problem ekstra dolaylı indirgeme düzeyleriyle çözülebilir. Örneğin Alex Warth'in bu kategoriye uyan çok ilginç çalışmaları var.

Olun: birkaç varyasyonu vardır - bir yol haline gelir: A nesnesinin kimliğini başka bir B nesnesinin kimliğiyle değiştirir, böylece A şimdi B'ye işaret eder; B referansları değişmeden kalır. Genellikle: yararlı - bir dizideki tüm nesnelerin kimliklerinin (tek yönlü veya çift yönlü olarak) aktarılması. Bir grup haline gelir: Atomik olarak büyü yapan, örneğin bir sisteme yansıtıcı güncellemeler uygulamak için harikadır. Tüm sınıfları ve örneklerini tek seferde değiştirebilirsiniz.

Hatta güvenli olmak türü düşünebilirsiniz:. İki yoldan oluşur: yalnızca A tipi B ile aynı ise güvenli tiptir, ancak bir yol şu olur: sadece yeni nesnenin eskisinin bir alt türü olmasını gerektirir.

Bir nesne tablosuna sahip olmanın aslında iyi bir şey olup olmadığını yeniden düşünmenin zamanı gelmiş olabilir.

Etkili bir şekilde elde ettiğiniz şey, meta programlamaya ne kadardır yoluyla tembel bir yükleme şeklidir. Bracha'nın belirttiği gibi, bu çok yararlı olabilir, ancak ciddi bir performans etkisi taşıyabileceği için de tehlikelidir.


becomeBenim akıl sağlığım üzerindeki etkisinin programımın performansından çok daha fazla endişe duyarım ...
Benjamin Hodgson

Hardware support could ease the performance penalty.Bunu duyduğum tüm yerlerden Smalltalk topluluğu en önde gelenleri oldu. İdealist programlama paradigmalarını etkinleştirmek için neden daha fazla performans, daha az güç kullanımı veya daha fazla kapasite sağlayacaksa donanım iyileştirmelerini "harcamalıyız".
Alexander - Monica'yı eski

2

Çok kullanılmaz. Açtığım Pharo 5 görüntüsünde, 7'si birim testlerde olan #become: 9 göndericisi var. Derleyicide kod oluşturmada ve Yakıt serileştirme kütüphanesinde proxy'leri içeriklerine göre değiştirmek için kullanılır.


İlginç. Birim testleri ne için kullanıyor?
dpk

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.