Управление проектами: Реализация пользовательских ошибок в процессе компиляции VS - PullRequest
2 голосов
/ 30 мая 2010

СНОВА: Если вы голосуете -1, оставьте комментарий, объясняющий почему. Этот пост не о том, одобряете ли вы этот подход или нет, а о том, как это сделать.

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

Это особенно проблема для толпы, которая считает, что трех- или четырехлетний опыт делает вас разработчиком высшего уровня. Подход к этому вопросу, связанному с обучением и проверкой кода, дал ограниченный успех.

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

Например, мы используем хранимые процедуры для ВСЕГО доступа к базе данных, что обеспечивает безопасность на уровне процедур, инкапсуляцию БД (структура таблицы скрыта от приложения) и другие преимущества. (Примечание: я не заинтересован в том, чтобы начать дискуссию по этому поводу.) Некоторые разработчики предпочитают встроенный SQL или параметризованные запросы, и это хорошо - в свое время и в собственных проектах.

Мне нужен способ добавить проверку компиляции, которая находит, скажем, все, что выглядит как

string sql = "insert into some_table (col1,col2) values (@col1, @col2);"

и генерирует ошибку или, при определенных обстоятельствах, предупреждение с сообщением типа

Inline SQL and parametrized queries are not permitted.

Или, если они используют ключевое слово var

var x = new MyClass();

Variable definitions must be explicitly typed.

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

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

Является ли регулярное выражение лучшим способом для сопоставления с образцом такого типа, или я должен сойти с ума и запустить код через синтаксический анализатор C #, который позволил бы проверку на уровне узла через дерево разбора?

Буду признателен за предложения и рассказы о предыдущем опыте.

Комментарии Несколько респондентов указали, что можно ограничить возможность пользователя запускать что-либо, кроме хранимого процесса, через разрешения БД. Тем не менее, мы находимся в процессе переноса приложения из 350 тыс. Строк из ASP 3.0 в ASP.NET MVC, и существующая кодовая база в значительной степени опирается на составной SQL, тогда как все новое использует корпоративную библиотеку. Думаю, я мог бы добавить отдельную учетную запись веб-пользователя для кода .NET с более строгими разрешениями.

Ответы [ 4 ]

1 голос
/ 30 мая 2010

Для стандартов кодирования я бы посмотрел на написание пользовательских правил для FxCop или StyleCop. Я не думаю, что Regex будет подходящим инструментом для работы.

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

1 голос
/ 30 мая 2010

Неявная типизация (var x = ....) - это функция, которую можно отключить на уровне проекта в Visual Studio.

Другой хитрее. Вы смотрели на FxCop, который является инструментом для обеспечения соблюдения стандартов кода.

1 голос
/ 30 мая 2010

А как насчет написания плагина для Resharper? Вот учебник для начала: Написание плагинов для ReSharper: Часть 1 из Undefined

0 голосов
/ 30 мая 2010

Требование, что могут использоваться только хранимые процедуры, должно управляться через разрешения базы данных. Правило против использования var мне кажется довольно произвольным, и я не могу придумать, как его применить. У вас есть еще примеры ваших лучших практик?

...