Стоит ли вьюхи отучать от методов объектов в пользу ассоц. массивов?

Разделяй и властвую приучают нас паттерны MVC и т.д. Просмотрел несколько фреймворков и везде используются объекты во вьюхах. В целом вроде ничего страшного, но вот когда приходит время оптимизации, то многие фреймворки рекомендуют отказаться от объектов в пользу обычных запросов и ассоц массивов. Но тогда ломается логика "Разделяй и властвую", как только начинаешь заниматься оптимизацией, то приходится переписывать и вьюхи! Так я и подумал, может стоит сразу приучать вьюхи использовать только ассоц. массивы? Благо с объектами тоже можно работать как с ассоц массивами. Тогда при оптимизации будет достаточно подготовить ассоц массивы данных, вместо объектов и все.

Или я неправильно понял и можно легче оптимизировать такие вещи?
// upd
Просто мне кажется, что вьюха должна быть максимально "тупой", ей не стоит знать что эта переменная объект, а эта ассоц массив. Ей просто надо показывать переменные, проходить циклом по массивам. А так вьюха навязывает логику контроллерам и моделям, что та или другая переменная должна быть именно объектом.
  • Вопрос задан
  • 849 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
На самом деле, такая оптимизация не будет иметь смысла - если мы между контроллером и вью добавим слой, который будет преобразовывать объект, с которым работал контроллер, в массив, с которым будет работать вью, это только ухудшит производительность. Для оптимизации нужно будет вообще отказаться от объектов и работать только с массивами. И этот шаг ни в коем случае нельзя делать, пока вы не будете на 146% уверены, что он необходим.

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

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

Так я и подумал, может стоит сразу приучать вьюхи использовать только ассоц. массивы?

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

А так вьюха навязывает логику контроллерам и моделям, что та или другая переменная должна быть именно объектом.

Наоборот, это контроллеры отдают данные и по определению именно они навязывают шаблону логику его работы. И это нормально.

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

Да, можно во все классы запилить поддержку ArrayAccess, но какой в этом смысл? Если вью будет работать с объектом, то это только трата времени. Если вью будет работать с массивом, то ArrayAccess тут ничем не поможет - никакого объекта уже нет. Я не вижу смысла делать такой hot swap.

Это как делать framework-агностик приложение, чтобы в любой момент можно было заменить Симфони на Ларавел - идея прикольная и дизайн в итоге, возможно, будет лучше (но далеко не факт, потому что такое усложнение может сделать всё только хуже), но на практике такие переезды происходят очень редко и даже когда происходят, безболезненно они не проходят.

Гораздо эффективнее сделать минимально необходимый дизайн, а потом, если уж припрет, потратить дополнительное время на перенос. По большому счету, то, что вы предлагаете, это Big Upfront Design и я не сторонник такого подхода. Лучше вносить изменения итеративно, исходя из текущих потребностей бизнеса, оплачивающего работу, и не заглядывать далеко в будущее. Есть ненулевая вероятность, что пока вы будете имплементировать в классах ArrayAccessable Interface, заказчик разорится и ваш красивый, расширяемый, поддерживаемый код окажется никому не нужным.

Разумеется, я утрирую в данном конкретном случае, но мой опыт показывает, что такое отношение является самым выгодным и для меня и для заказчика.

P.S. Я это всё написал как альтернативную точку зрения для всех, кто будет читать этот вопрос впоследствии. Используйте whatever floats your boat, как говорится, в вопросах архитектуры нет серебряной пули.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Я лично придерживаюсь именно этой логики - очень удобно.
UPD: полностью согласен с //upd
Ответ написан
Комментировать
R0dger
@R0dger
Laravel/Yii/2 AngularJs PHP RESTful API
У меня в большинста вьюхах массивы, т.к. использую еще и AngularJs.
Ответ написан
Комментировать
bitver
@bitver
В большинстве случаев вам нужен будет определённый формат данных, которые неудобно форматировать во View - ухудшается читабельность, повторяются строки. Объекты могут иметь собственные функции-геттеры, которые предварительно обработают данные и выдадут во View в удобном виде. (Даже иногда не форматировать надо, а провести небольшую логику обработки.)
Объекты после -> в нормальных IDE имеют автокомплит кода, что является большим плюсом при разработке.
А массивы и даже голые SQL запросы надо использовать когда уже зажрались (извините за выражение) и делать нечего только как оптимизировать экономя на спичках.
P.S. я не имею в виду те случаи, когда формируются сложные запросы и выбираются большие данные, а скорее говорю про обыденную разработку.
Кому лень читать - хватит экономить на спичках, получайте удовольствие от разработки, а не ищите гемора =)
Ответ написан
Комментировать
@jaxel
А мне нравится подход, который используется в шаблонизаторах. Из шаблона единый интерфейс к данным. А между данными и шаблоном адаптер, который где-то работает с ними как с массивом, где-то как с объектом, где то геттеры юзает в порядке приоритета.
Ответ написан
Комментировать
VladimirAndreev
@VladimirAndreev
php web dev
Так что мешает объекту реализовать интерфейс ArrayAccess и обращаться к нему любым из способов?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы