Устранений зависимостей от... имён ключей хеш-таблиц о объектах

cranchzerro

Новичок
Устранений зависимостей от... имён ключей хеш-таблиц о объектах

приветствую!
собственно, имеется проект (первоначальные авторы, называют это CMF... но не суть важно), который мне предстоит поддерживать, и располагаемый некоторым количеством системных объектов, например таких новомодных, как: response, request, controller command и прочее MVC-сословие.
Авторы, видимо, вдохновившись исследованиями различных методологов OOP&D, не до конца проработали все эти понятия и приёмы, и в результате чего имеем - у каждого класса, который есть в ЦМФ, ОБЯЗАТЕЛЬНО присутствует свой интерфейс (в большенстве случаев, нигде не используемый), туча различных Factory, которые в действительности просто Registry include-ащие файл с классом, ну и прочее присутствующее в большенстве движков, моторчиков и турбомоторов вращающих функциональность сайта.
Впринципе, то что имеется работает, ну и Бог с ним... но, этот "движок" (размером в 57кб ;) теперь моё наследие, отказаться от которого, либо же предлажить альтернативу более граматных авторов (например, та же Simphony) я не могу, так как на этом работает некоторая часть сайтов, и так же, чисто по сугубо внутриштатным обстоятельствам.

Однако, с другой стороны, мне нужно (эта "нужда" - суть так сказать проверочной работы, выполненная мною как специалистом), что-нибудь (вот здесь вот можно сразу в пёрлы;) "что-нибудь, на своё усмотрение, оптимизировать" (С) Синьор-Программист конторки. Впринципе, оптимизировать что-нибудь, совершенно не проблема, так как двигло совершенно сырое, и не смотря на количество интерфейсов >= количеству классов (совершенно всех классов), зависимостей в этом проекте ну просто немерянно.

Собственно, самая большая, на мой взгляд "зависимость" наблюдается в передаче параметров между методами объектов и, самое мерзское - при хранении различной конфигурационной информации для каждого объекта, далее, в процессе обработки запроса, эти внутренние массивы забиваются на 5-7 уровней различной инфой, например, о компановке страницы, в результате вып. некоторой команды, и все методы объекта, что бы что-то получить или установить, делают следующее ужасное:
PHP:
template_name = $this->layoutMap[$layoutKey][$commandName]['commandResults'][$commandResult]['views'][$commandName.'-'.$commandStatus];
кроме того, множество объектов движка, хранятся в некоторых общих объектах, доступ к которым так же осуществляется по подобной ужасной схеме (то есть, через гряду ключ-значение ассоциативных массивов, ака Registry в понятиях этого ЦМФ).

Первым, что я решил "оптимизировать" - это избавиться от такого способа хранения объектов, внутри других объектов, и пожалуй единственный способ, который приходит мне на ум, это замена большенства ключей хешей этих массивов объектами (если не особо сильно менять всю внутреннюю архитектуру "проекта)

вобщем вопросы
1. насколько логично и правильно моё видение этой оптимизации? (если не менять всю структуру напроч)
2. посредством каких приёмов следует уменьшать подобные виды зависимостей (имена ключей в ассоциативных массивах, как имена вложенных "глобальных" объектов ака "звёздные объекты" - объектов, часто используемых прочими объектами)

p.s. про IoC на agiledev читал, Service locator не предлагать...

вобщем спасибо, жду комментов
 

Nicki

Новичок
сорри за офтоп небольшой, а что за Service locator? это способ предоставления доступа к звездным объектам?
 

cranchzerro

Новичок
Автор оригинала: Nicki
сорри за офтоп небольшой, а что за Service locator? это способ предоставления доступа к звездным объектам?
нет, по той ссылке, после теоретической части, описывается как сделать так, что бы при использовании некоторого метода какого-то инструмента из "коллекции" ТулКит (так же известного как Context), не нужно было указывать имя этого инструмента, а только метод...
вобщем, почему я это приписал в "з.ы." - большая часть ссылок из этого подфорума ведёт именно на agiledev.

В моём же случае, нужно не организовать некий подобный механизм, а просто избавиться от хеш-массивов, как хранилищ вложенных (зависимых) объектов внутри других (родительских) объектов.

Собственно, видеть 5-и этажные быдло-конструкции c хэшами, только для того, что бы хранить объекты (инструменты)

Вобщем, я остановился примерно на таком подходе:
PHP:
template_name = $this->layoutMap[$layoutKey][$commandName]...
стало:
PHP:
template_name = $this->layoutMap->getLayout($layoutKey)->getCommand($commandName)...
впринципе, "оптимизации" в общеупотребляемом здесь смысле нет никакой, но синьёр-девелупёр этой конторки, использует это слово где и когда не лень, и в любых контекстах.
Переведя массивы на объекты, я добъюсь: абстрагирования зависимостей путём декларирования интерфейсов, возможности повторного использования, например сущности LayoutMap как объекта со своей интерфейсном, а не как возвращаемый массив. впринципе, только этих двух вещей вполне достаточно для того, что бы результаты моей тестовой работы, можно было с полным правом назвать оптимизацией во всех понятиях этого слова )

Хотя, здесь бы и прорулил Service Locator (а ещё лучше чтение зависимости из конфига и создание из в рантайме), но это уже не задачи "оптимизации", а полная перестройка архитектуры 57 килобайтного извращения быдло-кодеров, бегающих по офису с криками - MVC! CMF! Паттерны!!

зы: если, у кого-то имеются некие соображения - милости прошу, господа высказываться!
 

Alexandre

PHPПенсионер
может стоит задуматься над более серьезным рефакторингом?
57 килобайтного извращения быдло-кодеров, бегающих по офису с криками - MVC! CMF! Паттерны!!
работал я с такой хреновиной как-то. Совершенно неудобно. чтоб написать простой модуль отображения новостей, надо потратить минимум 2 дня.

как меня учили в одной конторе, "делай как можно проще,
сложно само получится."
 

StUV

Rotaredom
MiRacLe
кажется, это был стеб... судя по остальному сообщению ;)

-~{}~ 15.07.08 16:42:

template_name = $this->layoutMap->getLayout($layoutKey)->getCommand($commandName)...
... ->getResult($commandResult)->getView($commandName.'-'.$commandStatus);
- ?..
если так, то, кажется, это какой-то бессмысленный рефакторинг... - я бы копнул глубже

ессно, если этот нелепый бесполезный труд не "для галочки"

-~{}~ 15.07.08 16:49:

+
вообще говоря, какое-то совершенно странное сочетание параметров:
layoutKey
commandName
commandResult
commandStatus
которое в итоге дает имя шаблона

ппц
похоже на признак мегауниверсальной цмс =)
 

cranchzerro

Новичок
Автор оригинала: StUV
кажется, это был стеб... судя по остальному сообщению ;)
да, стёб, и ещё какой!!!
стёб авторами ЦМС над сознанием человека, которому предстоит это всё поддерживать.
...какая там нафик мегауниверсальная ЦМС.

commandName - имя команды
commandResult - а вот таким способом, народ передаёт результаты команд, отличных от связки: состояние команды/представление
commandStatus - результат (состояние) команды. это значение устанавливается самой командой через Глобальный объект а-ля Context

я долго курил сорцы и рассказы лидируещего программиста о внутренностях движка, и после небольших спорах (допускаемых на собеседовании) мы пришли к соглашению: "претендующий на должность программиста в нашей компании, не должен при тестовом задании обсуждать продукт(народное достояние), а просто выполнить поставленную перед ним задачу - оптимизация"
мда, вот так вот: оптимизация, и всё тут! а я не то что оптимизировать, я смотреть на сырец спокойно не могу.

видите ли, это может где-то там в Киеве, Москве и прочих мегаполисах и около того, более-менее вменяемый PHP программист без труда сможет найти адекватную работу, но у нас, в селе Луганск г. Украины, подобные явления расцениваются как эдакий себе раритет... и поэтому, если я всё-таки там останусь, более глубокий рефакторинг будет произведён... в сторону полного переписывания (хотя нет... имена некоторых классов, пожалуй оставлю, вот зацените например: class RemoteNotificationBroker implements IObservable, INotifyable, IDecorable - классно звечит, хоть и является просто Mock ;) )

но просто, что бы кто-то начал меня слушать из отцов-основателей этой конторки, необходимо вначале выполнить тестовое задание по ОптИМизАЦии...
 

StUV

Rotaredom
cranchzerro
просто... даже для написания такой цмс нужен моск и немалый
поэтому, есть большая вероятность, что бессмысленность данного рефакторинга будет замечена и кем-нить из "отцов-основателей"

если это дело можно было бы сократить (_глобально_) до
$template_name = $this->layoutMap->getView();
тогда да, это имело бы смысл
 

crocodile2u

http://vbolshov.org.ru
Я бы еще добавил, что рефакторинг и оптимизация - это как бы две совершенно разыне вещи. Пока что из поста видно только, что требуется рефакторинг. Про оптимизацию в общем нет ничего. Просьба: использовать общепринятую терминологию, дабы не вводить в заблуждение читателей.
 

Alexandre

PHPПенсионер
ппц
похоже на признак мегауниверсальной цмс =)
кодирование ради архитектуры.... ни когда не понимал таких чудо-зодчих.

cranchzerro делай проще, и к твоей ЦМС - потянутся люди...
я долго курил сорцы и рассказы лидируещего программиста о внутренностях движка, и после небольших спорах (допускаемых на собеседовании) мы пришли к соглашению: "претендующий на должность программиста в нашей компании, не должен при тестовом задании обсуждать продукт(народное достояние), а просто выполнить поставленную перед ним задачу - оптимизация"
стоит задуматься над сменой компании...
адекватную работу, но у нас, в селе Луганск
даааа...
не завидую тебе, делать ОптИМизАЦию 3 км говнокода ради одного тестового задания.
 

kode

never knows best
cranchzerro
Завтра на работу можете не приходить, вы уволены

Ваш Начальник

:D
 
Сверху