Mam serię obiektów Ruby, które modelują podstawowy kod XML (jak OXM). Niestety, XML jest zmieniany, a odpowiednia wersja jest atakowana. Muszę zaktualizować moje obiekty Ruby, aby móc obsłużyć obie wersje. Chciałbym czegoś czystszego niż tona klauzuli if/else w moich metodach, ponieważ prawdopodobnie to się powtórzy. Czy istnieje idiomatyczny sposób na radzenie sobie z tym Ruby? Myślałem o użyciu klasy bazowej jako serwer proxy dla różnych „wersjonowanym” klas, tjWersja obiektu Ruby
class XMLModel
class V1
# V1 specific implementation
end
class V2;
# V2 specific implementation
end
def initialize
# create a new V? and set up delegation to that specific version of the object
end
def from_xml(xml_string)
# use the XML string to determine correct version and return a
# specific version of the object
end
end
Zaletą powyższej metody jest to, że każda wersja różni się w kodzie, i pozwalając mi Add/Drop wersje z niewielkimi testami zgodności wstecznej. Najgorsze jest to, że prawdopodobnie będę miał dużo duplikacji kodu. Również w tym przypadku XMLModel.new
zwraca nową XMLModel
, podczas gdy metoda fabryczna XMLModel.from_xml
zwraca nową XMLModel::V1
.
Pomysły?
można ukryć, że 'if' oświadczenie w inicjalizacji XMLModel (tj' new') ... I nie może wydawać się bez użycia oddzielnego intialization fabryki, czyli 'XMLModel.create'. Chciałbym, żeby ludzie nie musieli wiedzieć o wersjach i mogli używać obiektu jako normalnego obiektu Ruby i wywoływać 'XMLModel.new', ukrywając w ten sposób całą implementację za modelem. –
możesz zastąpić ':: new'. Domyślną nową metodą jest (myślę) coś w stylu: "def new (* args); obj = przydziel; obj.initialize (* args); retrun obj; end' Przepraszamy za jeden wiersz, komentarze i kod nie mieszają się dobrze. – Ian
dodano odpowiedź z bardziej szczegółowym przedefiniowaniem :: nowy – Ian