Załóżmy, że mamy obiekt reprezentujący konfigurację sprzętu. Ze względu na argument, regulator temperatury (TempController). Zawiera jedną właściwość, ustawioną temperaturę.Obiektywny sposób oddzielania modelu od jego reprezentacji
Muszę zapisać tę konfigurację do pliku, aby móc jej użyć w innym urządzeniu. Format pliku (FormatA) jest ustawiony na kamień. Nie chcę, aby obiekt TempController wiedział o formacie pliku ... po prostu nie jest odpowiedni dla tego obiektu. Robię więc kolejny obiekt, "FormatAExporter", który przekształca kontroler TempController na pożądane wyjście.
Rok później tworzymy nowy regulator temperatury, nazwijmy go "AdvancedTempController", który ma nie tylko wartość zadaną, ale także kontrolę szybkości, co oznacza jedną lub dwie dodatkowe właściwości. Nowy format pliku jest również wymyślony, aby przechowywać te właściwości ... nazwijmy to FormatB.
Oba formaty plików mogą reprezentować oba urządzenia (zakładamy, że AdvancedTempController ma rozsądne wartości domyślne, jeśli nie ma w nim ustawień).
Oto, jaki jest problem: bez użycia "isa" lub innego "oszustwa", aby dowiedzieć się, jaki typ obiektu mam, w jaki sposób FormatBExporter może obsługiwać oba przypadki?
Moim pierwszym instynktem jest posiadanie metody w każdym regulatorze temperatury, który może zapewnić eksportera klienta dla tej klasy, np. TempController.getExporter() i AdvancedTempController.getExporter(). To nie obsługuje dobrze wielu formatów plików.
Jedynym innym podejściem, które przychodzi na myśl jest posiadanie w każdym regulatorze temperatury metody, która zwraca listę właściwości i ich wartości, a następnie formater może zdecydować, jak je wyprowadzić. To zadziała, ale wydaje się zawiłe.
AKTUALIZACJA: Po dalszej pracy to drugie podejście nie działa tak naprawdę. Jeśli wszystkie twoje typy są proste, ale jeśli twoje właściwości są Obiektami, to kończysz, po prostu wypychając problem w dół ... jesteś zmuszony zwrócić parę wartości Ciąg, Obiektów, a eksporter będzie musiał wiedzieć, co Obiekty faktycznie mają z nich korzystać. Po prostu przesuwa problem na inny poziom.
Czy są jakieś sugestie, w jaki sposób mogę zachować to elastyczne?
to również uczynić kod bardziej sprawdzalne, bo to, bo o wiele łatwiej drwić z kolaborantów. –
To dotyk bardziej skomplikowany, niż planowałem, ale lubię go. Zapewnia elastyczność zwracania wszystkich właściwości na liście, ale przy zachowaniu informacji o typie w całym interfejsie. I zdecydowanie pomaga w testowalności. –