Окончательное заключение, поскольку в SqlQuery отсутствует метод Include
public static Genre BrowseGenre(string genre)
{
using (MusicStoreEntities db = new MusicStoreEntities())
{
//return db.Database.SqlQuery<Genre>("GetAllGenres").Include("Albums").Single(g => g.Name == genre);
return db.Genres.Include("Albums").Single(g => g.Name == genre);
}
}
. TXL является базирующимся правилом, а не базирующийся шаблон, таким образом, это имеет больше возможностей, но возможно более крутую кривую обучения.
Я подумываю воскресить этот код, перевести его на современный язык и открыть исходный код проекта в качестве инструмента рефакторинга.
Я думаю, было бы просто здорово иметь такой инструмент в свободном доступе.
Но есть коммерческий продукт: DMS Software Reengineering Toolkit .
DMS Software Reengineering Toolkit - это набор инструментов для автоматизации пользовательского анализа исходных программ, модификации или перевода или генерации программных систем, содержащих произвольные смеси языков («домены»). Термин «программное обеспечение» для DMS очень широк и охватывает любые формальные обозначения, включая языки программирования, языки разметки, языки описания оборудования, конструкторские обозначения, описания данных и т. Д. Этот инструментарий является первым шагом на пути к реализации The Design Maintenance System ™ , амбициозное видение среды разработки программного обеспечения 21-го века, которая поддерживает поэтапное построение и обслуживание больших прикладных систем на основе семантики и захваченного дизайна.
Кроме того, для исходного кода C существует инструмент coccinelle :
Coccinelle - это механизм сопоставления программ и преобразования, который предоставляет язык SmPL (Semantic Patch Language) для определения желаемых совпадений и преобразований в C код. Первоначально Coccinelle была нацелена на выполнение побочных изменений в Linux.Такие эволюции включают изменения, которые необходимы в клиентском коде в ответ на эволюцию библиотечных API, и могут включать такие модификации, как переименование функции, добавление аргумента функции, значение которого так или иначе зависит от контекста, и реорганизация структуры данных. Помимо побочных эволюций, Coccinelle успешно используется (нами и другими) для поиска и исправления ошибок в системном коде.
Реализация приведенного выше правила в Coccinelle будет выглядеть так:
@@ identifier cnt; expression max,E; @@ cnt = 0 ... when != cnt=E -while (cnt < max) +for (cnt=0; cnt < max; cnt++) { ... - cnt++; }
Для кода C:
int main () { int i=0; printf ("hello\n"); while(i < arrlen) { printf("element %d: %f\n",i,arr[i]); ++i; } }
он дает
int main () {
int я = 0;
printf ("привет \ п");
for (i = 0; i ... when! = Cnt = E разрешает произвольный код между инициализацией cnt и циклом while, но проверяет, не переопределено ли cnt. Более сложное правило может также избавиться от инициализации cnt, если оно не используется между инициализацией и циклом while.
Наша DMS уже упоминалась. У него есть правила преобразования, которые, как выразился ОП, «легко читать, потому что они написаны на том же языке, что и целевой исходный код ».
Вот ссылка , которая показывает полный, подробный пример сопоставления / преобразования с образцом с использованием DMS.