расширение функционала

ps2007

Новичок
расширение функционала

Приветствую всех жителей форума.

Хотел узнать, как вы решаете такую проблему:
При разработке сайтов я использую фреймворк, использующий паттерн MVC. Часто приходится использовать похожие куски кода, которые далее буду называть модулем. Это авторизация пользователя, фотогалерея, каталог чего-либо, возможно с категориями, баннерная система, примеров можно найти много. Проблема в том, что я не могу найти простой способ расширения/изменения возможностей модуля. Рассмотрим 2 примера:
- Есть готовая система регистрации/авторизации пользователя, проверенная и протестированная в работе. Возникла необходимость добавить фотографию пользователя и еще несколько полей. Для того, чтобы не трогать уже протестированный код, я решил написать отдельный класс, в котором я решил реализовать дополнительный функционал. Создал таблицу для новых полей и пристыковал к уже существующей с помощью отношения один к одному. И тут начались проблемы, много проблем. Получилось не решение, а куча костылей.
- Другой пример. Есть готовый каталог предприятий. Необходимо добавить загрузку карты и логотипа.

Я вижу два выхода из положения:
1) Поправить модуль для своих нужд. Недостаток - правка уже проверенного кода, есть вероятность внесения ошибок/уязвимостей.
2) Заранее заложить всевозможные отключаемые "фичи". Недостаток - заранее невозможно все предусмотреть. Если дописывать "фичи" по мере необходимости, то получим "раздутый" модуль и нечитаемый код.

Была поставлена цель не трогать уже рабочий и протестированный код, а в результате получил массу проблем.

Как вы решаете подобные проблемы ?

С уважением,
Павел.
 

AmdY

Пью пиво
Команда форума
ты расширяешь по большому счёту не модуль, а модель здесь на помощь приходит ORM.
 

ps2007

Новичок
Это по сути дела получается вариант 1.

А какой именно ORM можешь посоветовать ?

Я намеренно не использую ORM ввиду падения производительности, кроме того я без проблем могу составить нужный мне запрос, а затем использую ActiveRecord.

Это является моей точкой зрения и не претендует быть истиной.
 

Beavis

Banned
по-моему ты зря поставил себе цель "не трогать уже рабочий и протестированный код"
доработай его так, чтобы он оставался рабочим и протестируй заново)
 

ps2007

Новичок
Наверное так и сделаю, если не найду лучшего варианта.
Всегда хочется иметь более логичный и красивый код :)

Что посоветуют другие участники форума ?
 

Adelf

Administrator
Команда форума
ps2007
"протестированный код" - это что? юнит- и другие тесты там... или просто полазил по сайту - вроде работает? :)

Мое мнение совпадает с мнением Beavis. У тебя код нерасширяем(точнее очень трудно расширяем... так трудно что ты его боишься трогать), следовательно он уже не идеальный.
 

ps2007

Новичок
я к сожалению пока не пользуюсь автоматическим тестированием, в дальнейшем собираюсь использовать SimpleTest. Пока тестирую вручную каждый пункт функционала.

У тебя код нерасширяем
Наверное :) Хотел бы узнать, как сделать расширяемый код и как распознать нерасширяемый код.
Можешь мне показать свой код ? Я обещаю, что дальше я никому его передавать не буду.
 

Adelf

Administrator
Команда форума
ps2007
Мой код тоже далеко не всегда мне нравится.
"Рефакторинг" Мартин Фаулер. Первые глав 9 наверн.. остальное там как справочник.
Это первое :)
А второе наверно стоит познакомиться с шаблонами проектирования. Тут книгу посоветовать не могу - сам ни одной нормальной не читал.
 

FB3

Новичок
Юнит тесты здесь: http://www.books.ru/shop/books/367978
Про паттерны именно на PHP здесь http://www.books.ru/shop/books/693675 - вроде в этой юнит-тесты тоже описываются, сам не полностью еще прочел, не помню точно. Не заслуженно далеко (странице на 5) книга на сайте в поиске находится. Наверное потому что нет в продаже.
 

С.

Продвинутый новичок
Во-первых, не паттерн MVC, а парадигма MVC. И это не просто буквоедство. Из паттерна следует четкое и недвузначное решение, парадигма оставлет очень большую степень свободы.

Два твоих варианта это действительно два наиболее естетсвенных решения "в лоб". У них у каждого свои преимущества и недостатки, и в общем они одинаково неидеальны. Если найдешь третий вариант, станешь гением.
 

fixxxer

К.О.
Партнер клуба
<очередной вброс on>

фаулера читать надо внимательно

например, там написано, что такое mvc на самом деле (а не что думают веб-разработчики)

оттуда же можно понять что по сути все известные фреймворки не удовлетворяет основным критериям вменяемого объектного дизайна :)
 

AmdY

Пью пиво
Команда форума
fixxxer
mcv родился не для web и нормально не может быть портирован. в вебе и вовсе много где вью сводится к шаблону, что дико раздражает.

ps2007
самое главное в твоей задаче - это контролировать изменения модели. добавил-изменил поле, методы save и find/get должны учитывать это поле и проводить нужные проверки. здесь здорово подходит Doctrine, тем более там есть миграция. Теперь нужно решить вопрос с отображением форм редактирования-добавления: в нормальных реализациях моделей есть metadata maping на основании которого можно строить форму как это делается в админках RoR или Django, хотя я пришёл к варианту, когда описание формы хранится в конфиге. Ну и третья ипостась - это вывод списка, что тоже очень легко можно делать с помощью тех же метаданных. В идеале, если отказаться от классического web mvc и сделать умные модели, которые не только хранят данные, но ещё и знают как их отображать и рассказывают об этом умной вьюхе, то лёгкие изменение модулей будет плёвым делом. Хотя чтобы всё это закодить у меня не хватает времени :(. поэтому проще каждый раз переписывать модули и завести для них разные ветки в СУВ.
 

fixxxer

К.О.
Партнер клуба
>> если отказаться от классического web mvc и сделать умные модели, которые не только хранят данные, но ещё и знают как их отображать и рассказывают об этом умной вьюхе

вооот!

- не совсем "как отображать", скорее "как рендериться". именно отображать это уже вьюха
- вполне может быть несколько "рендереров" -
- модель в случаях не самых тривиальных проще вынести отдельно; модель, рендерер и сторадж образуют в итоге, мм, назовем это компонент
- вьюха и "рендерер" вполне могут взаимодействовать. и тут мы внезапно получаем классический mvc, хаха. если смотреть не на названия а куда стрелочки идут разумеется.

-~{}~ 09.01.10 21:21:

да, чтобы не быть голословным

как примерно выглядит в таком случае работа контроллера:

PHP:
$Article = Article::constructById($this->args->id);
$EditForm = new ArticleEditForm;
$EditForm->fetchFrom($Article);
$this->View->Article->bind($Article);
$this->View->Form->bind($Form);

if ($this->Request->Post) {
    $EditForm->fetchFrom($this->Request->Post);
    if ($EditForm->validate()) {
        $Article->fetchFrom($EditForm);
        $Article->save();
        $this->redirectTo($this);
    }
}

TemplateFactory::createTemplate($this->tpl_file)
   ->parse($this->View)
   ->displayTo($this->Response);
 

ps2007

Новичок
Прошу прощения за отсутствие в течение некоторого времени.

самое главное в твоей задаче - это контролировать изменения модели.
Я пока не могу точно понять, в чем у меня проблема. Думаю, что у меня не получается контролировать процесс написания кода, т.е. пока не могу разложить по полочкам у себя в голове структуру программы/иерархию классов/зону ответственности различных блоков. В результате получается закостенелый говнокод. Ознакомился с шаблонами проектирования - к сожалению не могу понять, как применять большую часть. Примеры, с помощью которых демонстрируются эти шаблоны очень сильно натянуты. Пытался читать Фаулера - очень тяжело (хотя конечно я буду продолжать).

fixxxer, а чем отличается view от renderer'а ?
У меня раньше тоже была идея написать генератор форм, который генерировал бы HTML на основании метаданных.
В этом случае нельзя будет простым способом (верстальщику) добавить/изменить атрибуты HTML элемента. Верстальщик должен помнить, как описывается HTML элемент с помощью метаданных, а это нехорошо, это лишний ненужный этап. Значительно проще, когда верстальщик смотрит на шаблон, как на кусок HTML-а.

FB3, подскажи пожалуйста, где ты скачал книгу http://www.books.ru/shop/books/693675 ?
Я к сожалению не могу найти :-(


Расскажу пару слов о себе. Раньше я писал на разных языках (ассемблер, Visual Basic for app, Delphi и др.), но мне не было так сложно, как при использовании PHP. Я прошел аккредитацию на бесплатном сайте http://www.inphp.org/user/ps
Это говорит о том, что я хорошо знаю синтаксис и сам язык PHP, но получается, что этого недостаточно для написания правильного кода.
 

fixxxer

К.О.
Партнер клуба
inphp проверяет на то как ты умеешь читать мануал, не более =)
вообще говно а не тест

проверься лучше на мамбе :) http://tinyurl.com/ybpeev6

>> Раньше я писал на разных языках (ассемблер, Visual Basic for app, Delphi и др.)

тогда дельный совет (ща меня тут сожрут, ну да ладно) - нунафиг похапе, возьми Java + Spring + Hibernate ;)
 

zerkms

TDD infected
Команда форума
Во-первых, не паттерн MVC, а парадигма MVC. И это не просто буквоедство. Из паттерна следует четкое и недвузначное решение, парадигма оставлет очень большую степень свободы.
паттерн не навязывает реализацию. паттерн лишь в декларативной и оооооочень свободной форме описывает идею. и это буквоедство.
 

ps2007

Новичок
нунафиг похапе, возьми Java + Spring + Hibernate
может я и мазохист :) но я выбрал PHP потому, что он наиболее популярен среди платформ для веб-разработки

>> проверься лучше на мамбе
с первого раза набрал 205 очков (Вы — хороший PHP-программист), хотя я потом понял, что допустил некоторые ошибки.
 
Сверху