Exagg'itive Podsumowanie (TM)
Dostajesz kilka rzeczy.
- Dziedziczenie prototypowe i klonowanie
- Dynamiczne dodawanie nowych właściwości
- Współistnienie obiektów różnych wersji (poziomów specyfikacji) tej samej klasy.
- Obiekty należące do nowszych wersji (poziomy specyfikacji) będą miały dodatkowe „opcjonalne” właściwości.
- Spojrzenie na nieruchomości, stare i nowe
- Introspekcja zasad walidacji (omówione poniżej)
Jest jedna poważna wada.
- Kompilator nie sprawdza dla Ciebie literówek.
- Narzędzia do automatycznego refaktoryzacji nie zmienią dla ciebie nazw kluczy własności - chyba że zapłacisz za fantazyjne.
Chodzi o to, że można uzyskać introspekcję, używając, um, introspekcji. Tak zwykle się dzieje:
- Włącz odbicie.
- Dodaj dużą bibliotekę introspekcji do swojego projektu.
- Oznacz różne metody i właściwości obiektów atrybutami lub adnotacjami.
- Niech biblioteka introspekcji wykona magię.
Innymi słowy, jeśli nigdy nie potrzebujesz interfejsu z FP, nie musisz brać rady Richa Hickeya.
Na koniec, ale nie najmniej (ani najładniejszy), chociaż użycie String
jako klucza właściwości ma najprostszy sens, nie musisz używać String
s. Wiele starszych systemów, w tym Android ™, intensywnie wykorzystuje identyfikatory liczb całkowitych w całej strukturze w odniesieniu do klas, właściwości, zasobów itp.
Android jest znakiem towarowym firmy Google Inc.
Możesz także uszczęśliwić oba światy.
W świecie Java zaimplementuj metody pobierające i ustawiające jak zwykle.
Dla świata FP zaimplementuj
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
Wewnątrz tych funkcji, tak, brzydki kod, ale istnieją wtyczki IDE, które wypełnią to za Ciebie, używając ... uh, inteligentnej wtyczki, która odczytuje twój kod.
Strona Java będzie tak samo wydajna jak zwykle. Nigdy nie użyją tej brzydkiej części kodu. Możesz nawet chcieć ukryć to przed Javadoc.
Strona FP na świecie może napisać dowolny kod „leet”, jaki chce, i zazwyczaj nie krzyczy na ciebie, że kod jest powolny.
Ogólnie rzecz biorąc, używanie mapy (torby właściwości) zamiast obiektu jest powszechne w programowaniu. Nie jest on unikalny dla programowania funkcjonalnego ani żadnego konkretnego rodzaju języków. To może nie być podejście idiomatyczne dla danego języka, ale są sytuacje, które tego wymagają.
W szczególności serializacja / deserializacja często wymaga podobnej techniki.
Kilka ogólnych przemyśleń na temat „mapy jako obiektu”.
- Nadal musisz zapewnić funkcję sprawdzania poprawności takiej „mapy jako obiektu”. Różnica polega na tym, że „mapa jako obiekt” pozwala na bardziej elastyczne (mniej restrykcyjne) kryteria sprawdzania poprawności.
- Możesz łatwo dodawać pola dodatkowe do „mapy jako obiektu”.
- Aby podać specyfikację minimalnego wymagania prawidłowego obiektu, musisz:
- Wymień „minimalnie wymagany” zestaw kluczy oczekiwanych na mapie
- Dla każdego klucza, którego wartość wymaga walidacji, podaj funkcję walidacji wartości
- Jeśli istnieją reguły sprawdzania poprawności, które muszą sprawdzać wiele wartości klucza, również to podaj.
- Jaka jest korzyść? Podanie specyfikacji w ten sposób jest introspektywne: możesz napisać program, który będzie sprawdzał minimalnie wymagany zestaw kluczy i uzyskał funkcję sprawdzania poprawności dla każdego klucza.
- W OOP wszystkie są zwinięte w czarną skrzynkę, w imię „enkapsulacji”. Zamiast logiki sprawdzania poprawności odczytywanej maszynowo, wywołujący może czytać tylko „dokumentację API” czytelną dla człowieka (jeśli na szczęście istnieje).