Najlepszy sposób radzenia sobie ze stanem brudnym w modelu ORM
Nie chcę, żeby ktoś mówił„nie powinieneś zmieniać koła, korzystaj z otwartego źródła ORM”; Mam natychmiastowy wymóg i nie mogę się zmienić.
Robię mały ORM, który obsługuje buforowanie. Nawet nie wspierając buforowania, i tak potrzebowałbym tej funkcji, aby wiedzieć, kiedy zapisać obiekt do pamięci, czy nie. Wzorzec to DataMapper.
Oto moje podejście:
Chcę uniknąć introspekcji w czasie wykonywania (tj. Atrybutów zgadywania).Nie chcę używać generatora kodu CLI do generowania getterów i setterów (naprawdę używam NetBeansa, używając ALT + INSERT).Chcę, aby model był najbliżej POPO (zwykły stary obiekt PHP). Mam na myśli: prywatne atrybuty, „zakodowane na stałe” pobierające i ustawiające dla każdego atrybutu.Mam wywoływaną klasę AbstractAbstractModel
że wszystkie modele dziedziczą. Ma publiczną metodę zwanąisDirty()
z prywatnym (może być również chroniony, jeśli to konieczne) atrybut o nazwie is_dirty. Musi zwracać wartość true lub false, w zależności od tego, czy nastąpiła zmiana danych obiektu, czy nie, ponieważ została załadowana.
Problem polega na: czy istnieje sposób na podniesienie flagi wewnętrznej"is_dirty"
bez kodowania w każdym selektorze$this->is_dirty = true
? To znaczy: chcę mieć seterów$this->attr = $value
przez większość czasu, z wyjątkiem zmiany kodu potrzebnej do logiki biznesowej.
Inne ograniczenie polega na tym, że nie mogę polegać__set
ponieważ w konkretnej klasie modelu atrybuty już istnieją jako prywatne, więc__set
nigdy nie jest wywoływany na setterach.
Jakieś pomysły? Przykłady kodu od innych ORM są akceptowane.
Jednym z moich pomysłów było zmodyfikowanie szablonu ustawników NetBeans, ale myślę, że powinien istnieć sposób na zrobienie tego bez polegania na IDE.
Inną myślą, jaką miałem, było utworzenie seterów, a następnie zmiana nazwy prywatnego atrybutu za pomocą podkreślenia lub czegoś. W ten sposób seter zadzwoni do__set
i mieć tam jakiś kod do radzenia sobie z"is_dirty"
flagę, ale to trochę łamie koncepcję POPO i jest brzydka.