Согласен, zf не идеален. Но что значит идеальный код? Все люди рассуждают немного по-разному. То что очевидно для меня, не обязательно будет очевидно для другого.
Есть некоторые правила, которых я всегда придерживаюсь в работе (которые не раз экономили время):
- отсутствие глобальных переменных
- конфиг только один для всего проекта
- понятные названия функций и переменных (англ. здесь помогает)
- самодокументированный код (если в коде много коментов, значит что-то с ним не так)
- отсутствие DRY (dont repeat yourself), т.е. нет копипаста
- вынос общей логики в абстрактные типы
- не делать классы по типу "весть трэш в одной корзине"
- выносить общую логику в узловые классы, т.е. поднимать вверх по иерархии наследования
- не "наследовать" холодильник от телевизора, только потому что у обоих есть шнур электропитания
- макимально ограничивать доступ к методам и аттрибутам класса, т.е. если он толко приватный, то не делать его защищенным или публичным
- делать маленькие и понятные методы класса, т.е. не писать функцию, в которой туча if ... else, а разбить ее на несколько подфункций (огромные функции такое же зло, как и глобалсы), НО не плодить ненужные сущности
- не усложнять код, т.е. не применять наследование там где это не нужно
- проверять инвариантность объекта, там где необходимо (т.е. перед тем как что-то с ним сделать проверить все ли аттрибуты в порядке, например объект подключения к БД)
- отлавливать ошибки через try ... catch
- разумно использовать паттерны
- И САМОЕ ГЛАВНОЕ: писать код в первую очередь для человека, а не для компьютера
Это прописано в хороших книгах по программированию (читайте C++ от Бьерна Страуструпа). И это действительно так. Это помогает. И делает жизнь кодера лучше
Надо учиться. Если человек написал DLE или Bitrix и потом гнет пальцы, хрен его кода переубедишь в недальновидности его подхода. Покупают код ведь менеджеры, которые смотрят на цену, скидки и красивую упаковку, а не на то что внутри.