Использование метаморфического кода для сокращения шаблонов

Кто-нибудь видел метаморфический код, то есть код, который генерирует и запускает инструкции (включая байт-код IL и Java, а также собственный код), используемый для сокращения шаблонного кода?

Независимо от приложения или языка, обычно есть код базы данных для получения строк из базы данных и возврата списка объектов. Конечно, есть бесчисленное множество способов сделать это в зависимости от вашего коннектора базы данных. Вы можете получить доступ к ячейкам строки по индексу (неудобно, потому что изменение «SELECT Name, Age» на «SELECT Age, Name» нарушит ваш код, плюс индексы запутывают значение) или с помощью myObject.Age = resultRow. getValue ("Age") (неудобно, потому что это предполагает простое прохождение каждого поля, чтобы установить его данные на основе столбцов).

Придерживаясь темы базы данных, LINQ to SQL великолепен. Однако определение моделей данных не так удобно, особенно если в вашей базе данных так много таблиц, что SSMS не может перечислить их все в обозревателе объектов. Кроме того, мне не нравится написание хранимых процедур или участие SQL; просто подключение объектов к базе данных.

Кто-то из компании, в которой я проходил стажировку, написал действительно потрясающий метод из нашего класса SqlCommand (который наследуется от класса System), который использует отражение .NET с помощью System.Reflection.Emit, чтобы сгенерировать метод, который будет устанавливать поля (украшенные атрибут, содержащий имя столбца) для любого объекта модели с конструктором с нулевым значением. Я считаю это метаморфическим, потому что определенная часть программы пишет новые методы.

Этот шаблон создания объектов из базы данных - всего лишь один пример. Два дня назад я обнаружил поддержку привязки данных для SWT (через JFace). Я сделал эти идеально чистые модели с помощью setAddress (Address address) и getName (), и теперь мне нужно загрязнить сеттеры с помощью активаторов PropertyChangeSupport и носить с собой экземпляр PropertyChangeSupport (даже если он находится только в абстрактном базовом классе)! Затем я нашел PojoBindables и теперь чувствую себя информатором уровня 80 просто потому, что мне нужно писать меньше.

В частности, вещи, которые используют собственный код с чем-то вроде этого или Java Agent было бы очень мило.


person Hut8    schedule 05.08.2010    source источник


Ответы (1)


Универсальное программирование может вам подойти. На веб-сайте Concept C ++ есть действительно хорошее руководство, которое охватывает абстракцию и подъем, идеи, которые можно использовать на любом языке и превратить шаблонный код в положительную силу. Изучив несколько шаблонных методов, которые почти одинаковы, вы можете вывести набор требований, которые концептуально объединяют код («Чтобы сделать X, вы должны выполнить Y, поэтому для того, чтобы X1 произошло, вы должны выполнить Y с разницей в 1») . Оттуда вы можете использовать шаблон, чтобы зафиксировать общие черты, и использовать входные данные шаблона, чтобы указать различия. На данный момент C # и Java имеют свои собственные реализации универсальных шаблонов, так что, возможно, стоит проверить.

person estanford    schedule 07.08.2010