Jakie zastosowania ma „Smalltalk”:

12

become:Wiadomości w Smalltalk powoduje jednego obiektu do zmiany na inny, wpływając na wszystkie odwołania do niego.

Jakie zastosowania ma ta funkcja języka? Czy wykorzystuje się go w prawdziwym kodzie? Czy to tylko ciekawość? Czy używanie go jest uważane za dobrą / złą praktykę?

dpk
źródło

Odpowiedzi:

11

Gilad Bracha mówi o tym become:trochę:

Jedna z najbardziej unikalnych i potężnych funkcji Smalltalk jest również jedną z najmniej znanych poza społecznością Smalltalk. Jest to mała metoda o nazwie stać:.

Staje się: robi to zamiana tożsamości odbiorcy i argumentu. To znaczy po

a staje się: b

wszystkie odniesienia do obiektu oznaczonego przed punktem wywoławczym odnoszą się do obiektu oznaczonego przez b i odwrotnie.

Poświęć chwilę na internalizację tego; możesz źle to zrozumieć jako coś trywialnego. Nie chodzi o zamianę dwóch zmiennych - chodzi dosłownie o to, że jeden obiekt staje się drugim. Nie znam żadnego innego języka, który ma tę funkcję. Jest to cecha ogromnej mocy - i niebezpieczeństwa.

Rozważ zadanie rozszerzenia języka na obsługę obiektów trwałych. Powiedzmy, że chcesz załadować obiekt z dysku, ale nie chcesz ładować wszystkich obiektów, do których odnosi się przejściowo (w przeciwnym razie jest to po prostu deserializacja zwykłego obiektu). Tak więc ładujesz sam obiekt, ale zamiast ładować jego bezpośrednie odniesienia, zastępujesz je obiektami łuskowymi.

Łuski zastępują prawdziwe dane na temat pamięci dodatkowej. Te dane są ładowane leniwie. Kiedy rzeczywiście potrzebujesz wywołać metodę na łusce, jej metoda doesNotUnderstand: metoda ładuje odpowiedni obiekt danych z dysku (ale znowu nie tranzytowo).

Następnie staje się: zastępując wszystkie odniesienia do łuski odniesieniami do nowo załadowanego obiektu i ponawia wywołanie.

Niektóre mechanizmy trwałości robiły takie rzeczy od dziesięcioleci - ale zwykle polegały na niskim poziomie dostępu do reprezentacji. Zostań: pozwala to zrobić na poziomie kodu źródłowego.

Teraz zrób to w Javie. Lub nawet w innym dynamicznym języku. Poznasz, że możesz w ten sposób stworzyć ogólną formę przyszłości, a tym samym lenistwo. Wszystko bez uprzywilejowanego dostępu do funkcjonowania wdrożenia. Jest także przydatny do ewolucji schematu - na przykład, gdy dodajesz zmienną instancji do klasy. W razie potrzeby można „przekształcić” wszystkie wystąpienia.

Oczywiście nie powinieneś używać stać: od niechcenia. Obejmuje koszt, który w wielu wdrożeniach może być wygórowany. Na początku Smalltalks stał się: był tani, ponieważ do wszystkich obiektów odwoływano się pośrednio za pomocą tabeli obiektów. W przypadku braku tabeli obiektów, staje się: przemierza stertę w sposób podobny do śmieciarza. Im więcej masz pamięci, tym droższa staje się: staje się.

Posiadanie tabeli obiektów zajmuje miejsce i spowalnia dostęp; ale daje ci dużą elastyczność. Wsparcie sprzętowe może złagodzić spadek wydajności. Zaletą jest to, że wiele trudnych problemów staje się całkiem wykonalnych, jeśli chcesz zapłacić koszty pośrednie za pośrednictwem tabeli obiektów z góry. Pamiętaj: każdy problem w informatyce można rozwiązać za pomocą dodatkowych poziomów pośrednich. Alex Warth ma na przykład bardzo interesującą pracę, która pasuje do tej kategorii.

Become: ma kilka odmian - w jeden sposób staje się: zmienia tożsamość obiektu A na tożsamość innego obiektu B, tak że odniesienia do A wskazują teraz na B; odniesienia do B pozostają niezmienione. Często przydaje się: masowo - transmisja tożsamości wszystkich obiektów w tablicy (jednokierunkowo lub dwukierunkowo). Grupa staje się: magia atomowa doskonale nadaje się na przykład do wdrażania odblaskowych aktualizacji systemu. Możesz zmienić cały zestaw klas i ich instancje za jednym razem.

Możesz nawet wyobrazić sobie, że typ bezpieczny to:. Dwukierunkowy staje się: jest bezpieczny tylko dla typu, jeśli typ A jest identyczny z typem B, ale jeden sposób staje się: wymaga tylko, aby nowy obiekt był podtypem starego.

Czas zastanowić się, czy posiadanie tabeli obiektów jest rzeczywiście dobrą rzeczą.

Skutecznie dostajesz formę leniwego ładowania za pomocą tego, co oznacza metaprogramowanie. Jak zauważa Bracha, może to być bardzo przydatne, ale także niebezpieczne, ponieważ może mieć poważny wpływ na wydajność.

Inżynier świata
źródło
Bardziej martwiłbym się becomewpływem na moje zdrowie psychiczne niż na wydajność mojego programu ...
Benjamin Hodgson,
Hardware support could ease the performance penalty.Spośród wszystkich miejsc, które o tym słyszałem, społeczność Smalltalk była najważniejsza. Dlaczego powinniśmy „wydawać” ulepszenia sprzętowe na umożliwienie idealistycznych paradygmatów programowania, skoro może to zamiast tego prowadzić do zwiększenia wydajności, zmniejszenia zużycia energii lub zwiększenia możliwości.
Alexander - Przywróć Monikę
2

Nie jest często używany. Na zdjęciu Pharo 5, które mam otwarte, jest 9 nadawców #become: 7 z nich jest w trakcie testów jednostkowych. Jest on używany w kompilatorze do generowania kodu oraz w bibliotece serializacji Fuel w celu zastąpienia serwerów proxy ich zawartością.

Stephan Eggermont
źródło
Ciekawy. Do czego służą testy jednostkowe?
dpk
sprawdzić, czy to działa ...
Stephan Eggermont