День двести сорок шестой. #BestPractices
Разработка для Расширяемости
Виртуальные Члены
Виртуальные члены могут быть переопределены, тем самым изменяя поведение подкласса. Они очень похожи на обратные вызовы с точки зрения расширяемости, которую они предоставляют, но они лучше с точки зрения производительности и потребления памяти. Кроме того, виртуальные члены более естественны в сценариях, которые требуют создания особого вида существующего типа (специализация). Виртуальные члены работают лучше, чем обратные вызовы и события, но хуже, чем невиртуальные методы.
Основным недостатком виртуальных членов является то, что поведение виртуального члена может быть изменено только во время компиляции. Поведение же метода обратного вызова может быть изменено во время выполнения.
Виртуальные члены, также как и обратные вызовы, являются дорогостоящими для разработки, тестирования и обслуживания, поскольку любой вызов виртуального члена может быть переопределен непредсказуемым образом и может выполнить произвольный код. Кроме того, обычно требуется больше усилий для чёткого определения контракта виртуальных членов, поэтому стоимость их разработки и документирования выше.
❌ ИЗБЕГАЙТЕ создания виртуальных членов, если у вас нет веских причин для этого, и вы не просчитали все расходы, связанные с проектированием, тестированием и обслуживанием виртуальных членов. Виртуальные члены менее защищены от изменений, которые могут быть внесены в них без нарушения совместимости. Кроме того, они медленнее, чем невиртуальные, в основном потому, что компилятор не может оптимизировать код, встроив вызов виртуального члена.
✅ ИСПОЛЬЗУЙТЕ расширяемость только для тех членов, которым она абсолютно необходима.
✅ ИСПОЛЬЗУЙТЕ защищённый (protected) модификатор доступа для виртуальных членов. Открытые члены должны обеспечивать расширяемость (если она требуется), вызывая защищённый виртуальный член. Открытые члены класса должны предоставлять правильный набор функциональных возможностей для прямых потребителей этого класса. Виртуальные члены предназначены для переопределения в подклассах, и защищённый доступ к ним является отличным способом для предоставления потребителям типа возможности для расширения.
Источник: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/
Разработка для Расширяемости
Виртуальные Члены
Виртуальные члены могут быть переопределены, тем самым изменяя поведение подкласса. Они очень похожи на обратные вызовы с точки зрения расширяемости, которую они предоставляют, но они лучше с точки зрения производительности и потребления памяти. Кроме того, виртуальные члены более естественны в сценариях, которые требуют создания особого вида существующего типа (специализация). Виртуальные члены работают лучше, чем обратные вызовы и события, но хуже, чем невиртуальные методы.
Основным недостатком виртуальных членов является то, что поведение виртуального члена может быть изменено только во время компиляции. Поведение же метода обратного вызова может быть изменено во время выполнения.
Виртуальные члены, также как и обратные вызовы, являются дорогостоящими для разработки, тестирования и обслуживания, поскольку любой вызов виртуального члена может быть переопределен непредсказуемым образом и может выполнить произвольный код. Кроме того, обычно требуется больше усилий для чёткого определения контракта виртуальных членов, поэтому стоимость их разработки и документирования выше.
❌ ИЗБЕГАЙТЕ создания виртуальных членов, если у вас нет веских причин для этого, и вы не просчитали все расходы, связанные с проектированием, тестированием и обслуживанием виртуальных членов. Виртуальные члены менее защищены от изменений, которые могут быть внесены в них без нарушения совместимости. Кроме того, они медленнее, чем невиртуальные, в основном потому, что компилятор не может оптимизировать код, встроив вызов виртуального члена.
✅ ИСПОЛЬЗУЙТЕ расширяемость только для тех членов, которым она абсолютно необходима.
✅ ИСПОЛЬЗУЙТЕ защищённый (protected) модификатор доступа для виртуальных членов. Открытые члены должны обеспечивать расширяемость (если она требуется), вызывая защищённый виртуальный член. Открытые члены класса должны предоставлять правильный набор функциональных возможностей для прямых потребителей этого класса. Виртуальные члены предназначены для переопределения в подклассах, и защищённый доступ к ним является отличным способом для предоставления потребителям типа возможности для расширения.
Источник: https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/