Мой класс Запроса. Ваше мнение?

Groovy/Grails

  1. Ввод Утки
  2. Соглашение по Конфигурации, принимая Вас знает Соглашение
  3. Все, что Вы ненавидите о Spring
  4. Все, о чем Вы ненавидите, в спящем режиме
  5. [Groovy], общие операции через наборы не (но недавние выпуски улучшают это)
6
задан 3 revs, 2 users 100% 10 August 2009 в 16:32
поделиться

4 ответа

Похоже, вы написали очень красивую небольшую ORM (объектно-реляционное сопоставление) с реализацией шаблона репозитория (или близкого к нему). Вы также воспользовались шаблоном проектирования под названием Fluent Interfaces, который позволяет вам делать .Table .Fields каскадно друг от друга.

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

Изменить: Единственная возможная область, которую я мог видеть для улучшения, - это изменить тот факт, что каждый вызов является новым запросом, и, возможно, изменить свой код, чтобы использовать структуру внедрения зависимостей, которая будет вводить правильный поставщик, и когда объект вызывается, он будет инициировал транзакцию базы данных для запроса. Если ваш код уже в значительной степени делает это внутри класса Query, который можно назвать «Внедрение зависимостей бедняков» или, по крайней мере, он очень похож (в зависимости от вашей реализации), который, если он уже работает для вас, и вы не собираетесь действительно расти Если ваши типы баз данных не поддерживают DI для бедняков, все должно быть в порядке. Я просто больше не поклонник нового ключевого слова в любом использовании, поскольку оно обычно вызывает высокий уровень сцепления кода, который смягчает структура DI (или это ' s для метода сокрытия - плохое плохое дизайнерское решение).

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

public static OrdersDataTable GetByOrderId( int id )
{
    return  
       new Query(connection)
       .Table(x => Inflector.Pluralize(x.GetType())
       .Fields(x=> { x.OrderID, x.CustomerID, x.Description, x.Amount })
       .Equals(x=>x.OrderID, id)
       .Execute<OrdersDataTable>();
}

Это устранит все проблемы рефакторинга волшебных строк, что позволит вам гораздо проще использовать встроенные инструменты рефакторинга Microsoft или Resharper (из Конечно, resharper может находить волшебные строки во время рефакторинга).

Inflector - это бесплатная библиотека (не могу вспомнить, OSS или нет), которая включает в себя функции для работы с текстом, метод Pluralize возьмет слово и сделает его ... множественное число, если вы не могли догадаться.

3
ответ дан 17 December 2019 в 07:07
поделиться

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

Я бы просто использовал LINQ и выполнил ту же задачу с более читаемым кодом.

1
ответ дан 17 December 2019 в 07:07
поделиться

Это забавное упражнение, и ваш код действительно выглядит достаточно читабельным и кратким. В производственной среде я бы, вероятно, воздержался от изобретения велосипеда, если в этом не было серьезной необходимости. Моё и ваше время лучше потратить на создание ценности в приложении, а не на добавление функциональности в настраиваемую ORM, которую мы можем получить «бесплатно» в других, проверенных в боях, пакетах, таких как LINQ и NHibernate.

0
ответ дан 17 December 2019 в 07:07
поделиться

Хотя я согласен с тем, что Linq предназначен для этого, нет причин не создавать свою собственную архитектуру, если она соответствует вашим требованиям.

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

0
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

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