Этот обзор кода опытного разработчика Microsoft демонстрирует несколько полезных практик, применимых в собственных проектах. Анализ кода выявляет приёмы, описанные в книгах по проектированию и стандартах Microsoft, но представленные в доступной форме.
Правильная сортировка членов класса
Правильная сортировка членов класса (полей и методов) повышает читаемость кода. В классе NamRestrictions конструктор объявлен перед свойствами. Это соответствует рекомендациям, так как конструктор имеет приоритет над свойствами (функциональными членами, идущими после полей). Конструктор, вероятно, следует правилу минимального количества вычислений, выполняя лишь инициализацию полей.
Явное указание модификаторов доступа
В классе Parser рекомендуется явно указывать модификаторы доступа (public, internal). Даже если модификатор кажется очевидным, явное указание повышает читаемость и предотвращает ошибки. Это особенно важно для дальнейшего развития проекта.
Использование запечатанных классов (sealed)
Объявление класса как sealed (запечатанного) предотвращает наследование. Это полезно, если дальнейшее наследование не планируется.
Использование readonly полей
Поле tokens помечено как readonly. Его значение устанавливается один раз в конструкторе и не может быть изменено. Это разделяет неизменяемые и изменяемые поля, улучшая понимание кода.
Явное указание типов переменных
Хотя используется var (автоматически определяемый тип), в некоторых случаях (например, при вызове методов) рекомендуется явно указывать тип переменной, если он не очевиден из правой части выражения. Это повышает читаемость и помогает избежать ошибок.
Использование LINQ и избегание преждевременной оптимизации
Активное использование LINQ (Language Integrated Query) опровергает распространённое заблуждение о его неэффективности. В большинстве случаев LINQ упрощает код без существенного снижения производительности, особенно при точечном применении. Вместо ручного создания и модификации списков используется автоматическая генерация кода, предоставляемая LINQ.
Работа с коллекциями: инкапсуляция и неизменяемость
Для передачи списка строк (diagnostics) используется свойство типа IReadOnlyList<string>. Это позволяет получить доступ к данным, но не изменяет коллекцию извне, обеспечивая инкапсуляцию и целостность данных.
Конструкторы: минимум логики
Конструктор используется только для инициализации полей. Сложные вычисления и подписка на события должны выноситься в отдельные методы.
Улучшение интерфейса с помощью свойств и методов
Вспомогательные свойства и методы (например, Count) улучшают интерфейс класса, делая его удобнее в использовании.
Анализ кода опытных разработчиков — ценный опыт. Правильная сортировка членов класса, явное указание модификаторов доступа, использование readonly полей и LINQ, а также принципы инкапсуляции и разделения ответственности значительно улучшают качество кода, делая его понятнее и проще в поддержке. Необходимо стремиться к постоянному улучшению дизайна системы, даже путём мелких, но значимых изменений.