Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Одна из существенных проблем MVC, как и других некомпонентных решений, — отсутствие обеспечения персистентности (сохранения состояния элементов) страницы между вызовами с браузера. В старом добром WebForms мы ставили на форму, например, чекбокс и не волновались как он будет отрисован и как будет восстановлено его состояние после перезагрузки. [...] По сути то же, как в десктопе.
И при этом не нужен никакой ViewState — экземпляр класса страницы с дочерними компонентами и, соответственно, их данными, хранится в серверной сессии.
У меня простой вопрос: а почему вы противопоставляете MVC и «компонентные решения»? Это, в общем-то, ортогональные вещи, можно иметь компоненты в MVC, можно писать не в MVC без компонентов.
Это не «проблема», это данность. Вы в вебе, он по природе своей stateless. Любые попытки это состояние ему придать — в той или иной форме «костыли».
А-га. Здравствуй, масштабируемость, возвращение через час и тому подобные милые вещи. А уж как это мило тестировать
MVC сам себя противопоставляет в вебе.
Он просто неестественнен.
я ж не меняю протокол HTTP. Я делаю так чтобы с точки зрения програмиста была персистентность.
То же самое делает WebForms — на нем разраб програмирует как на Делфи.
И какая проблема с тестированием напримрер тем же selenium.
не очень понятно о чем вы.
А компоненты масштабируемы по своей природе.
а в принцие самой архитектуры, самой идеи.
Кому?
А по-моему, та его вариация, которую предлагает asp.net, прекрасно ложится на работу http-сервера. Что неестественного?
которой в протоколе нет. Это и есть костыль.
О том, что сессия — это серверное хранилище. Серверное хранилище не позволяет вам сделать дешевую серверную ферму (горизонтальное масштабирование) — вам надо либо прилеплять сессии к конкретной машине, либо выносить их за пределы машины (а это означает, что появляются дополнительные накладные расходы).
Компоненты «по своей природе» ортогональны масштабируемости.
Чем ваша архитектура отличается от WebForms?
здравому смыслу вообще и компонентам в частности
Програмист должен заниматся имплементацией бизнес логики а не заботой о том как восстановить состояние страниы после перезагрузки.
в таком случае и сессионные хранилища предоставляемые вебсерверами -костыль
раскажите это J2EE серверам которые лихо масштабируются вместе со всеми сессиями.
Чего кстати не делает и ваш драгоценный MVC.
что именно там не масштабируется?
Прежде всего, устранением проблемы взаимодействия с HTML кодом (фронтэнд-разрабы которые работали с WebForms понимают о чем я).
боитесь что завтра ваш менеджер прочитавши статью уволит вас как больше ненужного MVC програмиста.
Если вы абстрагируете программиста от естественных деталей протокола, для которого он пишет, вы делаете это ценой чего-то. Идеология asp.net MVC была в том, чтобы вернуть программиста ближе к протоколу, чтобы писать более естественные для окружения вещи.
Ага, а у вас html-код не меняется?
Вас не смущает что языки высокого уровня абстрагируют програмиста от функционирования процессора?
Наверно есть ряд задач которые требуют работы с протоколом, но большинство задач требуют реализации бизнес-логики.
Не меняется ничего что влияет на работу фронт-энд разраба.
Работа бэск-энда и работа фронтэнда, как вы изволили выразится — ортогональна.
Не смущает. Вопрос цены этой абстракции.
Кстати, интересно. А как у вас реализуется классическая задача «если выбран радио 1, показать вот эту группу, если выбран радио 2, показать вот эту группу»?
что то мне подсказывает что писать на аcсемблере гораздо более хлопотно чем на C#.
сработало событие на сервере — для одной панели (сервер компонент Panel, клиент — div) вызвали setVisible(false) для другой setVisible(true)
setVisible повлияли на html-код?и тем не менее ассемблер не вымер.
Очень хорошо, и как эти setVisible повлияли на html-код?
кэп подсказывает что будет показан тот или другой кусок HTML кода.
в данной реализации да
и компонент изменит соответствующий ему фронтэнд тэг.
В этот момент у верстальщика взрывается мозг: он делал верстку с учетом двух дивов, а он стал один.
И снова плач верстальщика: он написал одно, а в аут ушло другое.
В итоге все сводится к очевидному: верстальщик должен быть знаком с технологией, под которую он верстает.
И в этом смысле нет фундаментальной разницы, используете вы ваш подход, Razor,
Видит HTML тэг
<table class="ctable" >
<tr ><th >Наименование </th><th width="50">Ед.изм.</th><th width="40">Кол.</th> <th width="40">Цена</th> <th width="50"> </th>
</tr>
<tr zippy="detail">
<td zippy="item"></td>
<td zippy="measure"></td>
<td zippy="quantity" align="right"></td>
<td zippy="price" align="right"></td>
<td><a zippy="edit"><i class="icon-edit"></i> <a zippy="delete"><i class="icon-remove"></i></a> </td>
</tr>
</table>
А сортировка?
Фильтрация?
Раскраска зеброй?
Пейджинг?
Инлайн-редактирование?
(отдельно большое вам спасибо за необходимость дважды определять колонку — сначала в заголовке, а потом в теле)
как и в .NET MVC соответстующая ссылка в заголовок.
каким боком тут фильтрация?
есть компонент который прописывается одной строкой кода.
а что в MVC есть инлайн редактирование?
Впрочем, здесь я могу автоматически вывести таблицу в любыми инпутами и все они автоматически же отправятся на сервер.
Почему дважды? заголовок это верстка — там ничего не надо определять.
В html-коде это видно?
(и нет, «в asp.net mvc» это не так)
Таким — хочу кликнуть на заголовке колонки и ввести фильтр.
Как это выглядит в html-коде?
Для asp.net mvc, конечно же, есть компоненты, поддерживающие инлайн-редактирование в гридах.
А в вашем коде название прописано отдельно, привязка к данным — отдельно. Ничего не стоит перепутать.
видно. куда оно денется
там вообще никак.
Это, как и вышеуказаное, не относится к сути обсуждаемого архитектурного решения.
С чего бы оно путалось?
Это неправда.
Относится-относится. Вы декларируете, что в вашем решении верстальщик имеет дело с обычным html-кодом. Вот я и хочу на это посмотреть.
С того, что люди ошибаются.
Как наличие того или иного компонента написаного в пределах концепции влияет на саму идею?
Я вам показал простой грид где чистый HTML код
В MVC програмиста волнует какой там будет заголовок а в моем решении нет. И не должно волновать — програмисту незачем заглядывать в PSD файл созданный дизайнером чтобы прописать заголовки в модели для грида. Вы считаете что должен?
А в MVC человек не может прописать не тоо название в атриуте модели?
public class HttpRequest
{
//...
public HttpRequest()
{
this.uri = HttpContext.Current.Request.Url.Query;
//...
if (HttpContext.Current.Request.QueryString["q"] != null || HttpContext.Current.Request.Form["q"] != null)
{
//...
if (HttpContext.Current.Request.HttpMethod == "POST")
{
q = HttpContext.Current.Request.Form["q"];
}
else
{
q = HttpContext.Current.Request.QueryString["q"];
}
//...
}
if (HttpContext.Current.Request.QueryString["r"] != null)
{
//...
string r = HttpContext.Current.Request.QueryString["r"];
//...
object[] p = (object[])Newtonsoft.Json.JsonConvert.DeserializeObject(r);
//...
}
}
}
public override void getRequestData()
{
this.setText(HttpContext.Current.Request.Form[this.id]);
}
Просто в данном случае нет смысла тестировать дергая экшены или API. Тут другая идеология.
Что касается вышеназваных технолий — они ушли чтобы устранить проблемы MVC
Почему нет смысла? Нам же надо протестировать, что код, который реализует бизнес-логику, корректно передает данные в представление и получает их оттуда
Нет, просто они развивали начатые в asp.net MVC архитектурные принципы..
Нет нам надо протестировать что приложение работает корректно.
Не вы их пишете не вам и тестировать — тестируйте свой сайт
Это дипломатичный способ сказать — устраняли косяки
Это слишком общая задача.
Unit-тестирование во всей его красе.
С этой точки зрения, любое развитие ПО — устранение косяков.
это главная задача нет никаких причин придумывать еще какие то.
зачем вам эта краса?
У вас приложение — вы тестируете его бизнес логику.
Точнее у вас один слой — слой бизнес логики.
В данному случае Вызвать что то типа LabelHello.setText(«Hello dude»);
Одна строка кода. Никаких model которые чем то заполнить потом куда то передать, да еще и указать какой view
setText.function linkDudeOnClick(Sender){ LabelHello.setText(«Hello dude»); }
вот этот ваш код вы и тестируете.
Юнит тесты надо гонять там где програмист кроме бизнес логики програмирует еще кучу всего связанного с инфраструктурой
вот я и устраняю только другим способом
Удивляюсь как все эти новомодные тренды, всякие TDD
Эту задачу необходимо разумным образом декомпоновать, иначе она в голову не влезает.
Чтобы тестировать один кусочек за раз.
Именно. Я хочу тестировать бизнес-логику, а не интерфейс. А вы предлагаете мне тестировать интерфейс.
А как же разделение на представление и бизнес-логику? Пропало?
Да нет, просто у вас модель выродилась в одну строчку
Я правильно понял, что вы это называете бизнес-логикой и бизнес-слоем?
А бизнес-логику юнит-тестами покрывать не надо?
Ну, в вашем конкретном случае вы возвращаетесь к тем проблемам, которые были в WebForms, причем были давно.
Очень новомодные, ага. TDD меньше, чем на год моложе, чем asp.net (это если от книжки Бека считать, на самом деле — старше)
Ну если в голову влезает реализация проекта
зачем?
можно конечно полезть в двигатель но зачем если он нормально едет.
как раз бизнес-логика отделена от представления максимально насколько это возможно.
модель — это по сути то где хранятся данные и где им манипулируют. как правил персистентное хранилище. Это класическое понятие модели.
да. Это то что делает приложение с прикладной точки зрения. не больше и не меньше.
ну считайте что проверка этого конкретного клика и есть юнит тест.
именно устранение тих проблем и есть смысл данной поделки.
Лет 15 назад был моден RUP(Rational unified proces) теперь Agile. Что изменилось по сути в програмировании? Да ничего.
Только производительность труда, то есть достижение конечного результата от этого мало меняется.
Так не влезает же
Чтобы получать точную диагностику, где и что сломалось.
А если не едет — где искать, в двигателе, в КПП, еще где-то?
искать ближайшую СТО и дать возможность специалистам по компонентам(двигателям и пр.) занятся своим делам.
… и этот бизнес-слой размещен напрямую в коде, отвечающем за представление, прямо в обработчике UI-события. Здравствуй, прекрасный мир WebForms. Спасибо, нет, никогда больше.
Так как мне его проверить, не трогая слой представления?
Проблема в том, что вы унаследовали кучу проблем WebForms, которые сейчас сохранять… стыдно.
.А, если для вас за последние 15 лет в программировании ничего по сути не изменилось, тогда понятно, почему у вас код такой, как писали 15 лет назад.
Странно, а я вижу, как меняется.
потому что запииваете туда много лишнего не относящегося к сути дела.
а если сломалось в сетевой карте?
За представление отвечает компонент.
public class MainPage : ZippyNet.Html.WebPage
{
public MainPage ()
{
Label label1 = new Label("label1", "Hello");
ClickLink link1 = new ClickLink("link1");
//назначаем серверный обработчик
link1.setClickHandler((HtmlComponent sender) =>
{
label1.setText("I am clicked");
});
// добавляем элементы к классу страницы.
this.add(link1);
this.add(label1);
}
}
вы его не трогаете.
LabelHello.setText("Hello dude")? Прямое обращение к представлению.Нет никакого слоя представления в привычном вам понимании.
я бы конечно покраснел но не пойму за что
Кому надо шашечки а не ехать — пул реквесты никто не отменял.
а что такого появилось в КОДЕ за эти 15 лет?
конечно но не по вышеуказаным причинам.
Нет, потому что сложность проекта больше, чем может съесть один человек.
То я этого в юнит-тесте не увижу никогда, и слава б-гу.вы ввобше ничего не увидите и ваш юнит тест будет нае намного полезнее комлексного. Отсюда вопрос а на фига он.
Прямое обращение к представлению.
А смысл, если я могу взять работающий и решающий мои задачи asp.net MVC?
C#, например. И посмотрите, какой путь он проделал: дженерики, лямбды, LINQ, динамики.
ну так ешьте командой.
вы ввобше ничего не увидите
обращение к компоненту.
Или по вашему промежуточная структура в виде модели (а точнее не модели а DTO) в MVC меняет суть дела и вы там не обращаетесь к представлению?
WebForms тоже решал ваши задачи. Более того старый добрый CGI тоже.
я имел ввиду код а не язык.
Речь о сути идеи и ломке стереотипов.
А чтобы есть командой, надо побить на кусочки. А кусочки, в свою очередь, хочется тестировать вне зависимости друг от друга.
Почему? Юнит-тесту не нужная сетевая карта для работы.Никакому не нужна если на локале. Всем нужно если нет.
Во-первых, не DTO, а ViewModel. А во-вторых — меняет. В asp.net MVC я не обращаюсь к представлению, я возвращаю данные, которые использует представление. Inversion of
control.
asp.net MVC решает их лучше.
А язык определяет код, который на нем написан. Появился новый язык — изменился код.
то все ваше предложение сводится к asp.net WebForms с другим шаблонизатором и viewstate в сессии.
они и так независимы. тестируете реакцию одного линка потом другого.
Никакому не нужна если на локале. Всем нужно если нет.
Присваиваете данные некоей структуре и отправляете ее менять представление. Как шаблонизатор использует данную структуру сути дела не меняет.
с точки зрения фаната MVC — да.
viewstate там ни причем.
мое предложение сводится к использованию компонентного подхода вместо дебильного MVC.
… и если ни один не работает, я не знаю — ошибка в самих линках или в бизнес-логике.
А еще бывают, внезапно, совместно используемые бизнес-объекты.
Я семь лет писал на WebForms, потом пять лет на MVC — и после WebForms писать на MVC было намного проще.а я сделал чтобы было ее проще.
Есть фундаментальная разница между «я явно вызвал слой представления и передал ему данные»
Во-первых, если вы не можете что-то понять и применить, это еще не делает его дебильным
Во-вторых, в MVC прекрасно можно использовать компоненты, так что «вместо» здесь неприменимо.
В самих линках это когда вы дергаете экген а контроллер не реагирует. и ка тут поможет югит тестинг.
и какие проблемы?
а я сделал чтобы было ее проще.
это словоблудие. я не вызываю никакой слой представления. Я передаю данные компоненту.
Суть компонентов чтобы программист не пудрил себе и другим мозги всякими слоями.
Именно потому что применяю и вижу что оно дебильное.
я трачу намного больше времени чем в WebForms. хотя бы для реализации персистентности.
там где компоненты MVC нечего делать.
У меня есть компонент — он реагирует на клиентское событие серверным обработчиком. Шо тут делать MVC?
Альтернатива .NET MVC и WEB Forms