2009-11-13 4 views
8

Hiç Smalltalk kullanmamıştım, ancak bu konuda çok şey okudum ve her zaman beni şaşırttı. Bir programın çalıştığı ve sadece programın nesnelerinin kullandığı sınıfların yöntemlerini değiştirerek çalışan programın davranışını değiştiren havalı demoları gördüm. Açıkça güçlü şeyler ve bunun nasıl çalıştığını anlıyorum. Kesin olarak görünmemesi gereken şey, bu sınıfın örnek değişkenlerini eklemek, kaldırmak veya yeniden adlandırmak istediğinizde, bir sınıfın varolan örneklerine ne olduğudur.Smalltalk sınıfının örnek değişkenlerini yeniden tanımlama

Tüm sınıfların çalışan bir programda kullandığı örnek değişkenleri nasıl değiştirebileceğini ve bu sınıfın varolan örneklerinin daha sonra düzgün çalışmasını beklemeyi hayal edemiyorum. Belki de ilklendirmem gereken ve daha önce varolan yöntemlerin bu değişkene bağlı olarak değiştirildiği yeni bir değişken ekliyorum. O sınıfın canlı örneklerine sahip herhangi bir çalışan kodun korkunç bir bozukluğuyla sonuçlanamaz mıyım? Ya da bir örnek değişkenin anlamı değiştiyse ve şimdi daha önceden var olandan farklı bir nesnenin varlığını beklersek ne olur? Bir çeşit "yükseltme" mekanizması var mı? Ya da önceki örneklerin çökmesine ve yanmasına izin vermek için alışılmış pratik mi? Yoksa bu sadece "program yürütme konusunda böyle bir şey yapmayız ve hayatta kalmalarını beklemez miyiz?"

Düşünebildiğim tek mantıklı temiz yaklaşım, örnek değişken tanımlarını değiştirdiğinizde belki de tamamen yeni bir sınıf oluşturduğudur ve değişiklikten önce eski örneklerin eski sınıf tanımıyla düzgün çalışmaya devam etmesidir. (Bu, adı yeni sınıf tanımına yeniden tanımlandığından beri isim ile erişilemez). Belki de bu en mantıklı açıklamadır - ama bu süreci doğrudan açıklayan bir şey bulamadığım için, burada sormam ve bana ne tür eğlenceli bilgiler verdiğimi anladım. :) Dediğin gibi

cevap

7

this paper göre, geçerli:

Ayrıca otomatik nesne yapıları bakımından sistem tutarlılığı güvence altına alınması ve isim çakışması özellikle örnek değişkeni adı çatışmaların önlenmesi, sınıf yeniden tanımlanmasını yönetir. Bir sınıf tanımı değiştiğinde, var olan örnekler yeni sınıflarının tanımına uymak için yapısal olarak değiştirilmelidir. Var olan bir nesneyi değiştirmek yerine, ClassBuilder doğru yapıya sahip yeni bir tane oluşturur (yani, eski olanı değiştiren yeni sınıftan). Daha sonra bu yeni nesneyi eski olanın değerleri ile doldurur. ClassBuilder, eski nesnelerin tüm sistemde yenileriyle değiştirerek, yapısal değişikliklere devam etmek için ilkel (cf 2.1.1) öğesini kullanır.

+0

Awesome! Bu bağlantı için teşekkürler. Google'lılarımın bu cevabı bulmak için neden yeterince güçlü olmadığını anlamıyorum. Bu soruyu göndermeden önce bir süre denedim! Önemli bir anahtar kelimeyi kaçırmış olmalıyım. : P – Sean