Рубрики
Без рубрики

Простой способ получить интерфейсы Tearpcript от C #, Java или Python Code в любом IDE

Leonardo Carreiro Простой способ получить интерфейсы Skyscript от C #, Java или Python Code в любом классе IDEC # (слева) VS, созданный интерфейс (справа), который никогда не испытывал ситуации, когда вы должны исправить ошибку и в конце Вы узнаете, что ошибка на

Автор оригинала: FreeCodeCamp Community Member.

Леонардо Каррейро

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

Проблема

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

И это не только об ошибках с разными именами – никто не может вспомнить всю структуру данных всех объектов приложения. Когда вы пишете код, это обычно, чтобы ввести Отказ (или - & GT; или gt ;| или

Иногда это не больно просто Google его, и вы найдете переполнение стека, ответа с кодом, готовым к копированию. Но когда вам придется искать этот ответ внутри вашего проекта, большой проект, где код, который определяет структуру данных, которые вы должны получить доступ, находится в файле, который не был написан вами … время, которое вы тратите на этот путь Будьте один или два порядка больше, чем время, проведенное, просто написав правильное имя.

Typeycript на спасение

Когда мы использовали просто обычный старый JavaScript, у нас не было возможности избежать этого скучного пути в этих ситуациях. Но потом, в конце 2012 года Андерс Хейлсберг (Отец языка C # и его команда создал Typescript. Их миссия состояла в том, чтобы облегчить создание крупных проектов JavaScript, которые масштабируются.

Смешная часть такова, что этот новый язык был суперсета javaScript, его целью было позволить вам сделать только подмножество вещей, которые вы использовали с JavaScript. Это Добавлены новые функции Как и классы, enums, интерфейсы, типы параметров и типы возврата.

Но это также Удалены возможности даже вещи, которые не были слишком плохими, как пропустить номер в качестве параметра для Документ. GTELEMENTYBYID () и используя * Оператор с номером и числовой строкой как операнды. Вы больше не можете рассчитывать с неявными преобразованиями типа, вы должны быть явными и использовать .tostring () или Parсент (ул) Когда вы хотите, чтобы преобразование типа. Но лучшее, что вы больше не можете сделать Для доступа к полему не существует в объекте.

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

Это хорошая практика для использования разных классов в разных слоях, для разных целей, но здесь не так. Если у вас есть три слоя (A -> B -> C), у вас не должно быть конкретная структура данных S для каждого слой (один для A, один для B и один для C), а скорее для каждый край между тем слои (один между A и B и другой между B и C). Здесь, если ваш Back-End – приложение Node.js, мы должны дублировать эти объявления структуры данных, потому что мы находимся на краю между двумя различными языками программирования.

Чтобы не написать все дважды, мы остались только с одним вариантом …

Генерация кода

Однажды я работал над проектом .NET с рамками сущности. У него была модельная диаграмма в файле .edmx, и если я изменил этот файл, мне пришлось выбрать опцию для создания классов для POCO-объектов (простой старые объекты CLR).

Это поколение кода было сделано T4, двигатель шаблона Visual Studio, который работал с файлом .tt в качестве шаблона для класса C #. Он пробежал код, который читает файл модели .edmx и выводит классы в файлах .cs. После того, как помню, я подумал, что это может быть решение для генерации интерфейсов TearchScript, и я начал пытаться заставить его работать.

Во-первых, я пытался написать свой собственный шаблон. Когда я работал с этим и структурой сущности, мне никогда не нужно менять шаблон .tt. Затем я узнал, что Visual Studio не поддерживает синтаксис подсветки в файлах .tt – это было похоже на программирование в блокноте, но и хуже.

Помимо иметь C # код генерации логики, я также смешивал с ним, который должен был генерироваться, который должен был создать, как это Отказ Я установил расширение Visual Studio, чтобы получить поддержку синтаксиса, но расширение определенные цвета синтаксиса только для света темы Visual Studio, и я использую темный. Цвета синтаксиса света на темной теме были нечитаемыми, поэтому я тоже должен был изменить мою тему Visual Studio.

Сейчас с синтаксисом подчеркивая все это было хорошо. Пришло время начать писать какой-то код. Я искал в Google для рабочего примера. Моя идея состояла в том, чтобы изменить его за свои потребности после того, как я получил его работать, но … это не сработало!

System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Я пробовал много «работающих» примеров, обнаруженных поиском в Google, но ни один из них не работал. Я думал, что, может быть, проблема не была с визуальной студией или с двигателем T4 – может быть, проблема была меня, используя это неправильно.

Тогда Google получил меня на этом Выпуск В репозитории .NET Core, и я обнаружил, что не работает с проектами ASP.NET Core. Но эта ошибка была распространенной ошибкой в мире .NET World, поэтому я решил попробовать сделать обходной путь для него. Я искал эту версию 4.2.1.0 версии System.runtime.dll, я нашел его, и я попытался поставить его в разные каталоги, чтобы увидеть, сможет ли визуальную студию … Но ничего не работало.

Наконец, я использовал Process Explorer, чтобы увидеть, какую версию System.runtime Visual Studio загрузилась, и это была версия 4.0.0.0. Я пытался использовать BindingRedirect Чтобы заставить его использовать ту же версию (как я описал здесь ), и это сработало! Я не мог поверить, что мне не придется дублировать и вручную синхронизировать свои структуры данных между сервером и клиентом.

Я начал думать об этом больше, а другая мысль беспокоила меня …

Стоило ли?

Я работаю на большую нефтяную компанию с множеством устаревших приложений. Друг пришлось работать с виртуальной машиной, потому что приложение, которое он отладки, иногда работал только в Windows XP. Другое приложение, которое мне пришлось работать в один день, работал только с Visual Studio 2010. Еще один, который использовал код договоров кода только с Visual Studio 2013, поскольку расширение контрактов кода не работала в Visual Studio 2015 или 2017.

С 2012 года, когда я начал работать там до начала 2019 года, у меня никогда не было возможности разработать новое приложение. Вся моя работа всегда была с другими разработчиками. В прошлом году я начал больше учиться о программной архитектуре, и я прочитал книгу «Чистая архитектура» дяди Боб.

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

Другим бедным застройщиком придется работать над этим проектом в будущем, с моим кодом и всем моим беспорядком, и я не хочу, чтобы они имели дело с плохим кодом. Я хочу, чтобы все разработчики после меня хотеть работать над этим проектом. Это не произойдет, если им придется потерять день работы, просто чтобы получить создание клиентского кода из обратно-концевых структур данных. Затем они не будут ненавидеть меня (а некоторые из них уже не ненавидят меня за то, что вставьте текстоп-код в проекте, когда Tymdercript был еще в версии 0,9).

После того, как мысли об этом, я пришел к выводу:

В этом случае, помимо зависимостей в Visual Studio и Windows, я бы сделал проект зависеть от исправления ошибки, который должен быть зафиксирован Microsoft (и , похоже, что у него нет приоритета ). Так что лучше всего дублировать этот код и вручную синхронизировать его, чем поставить зависимость на этот двигатель T4.

Я выбираю использовать .NET CORE, но если какой-то разработчик в будущем хочет работать над этим проектом, используя Linux, я не могу их остановить.

Окончательное решение (TL; DR)

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

Мне потребовалось некоторое время, чтобы понять, что единственный инструмент, который мне нужен, был там все это время, внутри языка Runtime: Отражение Отказ

Я понял, что смогу написать какой-нибудь код, который работает на запуске моего окна Back-End ASP.NET только в режиме разработки. Этот код может использовать отражение для чтения метаданных о именах и типах всех структур данных, которые я хотел создать интерфейсы TeampScript. Мне просто нужно было отображать примитивы C # в примитивы Typlectscripts, напишите определения .d.ts Teamscrients в определенной папке, и я бы закончил.

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

Этот подход может быть использован проектами в .NET, Java, Python и любом другом языке, который имеет поддержку отражения кода, не добавляя зависимости на любой IDE/Plugin/расширении/инструмент.

Я написал простой пример, используя C # с Core asp.net и опубликовал его на github здесь Отказ Это просто берет из всех классов, которые наследуют Microsoft.aspnetCore.mvc.controllerbase и все типы от параметров и возвращает типы публичных методов, которые имеют Httpget . или Httppost атрибуты.

Вот как выглядят сгенерированные интерфейсы:

Вы можете генерировать другие типы кода тоже

Я использовал его для генерации интерфейсов и перечислений только для структур данных, но подумайте о коде ниже:

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

Я не могу генерировать интерфейсы C # из бетонных реализаций C #, поскольку мне нужен код для компиляции и выполнения до того, как я смогу использовать отражение для создания его. Но с клиентским кодом, который должен храниться в синхронизации с сервером, я могу сгенерировать его. Этот способ генерации кода можно использовать за пределы интерфейсов структуры данных.

Если вам не нравится Teadncript …

Это не нужно написано с помощью TypeyctScript. Если вы не любите Teadncript и предпочитаете использовать простой JavaScript, вы можете написать файлы .js и используйте TeampScript, как инструмент (если вы используете Visual Studio Code, который вы уже используете). Таким образом, вы можете генерировать функции HELPER, которые преобразуют ваши структуры данных в те же структуры. Это кажется странным, но это поможет службу ISTycript Language, чтобы проанализировать ваш код и рассказать Visual Studio Code с полями, которые существуют в каждом объекте, поэтому он может помочь вам написать свой код.

Заключение

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

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

Спасибо за прочтение!

PS 1: это Репозиторий с моим кодом это просто пример. Код, который преобразует классы C # в Shotescript Interfaces, нет хорошего. Вы можете сделать намного лучше, и, возможно, у нас уже есть какой-то пакет Nuget, который делает это.

PS 2: я люблю Tearscript. Если вы тоже любите Tearccript, вы можете взглянуть на эти ссылки, от до того, как он был объявлен Microsoft в 2012 году: