MVC как лучшая практика для программирования на профессиональном уровне?

Долго скрывающийся, первый постер...

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

На данный момент я рассматриваю возможность взять простую структуру MVC (из учебника) и расширить ее по мере необходимости для моих будущих заданий по программированию.

Мой вопрос заключается в том, считается ли модель MVC с почти всей логикой приложения, отделенной от уровня представления, лучшей практикой по сравнению с хорошо структурированным веб-сайтом ООП с кодированием на странице по мере необходимости, например, с установкой переменных функций.

Или я столкнусь с проблемами, когда мне нужна гибкость кодирования, например.

  • используя что-то вроде PHPthumb для галереи, где мне нужны разные размеры вывода на разных страницах и в настоящее время устанавливаются параметры в заголовке страницы
  • контактная форма с x полями и форма обратной связи с y полями - для этого потребуются 2 разные модели, а не общий класс формы снова с некоторыми параметрами, установленными в заголовке страницы
  • некоторые страницы требуют ob_start() и ob_flush(), но не требуют других?

Пожалуйста, не говорите мне не создавать свой собственный фреймворк — я лучше буду знать, как работает каждый бит, чем использовать кусок кода, о котором я ничего не знаю — мне действительно интересно мнение людей, которые пошли по этому пути и создавать сайты каждый день. Каковы реальные плюсы и минусы этого по сравнению с простым (но хорошо структурированным) ООП и кучей страниц на сайте, а не с 1 страницей index.php и отдельными файлами.

Привет, Нигглс


person niggles    schedule 06.01.2010    source источник
comment
I'd rather know how each little bit works than use a slab of code I know nothing about -- конечно, вы ничего не знаете о коде сначала, но поскольку php-код легко читается, вы будете виноваты, если не захотите изучать код.   -  person Lukman    schedule 06.01.2010
comment
Если вы действительно заинтересованы в том, что говорят люди, которые пошли по этому пути, вы не должны начинать с, пожалуйста, не говорите мне, чтобы я создал свою собственную структуру. Потому что это лучший ответ.   -  person Marvo    schedule 05.06.2012
comment
Кроме того, использование хорошо зарекомендовавшего себя фреймворка — отличный способ улучшить ваше понимание реализации шаблона MVC, который поможет вам создать собственный шаблон, если вы по-прежнему обнаружите, что доступных решений не хватает.   -  person Marvo    schedule 05.06.2012
comment
Я определенно изучаю один (или несколько), но также создаю свой собственный лагерь. Просто нет разумного способа понять, почему колеса круглые, пока вы не попытаетесь сделать восьмиугольное. Тем не менее, построил его по мере необходимости. Не тратьте время на разработку функций, которые не имеют никакого применения и в конечном итоге будут потрачены впустую.   -  person Michael Wilson    schedule 05.06.2012
comment
Я написал сообщение в блоге о создании собственного MVC с нуля на PHP — chaitya62.github.io/2018/04/29/ Надеюсь, это поможет   -  person Chaitya Shah    schedule 30.04.2018


Ответы (5)


Я знаю, ты говоришь, что тебе не нужен этот совет, но не пиши свой собственный. Первое, что я делал на каждой работе, над которой когда-либо работал, — это брал какой-то существующий код или фреймворк, часто коммерческий, но сильно модифицированный, и начинал его поддерживать. У вас редко будет возможность написать свой собственный, и это плохая идея. Это сложно, дорого, и кто-то уже написал лучшую среду MVC PHP, чем вы, вероятно, напишете.

Существует буквально множество зрелых фреймворков PHP, большинство из которых существует уже более десятилетие. Выберите один из них. Неважно, какой из них — все они поддерживаются дюжиной людей, по крайней мере, таких же умных, как вы, которые писали MVC-фреймворки намного дольше и потратили месяцы или годы на совершенствование своих фреймворков и прислушивались к мнению пользователей.

Все это говорит о том, что если вы хотите писать самостоятельно в свободное время, в качестве хобби, чтобы не тратить впустую деньги своего босса, тогда во что бы то ни стало. Существует огромное разнообразие интерпретаций MVC. Некоторые фреймворки рассматривают представления в основном как шаблоны. Лично я считаю, что вы можете добавить туда столько сырого PHP, сколько захотите, если его целью является отображение, и вы делаете обычные умные вещи, такие как преобразование общего кода в функции. Некоторые фреймворки практически не имеют бизнес-логики в моделях (где она принадлежит IMO), но имеют очень тяжелые контроллеры. Лучшее, что вы можете сделать, это попробовать другие фреймворки и посмотреть, как они работают и какие вам больше всего нравятся, и решить, что бы вы хотели изменить. Затем, намеревайтесь изменить его в своем собственном.

Вы говорите, что почти готовы считать себя профессионалом? Самый трудный урок, который мне пришлось усвоить, заключался в том, что профессионалы не пишут свои собственные низкоуровневые библиотеки. Они не изобретают велосипед на деньги компании. Они используют готовые компоненты и выполняют работу сегодня, а не через месяц. Вы не хотите использовать кусок незнакомого кода? Это самая большая часть вашей жизни как программиста — привыкайте к этому.

person meagar    schedule 06.01.2010
comment
Спасибо, я не врал. Я люблю писать низкоуровневый код. Люблю это. Но это абсолютно пустая трата времени компании, и вас уволят. - person meagar; 06.01.2010
comment
Я знаю, ты говоришь, что тебе не нужен этот совет, но не пиши свой собственный. Справедливо все, что вы сказали, но я думаю, что мой план не состоит в том, чтобы пойти и построить какого-то гигантского зверя, на написание которого уйдет 12 месяцев. В данный момент я выполняю много похожих работ - настраиваемые системы CMS, мини-сайты с несколькими галереями и формами, а в следующем месяце у меня будет CRM с функциями тайм-менеджмента. Я хотел начать консолидировать свою работу во что-то повторное использование, даже если это будет по частям. профессионалы не пишут свои собственные низкоуровневые библиотеки. Согласен - я использую несколько сторонних классов, если они существуют и выполняют свою работу :-) - person niggles; 06.01.2010
comment
@meagar: Что касается вашего последнего абзаца, если бы все думали так же, как и вы, не было бы никаких профессиональных фреймворков PHP, а их много! Я не говорю, что он должен отсиживаться в рабочее время, но полное разочарование, на мой взгляд, нежелательно. - person Alix Axel; 06.01.2010
comment
@AlixAxel Я знаю, что этому почти пять лет, но я все равно буду следить. Важно то, что почти ни один существующий профессиональный PHP-фреймворк не был написан исключительно ради написания профессионального PHP-фреймворка. Это отличный способ создать уродливую структуру, которую никто не хочет использовать. Хорошие фреймворки создаются из приложений реального мира, где кто-то увидел реальную проблему и предложил решение. Затем они увидели многоразовые элементы или, возможно, решили, что у них особенно элегантная архитектура, и это легло в основу их структуры. - person meagar; 03.11.2014
comment
Это, возможно, настоящая причина, по которой я пытаюсь объяснить, почему вам не следует создавать собственную структуру. Да, они тоже полезны, но хорошие существующие фреймворки доказали свою способность поддерживать множество типов приложений в разных масштабах; они проверены в бою и закалены, а плохие ошибки были устранены для вас. Конечно, каждый должен свободно экспериментировать со своими идеями для фреймворка, но суть этого вопроса становится профессиональной, а профессионалы не решают уже решить проблемы, написав фреймворки. - person meagar; 03.11.2014

Написание собственного фреймворка отлично подходит для собственного назидания и для полного понимания языка.

Лично я считаю, что использование стороннего фреймворка занимает столько же времени, сколько и написание собственного. Тем не менее, у меня есть полный контроль над моим собственным кодом, чего вы не можете претендовать на какой-либо сторонний фреймворк.

Я также думаю, что многие фреймворки MVC очень ресурсоемки. Для сайтов с большим объемом вы должны быть готовы бросить на них аппаратное обеспечение, чтобы они работали хорошо. Для сайтов с небольшим объемом (большинство) быстрая разработка сторонней среды MVC является огромным бонусом.

Так что, на мой взгляд, если у вас есть время, сверните свой собственный и гордитесь этим. Просто убедитесь, что вы учитесь у других, особенно в том, что касается безопасности.

person DeveloperChris    schedule 06.01.2010

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

В MVC вы не привязаны к одному представлению для каждого контроллера, вы можете использовать столько представлений, сколько хотите, для каждого контроллера, поскольку каждый открытый метод может вызывать само представление и управлять тем, как оно выглядит и ведет себя, на основе определенной вами бизнес-логики. Тем не менее, у вас может быть 2 метода для возврата полноразмерного изображения и эскиза без необходимости создания двух страниц. Вы можете установить все в представлении из контроллера, метаданных заголовка, скриптов, ссылок, темы, контента и т. д.

Что касается моделей, это опять же зависит от требований вашего проекта, но определенно, в любом случае, если у вас есть несколько страниц с разными целями, и они требуют изменения разных источников данных, должна быть модель для каждого из них и что вы можете сделать после того, как создать класс, который инкапсулирует функциональность формы, вызывая модель для получения полей для создания формы, получения и сохранения данных. Это просто идея, что вы можете сделать это множеством разных способов, в этом и заключается красота ООП.

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

Если вы хотите получить больше идей о шаблонах проектирования, вы можете использовать шаблон проектирования Google MVP и/или шаблон проектирования MVVM.

person denver_citizen    schedule 06.01.2010

Я написал свой собственный фреймворк. Создание архитектуры и сырого кода не требует времени. Здорово, если кто-то напишет там собственный фреймворк. Но если документация неправильная, то определенно боль в задницах. Полностью зависит от вас самих. Я тоже свою написал. Проверка качества фреймворка заняла почти 7 дней :). но главная проблема заключается в том, чтобы получить удовлетворение от фрагмента кода, который вы пишете в своем фреймворке. Вы всегда хотели импровизировать свой фреймворк и хотели, чтобы он был лучшим. БЛА! БЛА! Если вы хотите написать свой собственный, и вы достаточно уверены в себе для пропитания. Действуй.

person Vipul    schedule 13.09.2013

Любой MVC — самодельный или нет — обеспечит вам гибкость и возможность повторного использования кода.

Вызовы ob_start() / ob_* не проблема, они входят в вашу модель и вызываются из вашего шаблона, например:

Hello <?php echo $this->getFormattedName(); ?>

где твоя модель

function getFormattedName() {
    ob_start();
    echo '<a href="/profile/' . $this->getName() . '">' . $this->getName() . '</a>';
    $return = ob_end_clean();
    return $return;
}

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

Возможно, вы захотите рассмотреть возможность использования чего-то вроде Zend Framework — хотя это сама по себе библиотека MVC, вы можете очень легко использовать отдельные компоненты (например, вы можете использовать Zend_Form и Zend_Mail для своих контактных форм и форм обратной связи, проверки и используйте свои собственные модели для всего остального). Это также даст вам дополнительное преимущество в виде запасного варианта, когда/если придет время, когда ваш доморощенный фреймворк MVC начнет перерастать свой первоначальный дизайн. Или, по крайней мере, ускорьте время разработки, чтобы не задерживаться на несколько дней из-за того, что внезапно осознаете, что вам нужна модель электронной почты.

person gabrielk    schedule 06.01.2010
comment
Такое использование буферизации вывода кажется... чрезмерным. Что не так с конкатенацией строк? - person meagar; 06.01.2010
comment
В конкатенации нет ничего плохого. Просто пример, поскольку ОП специально спрашивал об использовании ob_start() и т. д. :) - person gabrielk; 07.01.2010
comment
Это точно неправильно. Ваши модели никогда не должны выводить HTML, для этого предназначено представление. Вся суть MVC заключается в отделении ваших бизнес-объектов от кода отображения. Точно так же нельзя использовать буферизацию вывода. Обувь, потому что это было упомянуто в вопросе, не делает его более действительным. - person meagar; 02.10.2010
comment
Туше. Технически вы более правы, чем я. Я бы сказал, что мой ответ был не столько неверным, сколько неправильным; Я думаю, что он действительно ответил на вопрос. Я не пытаюсь научить ОП кодировать. Иногда линия становится размытой, например, в Zend_Form класс Zend_Form_Element строит структуру формы. Хотя это и не эхо HTML, но довольно близко. - person gabrielk; 04.10.2010