Myślę, że slajd 13 w jego prezentacji ( The Value of Values ) pomaga to zrozumieć:
Wartości
- Nie potrzebuję metod
- Mogę przesłać ci wartości bez kodu
i wszystko w porządku
Rozumiem, że Hickey sugeruje, że jeśli muszę, powiedzmy, podwoić wartość, którą mi przesłałeś, po prostu piszę kod wyglądający jak
MyValue = Double(YourValue)
Widzisz, powyższy kod jest taki sam, bez względu na to, jaką wartość przesłałeś - coś w rodzaju idealnego ponownego wykorzystania .
Jak by to wyglądało w języku posiadającym obiekty i interfejsy?
Doublable MyValue = YourValue.Double()
zaczekaj! co jeśli YourValue
się nie wdraża Doublable
? nie to, że nie można go podwoić, może być idealnie, ale ... co jeśli nie ma po prostu żadnej metody Double
? (a jeśli istnieje metoda o nazwie powiedz TwiceAsMuch
?)
Och, mamy problem. YourValue.Double
nie będzie działać, nie będzie można go ponownie wykorzystać . Według mojej lektury powyższego slajdu chodzi o to, co Hickey miał na myśli, mówiąc: „Wszystkie te interfejsy zabijają twoje ponowne użycie!”
Widzicie, interfejsy zakładają, że obiekty są przekazywane „wraz z ich metodami” wraz z działającym na nich kodem. Aby używać obiektów, należy zrozumieć, jak wywołać ten kod i jaką metodę wywołać.
Gdy brakuje oczekiwanej metody , pojawia się problem, chociaż semantycznie pożądana operacja ma idealny sens dla obiektu. Jak stwierdzono w prezentacji, wartości nie potrzebują metod („Mogę przesyłać ci wartości bez kodu i wszystko w porządku”), co pozwala pisać kod, który zajmuje się nimi w sposób ogólny.
Uwaga dodatkowa: pojęcie przekazywania wartości bez kodu w jakiś sposób przypomina mi wzór Flyweight w OOP.
obiekt, który minimalizuje zużycie pamięci, udostępniając jak najwięcej danych innym podobnym obiektom; jest to sposób na użycie obiektów w dużych ilościach, gdy prosta powtarzana reprezentacja wymagałaby niedopuszczalnej ilości pamięci ... Obiekty Flyweight są z definicji obiektami o wartości . Tożsamość instancji obiektu nie ma znaczenia, dlatego dwa wystąpienia Flyweight o tej samej wartości są uważane za równe ...
Zastosowania Flyweight zwykle widziałem to samo podejście do usuwania kodu (metod, interfejsów) z obiektów i przekazywania rzeczy dookoła, a także wartości bez kodu , spodziewając się, że kod otrzymujący ma środki niezbędne do działania na nich.
Czuje się to tak, jak na slajdzie: „wartości nie wymagają metod. Mogę przesyłać ci wartości bez kodu i wszystko jest w porządku”.