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.

questionAnswers(3)

yourAnswerToTheQuestion