Възможен проблем с кръгова зависимост с PHP приложение

Изпитвам това, което смятам, че е проблем с кръгова зависимост с моето PHP приложение. Моля, уведомете ме, ако това е неправилно. Ето каква е ситуацията:

Два класа, LogManager и DBSession.

DBSession се използва за взаимодействие с базата данни, а LogManager се използва за влизане във файлове. И двете се използват широко в моето приложение. Когато създавате екземпляр на DBSession, трябва да му дадете екземпляр на LogManager чрез параметър на конструктора. Това е така, защото DBSession понякога ще регистрира информация във файл и ще използва екземпляра на LogManager, за да направи това.

Сега исках да разширя LogManager, така че да може да влиза и в таблица на база данни, а не в текстов файл. Естествено, предпочитам да използвам повторно съществуващите класове, но скоро осъзнах, че това доведе до интересна ситуация.

DBSession вече изисква екземпляр на LogManager за изграждане. Ако искам да използвам отново класа DBSession в LogManager, той вече ще изисква екземпляр на DBSession. Как мога да удовлетворя и двете изисквания? Очевидно нещо не е наред с подхода ми.

Как бихте ми предложили да поправя това?

Благодаря предварително, момчета.


person Matt Refghi    schedule 12.10.2008    source източник


Отговори (4)


Не разширявайте LogManager, оставете го да бъде агрегатен тип. И отложете избора къде искате да влезете, т.е.

$logManager = new LogManager();
$dbSession = new DbSession($logManager);
$logManager->add(new FileLog($filename) );
$logManager->add(new DBLog($dbSession) );

Разбира се, FileLog и DBLog споделят общ интерфейс. Това е приложение на модела Observer, където add() е операцията "subscribe", а FileLog/DBLog са наблюдателите на регистрираните събития. (По този начин можете също да запазвате регистрационни файлове на много места.)

Редактиране на Owen: коригирано към php синтаксиса.

person Federico A. Ramponi    schedule 12.10.2008
comment
$logManager = нов LogManager(); $dbSession = нова DbSession($logManager); $logManager-›добавяне(нов FileLog($filename)); $logManager-›добавяне(нов DBLog($dbSession)); - person micahwittman; 12.10.2008

Един от тези обекти всъщност не се нуждае от другия: познахте, това е DBSession. Променете този обект, така че регистраторът да може да бъде прикрепен към него след изграждането.

person Edward Z. Yang    schedule 12.10.2008

Защо да изисквате обект LogManager за създаването на обект DbSession, ако той само понякога пише във файлове? вместо това го заредете мързеливо само когато имате нужда от него. Също така според мен и двете трябва да са независими една от друга. Всеки би могъл да даде пример на другия, когато е необходимо.

person Eran Galperin    schedule 12.10.2008
comment
Никога не съм опитвал да внедря мързеливо зареждане, но благодаря за препоръката. Признавам, че би било по-подходящо, като се има предвид, че LogManager се използва само понякога с DBSession. Благодаря! - person Matt Refghi; 12.10.2008

Може би можете да приложите някакъв модел, като Singleton Pattern, за да сте сигурни, че имате само един екземпляр на вашият клас LogManager например.

person Christian C. Salvadó    schedule 12.10.2008