Подтвердить что ты не робот

ASP.NET - Как эффективно использовать шаблоны проектирования без чрезмерной инженерии!

Я бы оценил мысли людей о дилемме, с которой я боролся с тех пор, как вышел ASP.NET.

В классическом ASP уровни кода были минимальными. Страница ASP содержала HTML и script вместе взятые. Компоненты COM содержали бизнес-логику и DAO infrastrcuture. Сами страницы ASP были грязными, но все было в одном месте.

Кодирование кода ASP.NET упрощает код, это прекрасно. Элементы управления позволяют нам быть более объектно ориентированными на уровне представления. Эти вещи приятные.

Вот моя проблема. Многие проекты, в которые я вошел, - это корпоративные веб-приложения, но не все эти сложные, скажем, 10 или около того веб-страниц/пользовательских интерфейсов, много взаимодействия с базами данных и т.д. Это было кусок торта, чтобы понять. Теперь я часто сталкиваюсь с 5-10 слоями кода для создания довольно простой веб-страницы. Они могут включать классы ASP, code-behind, control, DTO, объекты ORM, а затем несколько других, просто заброшенных черном.

В дополнение к 5-10 уровням для доступа к базе данных существует множество пользовательских объектов, созданных только для хранения обычных данных, вместо использования POCO (простые старые объекты CLR), например, коллекция. Чтобы понять эти объекты, часто приходится трассировать через наследование hiearchy, включая 3 или более уровней объектов и интерфейсов.

Вот суть: Раньше я смотрел 1 страницу ASP и говорил 1 или 2 маленьких объекта, несколько SQL-запросов, они выполнили свою работу и были довольно просты в обслуживании и понимании.

Теперь для одной и той же страницы может быть буквально 50 объектов и более, распространяемых через сотни объектов в пользовательском пространстве имен.

Я прошу вас, коллеги-ремесленники, это прогресс? Некоторые люди немного за борт с их забавными новыми игрушками для дизайна? Есть ли счастливая среда? Есть ли способ эффективно использовать шаблоны проектирования, не создавая так много объектов, что он становится хуже спагетти, чем старый процедурный парадигм?

Поделитесь своими мыслями.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Некоторые люди архитекторы астронавтов, и они будут настаивать на том, что эти слои необходимы, а дизайн - абсолютный мусор, если вы не включите их.

На другом конце спектра есть люди, которые оттолкнут все это и просто имеют код, который все рушится вместе: это просто, правильно, поэтому почему бы просто не иметь SQL-запрос прямо там, в записях кода, в список контроль?

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

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

Есть, конечно, средняя почва. Где именно эта ложь будет отличаться в зависимости от того, кого вы просите... но там.

Построение разумного бизнес-уровня - хороший шаг к тому, чтобы попасть туда. Это должен быть слой, который представляет простейший вид объектов в вашей системе и не содержит связанных с публикой сведений о базе данных (кроме, возможно, объекта Connection, который сообщает бизнес-уровню, как добраться до базы данных). Это объединит всю вашу логику в одно место, поэтому ASP-часть проекта просто подключит абстрактный метод User.LoadAll() к таблице, в которой отображается список пользователей. В ASP-приложении не должно быть никаких подсказок, если он читает из базы данных, веб-службы или просто кучу составленного материала.. он просто разговаривает с бизнес-слоем.

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

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

Я только что сделал миграцию, как я описал выше (ASP с SQL в коде, для отдельного уровня представления - бизнес-источник данных (ORM)), и это здорово. Хотя он действительно добавляет несколько слоев для получения фактической информации, как только бизнес-методы работают, остальная часть кода работает. Исправление ошибки прост и исправляет ее повсюду. В конце концов, быстро стало так, что, когда вам нужно было получить список отчетов, которые пользователь мог запустить, кто-то уже написал бизнес-метод для этого (User.GetReports()), где раньше, вероятно, никогда найти его, если бы это было сделано - если вам повезло, это было написано как функция, а не только встроенный код.

Ответ 3

Я работал над проектами, которые плохо сделаны в противоположном направлении (200+ MB исходных деревьев без шаблонов проектирования). Поверьте, это тоже не правильное решение. Код становится недостижимым, там старый код лежит вокруг того, что разработчики путешествуют и т.д.

С другой стороны, чтобы ответить на ваши вопросы о шаблонах проектирования:

Нет, это не прогресс. Да, некоторые люди за борт. Вероятно, это счастливая среда, но, по-моему, она требует, чтобы модельные узоры мира немного успокоились.

Я стараюсь сделать мои решения максимально простыми. Это может включать в себя шаблон дизайна... или это может быть не так; это действительно не имеет значения, пока это работает, и это легко поддерживать. Важно то, что... шаблоны дизайна не являются панацеей от плохого кода. Просто потому, что один использует шаблоны проектирования, не означает, что один код хорошо написан. К сожалению, слишком много разработчиков учат (или верят сами по себе) именно то, что: если они используют шаблоны проектирования, их качество кода выше; что не обязательно верно (даже не верно на регулярной основе, я думаю).

В стороне: если вам нужен отличный пример переоценки, посмотрите исходный код приложения лотка CruiseControl.NET. Это отличная демонстрация шаблонов дизайна, выполняемых amok (честно говоря, Thoughtworks в целом - отличная демонстрация этого).

Ответ 4

Я думаю, что большинство из того, что вы видите, это, вероятно, формальный код бизнес-уровня и уровня данных. В этом случае код должен следовать четко определенным шаблонам, чтобы было очевидно, что где и что (что более важно) почему. Если это иначе, вы не смотрите на репрезентативный код ASP.NET.

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

Главное, что ASP.NET делает гораздо лучшую работу, помогая разработчикам безопасно повторно использовать код, чем это сделал Classic ASP, поэтому не удивляйтесь, когда они им воспользуются.

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

С другой стороны, если ваш веб-сайт предоставляет доступ к базе данных с помощью программного обеспечения для корпоративного отчета или настольного приложения Windows для управления или нескольких небольших приложений, которые говорят с одной и той же базой данных, то, возможно, весь этот "дополнительный" код служит цель. Большая причина для написания кода данных и бизнес-уровня заключается в том, что этот код затем можно разделить между каждой из разных систем, которые говорят с базой данных, так что этот код реализуется ровно в одном месте. Возможно, это много кода для написания небольшого веб-сайта, но в этом случае он не был написан для этого сайта. Он был написан для среды, в которой находится сайт; и несколько других приложений -— работает.

Ответ 5

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

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

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

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

Ответ 6

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

Хотя я не использовал MVC в ASP.NET, я понимаю, что он затрагивает многие ваши проблемы в том, что он гораздо более прямой и простой.

Ответ 7

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

Ответ 8

Это пример общего принципа более высокого уровня, я думаю.

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

Все, что мощно создает потенциал для большего блага и больше... в противном случае.

Microsoft, по большому счету, действительно хорошо работает с инструментами с низким барьером для входа, поэтому любой-старый программист может получить что-то полезное, сделанное относительно быстро. Но из-за их простоты, иногда они не масштабируются слишком хорошо, и вам нужно перейти к более сложному набору инструментов, но он платит, чтобы научиться правильно и эффективно использовать новый материал. Таким образом, ваш вопрос хороший, потому что эта часть процесса "понять это в первую очередь".

Ответ 9

Это и не прогресс. Насколько полезны новые инструменты, которые мы используем, может быть вопрос здесь, так как некоторые могут работать над сборкой, а другие могут быть созданы, например. все в коде позади от разметки до логики базы данных до бизнес-логики, чтобы сохранить все это вместе.

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

Ответ 10

Спасибо за все комментарии. Чтобы уточнить немного больше, в классическом ASP мы использовали компоненты VB, которые, естественно, ограничивали нашу способность перекомплементировать их, что было хорошо в том смысле, что оно упростило его.

Мне понравился ответ Рекса "В конечном итоге" лучшая практика "лучших практик заключается в том, чтобы кодировать как можно проще, пока вы не столкнетесь с реальной проблемой, которая мешает вам двигаться вперед".

Звучит похоже на другое, что я слышал: "Преждевременная оптимизация - это корень всего зла".

После этого, что, если мы просто поместим всю логику шины в код, а затем переместили ее в разделяемые библиотеки, поскольку мы обнаружили, какой код действительно будет использоваться несколькими страницами? Например, если это одна страница, вы можете иметь все в коде. Если есть две страницы, которые разделяют одну часть логики, сделайте компонент. Если два компонента используют SQL Server, создайте один новый компонент для упорядочения SQL-запросов и т.д.

Мне также понравилось разделение Dana на создание пользовательских приложений по сравнению с одним приложением. Одно дело - иметь полноценный API, если его используют 1000 человек. Это может быть пустой тратой времени, чтобы включить одну и ту же энергию в одно приложение.

"Архитектурные астронавты" - отличный термин для сверх-инженерной тенденции!

Многие люди выражают, что есть земля, и я думаю (надеюсь), что мы все ищем! То есть, С# дает нам возможность делать ракетостроение, однако, возможно, этот уровень нужен только в 5% случаев. Я думаю, что усугубление проблемы состоит в том, что большинство интервьюеров в наши дни, как и вы, очень хорошо знакомы во всех ракетостроении...

Еще один связанный с этим вопрос, который я хотел бы затронуть, - это просто использование объектов POCO (.NET) для хранения данных в архитектуре ASP.NET. Я видел, как некоторые архитектуры создают новый объект для каждого отдельного типа обмена данными. Не проще ли просто создать объект коллекции (например, список) и назвать его "этими данными", "такими" и т.д.?

Ответ 11

По моему опыту вы будете гораздо более гибкими, не используя пользовательские объекты базы данных вообще. В более старых версиях .NET вы можете передавать объекты DataTable. В .NET 3.5 вы бесплатно получаете сильные типы, используя LINQ.

Удивительно, как некоторые разработчики тратят 75% своего времени на извлечение данных из базы данных. Какой .NET отлично работает без какого-либо специального кода. Используйте стандартную библиотеку, и вы обнаружите, что у вас гораздо больше времени для решения бизнес-задач.