Третий подход, основанный на ответе Франнеско. Нарисуйте строку-заполнитель с альфа = 0 (прозрачным).
#draw your actual lines here
#plt....
lines, labels = plt.gca().get_legend_handles_labels()
lines.insert(1, plt.Line2D([],[], alpha=0))
labels.insert(1,'')
plt.legend(lines,labels,ncol=2)
plt.show()
Это имеет те же преимущества, что и в его ответе. Однако это решение не работает в matplotlib 1.5.1 (под python3), говоря ValueError: Unrecognized marker style none
Я записал уровни доступа к данным, компоненты персистентности и даже мой собственный ORMs в сотнях приложений за эти годы (одно из моих "хобби"); я даже реализовал свой менеджер транзакций собственного дела (обсужденный в другом месте на ТАК).
инструменты ORM были вокруг в течение долгого времени на других платформах, таких как Java, Python, и т.д. Кажется, что существует новый популярный товар теперь, когда центральные Microsoft команды обнаружили их. В целом, я думаю, что это - хорошая вещь - необходимый шаг в поездке, чтобы исследовать и постигать понятие архитектуры и дизайна, который, кажется, был представлен наряду с прибытием.NET.
Нижняя строка: Я всегда предпочитал бы делать свой собственный доступ к данным, а не бороться с некоторым инструментом, который пытается "помочь" мне. Никогда не приемлемо бросить мое управление моей судьбой, и доступ к данным является критической частью судьбы моего приложения. Некоторые простые принципы делают доступ к данным очень управляемым.
Использование фундаментальные понятия модульного принципа, абстракции и инкапсуляции - поэтому переносят доступ основных данных Вашей платформы API (например, ADO.NET) с Вашим собственным слоем, который повышает уровень абстракции ближе до Вашего пространства задач. НЕ кодируйте весь свой доступ к данным НЕПОСРЕДСТВЕННО против того, что API (также обсудил в другом месте на ТАК).
Сильно применяются, DRY (не Повторяйте Себя), принцип = осуществляет рефакторинг дневные светы из Вашего кода доступа к данным. Используйте генерацию кода в надлежащих случаях в качестве средства рефакторинга, но стремитесь избавить от необходимости генерацию кода каждый раз, когда Вы можете. Обычно генерация кода показывает, что что-то отсутствует в Вашей среде - дефицит языка, разработанный - в ограничении инструмента, и т.д.
Между тем, учится использовать доступный API хорошо, особенно относительно производительности и устойчивости, затем включать те уроки на Ваш собственный абстрактный уровень доступа к данным. Например, учитесь делать надлежащее использование параметров в Вашем SQL вместо того, чтобы встроить литеральные значения в строки SQL.
Наконец, имейте в виду, что любое приложение/система, которое становится успешным, вырастет для обнаружения с проблемами производительности. Решение проблем производительности полагается больше на разработку их вместо того, чтобы просто "настроить" что-то в реализации. Та дизайнерская работа будет влиять на базу данных и приложение, которое должно измениться в синхронизации. Поэтому стремитесь смочь делать такие изменения легко (гибкими), а не попытаться избежать постоянно меняющийся само приложение. Частично, это в конечном счете означает способность развернуть изменения без времени простоя. Не трудно сделать, если Вы не "разрабатываете" далеко от него.
Я на самом деле работаю над записью инструмента ORM в.NET как параллельный проект развлечь меня.
SQL мертв мне. Я очень не хочу писать это, особенно имея его в моем коде где угодно. Вручную запись выбирать/вставлять/обновлять/запросы на удаление для каждого объекта, пустая трата времени IMO. И даже не запускайте меня на обработке, АННУЛИРУЕТ ("где col_1 =?" по сравнению с, "где col_1 является пустым") при динамичной генерации запросов. Инструменты ORM могут обработать это для меня.
кроме того, имея 1 место, что SQL может быть динамично сгенерирован, надо надеяться, пошел бы, длинное было к устранению атак с использованием кода на SQL.
, С другой стороны, я использовал, в спящем режиме, и я абсолютно ненавижу его. В проекте реального слова мы столкнулись с ограничениями, нереализованными битами и ошибками каждые несколько недель.
Хранение логики запроса сторона DB (обычно как представление или хранимая процедура) также имеет преимущество в наличии того, чтобы быть для DBAs для настройки. Это было постоянным сражением в моем последнем задании, использование В спящем режиме. DBAs: "дайте нам все возможные запросы, таким образом, мы можем настроить" Devs: "мм, я не знаю, потому что В спящем режиме, генерирует их на лету. Я могу дать Вам некоторый HQL и отображение XML хотя!" DBAs: "Не заставляйте меня перфорировать Вас в поверхность!"
Мне не нравится генерация кода, используемая в большей части ORMs. На самом деле, генерация кода в целом, которую я нахожу, чтобы быть слабым инструментом, который обычно показателен из использования неправильного языка во-первых.
В особенности с отражением .NET, я не вижу потребности в генерале кода в целях ORM.
Мы все еще используем скрученный вручную, повторяющийся cut'n'paste DAL, где я работаю. Это чрезвычайно болезненно, сложно, и подвержено ошибкам, но это - что-то, что все разработчики могут понять. Хотя это работает на нас в данный момент, я не рекомендую это, поскольку это начинает ломаться быстро на крупных проектах. Если бы кто-то не хочет переходить к полноценному ORM, я, по крайней мере, защитил бы своего рода поколение DAL.
еще, все еще скептически настроенный; как большинство продуктов Microsoft, я ожидаю SP2 или полтора года прежде, чем доверять им производственной среде
и отмечаю, что в значительной степени каждая новая вещь, представленная любым, не только Microsoft, провозглашена, поскольку "легкий вес, быстрый и легкий" - берет его с блоком соли. Они не рекламируют проблемы/проблемы вполне так же громко как преимущества/функции! Вот почему мы ожидаем ранних последователей для обнаружения их.
Это не должно осуждать ORM или LINQ или что-либо как этот; я резервирую решение до
, отметьте: я сделал ORM прежде, вручную, и он работал просто великолепно, таким образом, у меня есть большие надежды на более новые системы ORM.
, Если codesmith генерирует код на основе Ваших таблиц, не Вы все еще сильно связанный к Вашей схеме данных? Я предпочел бы решение, которое отделяет мои объекты из моей схемы базы данных для гибкости гумуса в архитектуре
, Это из одного из Ваших комментариев - Это верно, CodeSmith сильно связывает Вас к Вашим таблицам.
NHibernate, с другой стороны, имеет, выделяют функций, которые могут помочь с этим: у Вас есть Компоненты так, чтобы в коде Вы могли иметь: Человек со свойством Address, где Адрес является отдельным классом.
Вы также наследование, отображающееся . Таким образом, это делает справедливое задание отделения Вашей схемы от Вашего домена.
Я следовал Быстрый-NHibernate очень тесно, поскольку это имеет некоторые самые потенциальные, которые я когда-либо видел в проекте.
Я - большой поклонник также, с помощью EF и Linq-SQL. Мои причины:
, Так как LINQ компилируется и безопасен с точки зрения типов, Вы не получаете проблемы опечаток в "основанном на операция со строками" SQL. Я не знаю, сколько часов я потратил своей жизни, разыскивающей ошибку в SP или другом SQL, где "галочка" или некоторое другое ключевое слово были в неправильном месте.
Вышеупомянутое и другие факторы делают разработку быстрее.
, Хотя, конечно, существует издержки по сравнению с "ближе к металлическим" методам запросов базы данных, ни один из нас не использовал бы.NET вообще или даже C++, если бы производительность была нашим беспокойством № 1. Для большинство приложения, я смог получить превосходную производительность от Linq-SQL, даже не используя сохраненный подход proc (основанные на клиенте скомпилированные запросы мой обычный подход).
, Конечно, для некоторых приложений Вы все еще хотите сделать вещи старомодный путь все же.
Я - крупный парень ORM, вытаскиваю логику из базы данных, использую базу данных только для скорости.
я люблю скорость, можно разработать приложение. Самое большое преимущество, в зависимости от ORM, Вы, может изменить бэкэнд, не имея необходимость переводить Вашу бизнес-логику.
я переключился на LINQ и никогда не оглядывался назад. DBLinq является потрясающим для того, чтобы сделать другую базу данных, чем MSSQL. Я использовал его со СВОИМ SQL, и это является БОЛЬШИМ.
Необходимо бороться с системой ORM, после того как Вы хотите сделать что-либо вне самого простого выбора, обновить или удалить. И Ваша производительность входит в туалет, после того как Вы начинаете делать реальный материал.
Так нет.
Это не побеждающая сторона для вскакивания, реакция на настоящую проблему! Объектное реляционное отображение (ORM) было вокруг в течение долгого времени, и оно решает настоящую проблему.
Исходный объект, Ориентированный (OO), языки были всеми о моделировании проблем реального мира с помощью языка программирования. Можно было утверждать, что при реальном использовании языка OO для систем сборки, Вы будете моделировать проблемную область реального мира с помощью Доменного управляемого дизайна (DDD). Это логически берет Вас к разделению модели проблем для содержания DDD в чистоте и ясный из всей помехи персистентности данных и управления приложениями.
Вы системы сборки после шаблона DDD и использования Реляционная база данных для персистентности затем при реальной необходимости в хорошем ORM или Вы будете тратить грязь базы данных создания и поддержки слишком большого количества времени (предназначенная игра слов).
ORM является старой проблемой и был несколько решенных годы назад продуктами как Объектная Линза и Главная Ссылка. Объектной Линзой был Smalltalk ORM, созданный ParkPlace в 90-х. Главная Ссылка была создана Объектными Людьми для Smalltalk, затем преобразовала для Java и в настоящее время используется Oracle. Главная Ссылка также была вокруг с 90-х. Защитники DDD теперь начинают ясно ясно формулировать случай для DDD и получают долю ума. Поэтому ORM, при необходимости, становится господствующей тенденцией, и Microsoft просто реагирует, как обычно.
Я с нетерпением жду дня, моя команда начинает изучать решения ORM. До того дня мы - чистый магазин Набора данных/Хранимой процедуры и позволяем мне сказать Вам, что это не все булочки и соус, являющийся "чистым".
Во-первых, новый Linq к SQL работает близко к тому из сохраненных procs и средств чтения данных. Мы используем наборы данных везде, таким образом, производительность улучшилась бы. Пока неплохо для ORM.
, Во-вторых, сохраненные procs обладают дополнительным преимуществом того, чтобы быть выпущенным отдельный из кода, но у них также есть вред того, чтобы быть выпущенным отдельный из кода. Притворитесь в течение секунды, что у Вас есть база данных больше чем с 5 системами, соединяющимися с ним и больше чем 10 людьми, работающими над ним. Теперь думайте об управлении всеми теми изменениями хранимой процедуры и зависимостями, особенно когда будет общая кодовая база. Это - кошмар...
В-третьих, трудно отладить сохраненный procs. Они часто приводят к ошибочному поведению для всевозможных причин. Это не должно говорить, что то же не могло никакой результат динамического sql быть сгенерированным ORM, но один, меньшей проблемой является та меньше проблемы. Никакие проблемы полномочий (хотя главным образом разрешено в SQL 2005), больше никакой многоступенчатой разработки. Запись запроса, тестирование запроса, развертывание запроса, связь его в код, тестирование кода, развертывание кода. Запрос является частью кода, и я рассматриваю это как хорошую вещь.
Четвертый, Вы можете все еще используемые хранимые процедуры. Выполнение некоторых отчетов, которые занимают много времени? Сохраненные procs являются лучшим решением. Почему? Планы выполнения запросов могут быть оптимизированы механизмом базы данных. Я не симулирую понимать все работы базы данных, но я действительно знаю, что существуют некоторые ограничения к оптимизации динамического sql в настоящее время, и это - компромисс, который мы делаем при движении с ORM. Однако сохраненные procs не исключены при использовании решения ORM.
Действительно самая большая причина я вижу, что люди избегают, чтобы ORM был то, что у них просто нет опыта с одним. Будет очевидная кривая обучения и этап незнания. Однако, если это собирается улучшить производительность разработки и едва препятствовать (или в моем случае улучшаются), производительность. Это - компромисс, который стоит сделать.
ORM является хорошим соответствием для людей, которые ладят хорошо с программным обеспечением, которое пишет программное обеспечение для них; но если Вы одержимы управлением, что происходит и почему, ORM может быть субоптимальным особенно с оптимизацией базы данных. Любой уровень абстракции имеет расходы и доходы; ORM имеет обоих, но баланс не является правильным еще, по моему скромному мнению. И ORM, в его текущей форме, иронически добавляет уровень абстракции, который все еще помещает классы и unabstacted схемы базы данных к глубоко вместе.
Мой опыт состоит в том, что это может помочь Вам собрать версию подтверждения концепции быстро, но может представить требования рефакторинга, с которыми Вы не можете быть знакомы (по крайней мере все же.)
Добавляют к этому, что инструмент развивается, и лучшие практики и шаблоны не хорошо устанавливаются, ни согласие вида, который позволяет другим программистам (или будущие программисты) чувствуют себя довольными Вашим кодом. Таким образом, я ожидаю видеть выше чем обычно осуществляющие рефакторинг требования некоторое время.
я отложу решение (оптимистично) о том, где оно обоснуется с точки зрения того, чтобы быть господствующей тенденцией. Я не поставил бы текущий проект на нем в этой точке. Мои шаблоны для контакта с несоответствием импеданса являются удовлетворительными в моих целях.
printf
?:-)
– Kerrek SB
20 December 2012 в 01:45
Я был на поезде ORM в течение самого долгого времени, начиная с бесплатной версии LLBLGen к последнему и самому большому коммерческому продукту LLBLGen Pro. Я думаю, что ORMs вписываются очень хорошо для большого количества систем ввода-вывода общих данных.
, Который не должен говорить, что они решают все проблемы как бы то ни было. Это - инструмент, который может использоваться, где имеет смысл использоваться. Если Ваша схема базы данных является relativly близко к тому, как Ваши бизнес-объекты должны быть, ORMs являются лучшими.
Я предполагаю то, что я имел в виду, был, каковы инновации, которые ORMs обеспечивают по созданию Вашего DAL с помощью традиционного ADO.NET, SQL и отображая их на объекты в коде?
Вот три главных части моего DAL, и я соответствую ORMs для наблюдения преимуществ:
у Вас все еще должен быть запрос в ORM = SQL (SQL более мощен безусловно)
, Отображающийся код перемещается в конфигурацию, но все еще не устраненный, просто смещается от одной парадигмы до другого
, Объекты должны определяться и управляться плотно relatedto Ваша Схема данных, в отличие от этого, в традиционном подходе, который я могу сохранить их отделенными.
я пропускающий что-то?
Нет. Не все.
Вот слон большой задницы номер один в комнате с большинством инструментов ORM (особенно LINQ к SQL:
Вам гарантируют, то ЛЮБОЕ связанное с данными изменение потребует полного повторного развертывания Вашего приложения.
, Например, мое дневное задание может в настоящее время решать большинство проблем запроса путем изменения существующей хранимой процедуры и повторного развертывания просто что одна часть. С Linq, и др., Ваши запросы данных перемещены в Ваш фактический код. Угадайте то, что это означает?
printf
с таким мусорным атрибутом.
– Christian Rau
20 December 2012 в 01:49
Я - огромный защитник ORM. Генерация кода с ORM сохраняет мой магазин приблизительно 20-30% на большинстве наших проектов.
И мы действительно сокращаем разработку, таким образом, это - большая победа.
Chris Lively сделал интересное замечание о необходимости сделать повторно развертывание любого времени, запрос затронут. Это может быть проблемой для некоторых людей, но она не касается нас вообще. Мы имеем, выносит обвинительное заключение внесению производственных изменений базы данных непосредственно.
кроме того, Вы можете все еще полагаться на традиционный sprocs и даже просматриваете в надлежащих случаях... Мы не категорически 100%-й ORM, это наверняка.