Когда я должен использовать атрибут [Устаревший] и когда я должен удалить свой код?

Функция [Obsolete] по сути, чтобы остановить использование класса / функции, но при этом сохранить его в коде для записи.

Есть ли веская причина, почему [Obsolete] следует использовать вместо простого удаления или комментирования кода. Этот вопрос еще более актуален, если у вас есть контроль версий, поэтому нет смысла хранить код в справочных целях, как это будет в СЦ.

Мне интересно, что считается лучшей практикой?

3 ответа

Решение

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

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

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

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

Obsolete Атрибут помечает программный объект как объект, который больше не рекомендуется для использования. Каждое использование объекта, помеченного как устаревшее, впоследствии генерирует предупреждение или ошибку, в зависимости от того, как настроен атрибут.

Вот пример для Hashtable компаратор из справочного источника.

    [Obsolete("Please use KeyComparer properties.")]        
    protected IComparer comparer
    {
        get
        {
            if( _keycomparer is CompatibleComparer) {
                return ((CompatibleComparer)_keycomparer).Comparer;
            }    
            else if( _keycomparer == null) {
                return null;
            }                            
            else {
                throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
            }                
        }
        set
        {
            if (_keycomparer is CompatibleComparer) {
                CompatibleComparer keyComparer = (CompatibleComparer)_keycomparer;
                _keycomparer = new CompatibleComparer(value, keyComparer.HashCodeProvider);
            }
            else if( _keycomparer == null) {
                _keycomparer = new CompatibleComparer(value, (IHashCodeProvider)null);               
            }                
            else {
                throw new ArgumentException(Environment.GetResourceString("Arg_CannotMixComparisonInfrastructure"));
            }
        }
    }

Документация к ObsoleteAttribute описывает причины его существования довольно хорошо...

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

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

Другие вопросы по тегам