СНОВА: Если вы голосуете -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 с более строгими разрешениями.