motkot
@motkot
Программирование C#.

Нужно ли как-то исправлять такие перегрузки?

Здраствуйте! У меня есть статический класс с методами-расширениями. И там есть метод Move.

Первый
public static void Move(this Transform transform, Vector3 target, float time)
        {
            if (time < 0) Debug.LogError("Time can't be negative");

            var start = transform.position;
            var deltaTime = 0f;

            var thread = _updateThreads.CreateThread();

            Observable.EveryUpdate().Subscribe(action =>
            {
                if (deltaTime >= 1)
                {
                    transform.position = target;

                    _updateThreads.ClearThread(thread);
                }

                transform.position = Vector3.Lerp(start, target, deltaTime);

                deltaTime += Time.deltaTime / time;

            }).AddTo(thread);
        }


Тут пока все нормально, но потом мне нужно было еще движение с помощью AnimationCurve и тогда я создал перегрузку.

Второй
public static void Move(this Transform transform, Vector3 target, float time, AnimationCurve curve)
        {
            if (time < 0) Debug.LogError("Time can't be negative");
            if (curve == null) Debug.LogError("Curve is null");

            var start = transform.position;
            var deltaTime = 0f;

            var thread = _updateThreads.CreateThread();

            Observable.EveryUpdate().Subscribe(action =>
            {
                if (deltaTime >= 1)
                {
                    transform.position = target;

                    _updateThreads.ClearThread(thread);
                }

                transform.position = Vector3.Lerp(start, target, curve.Evaluate(deltaTime));

                deltaTime += Time.deltaTime / time;

            }).AddTo(thread);
        }


Если посмотреть, то почти ничего не отличается, только новый параметр, проверка и вместо deltaTime написано curve.Evaluate(delta)

Нужно ли от этого избавлятся и как-то пытатся делать короче?
  • Вопрос задан
  • 157 просмотров
Решения вопроса 2
insighter
@insighter
-First time? - Huh? (C#, React, JS)
То что вводишь новые методы, это нормально. Но внутри они же могут использовать друг друга. У тебя нарушение принципа DRY.
Перепиши так, чтобы первый Move вызывал перегруженный вариант с неким дефолтовым параметром.

Да вроде и есть такая штука, как дефолтовые значения параметров, но сейчас в .NET общая тенденция отказа от них в сторону добавления перегрузок методов.
Ответ написан
Комментировать
@Voland69
Возьмем за основу метод2
изменим сигнатуру
public static void Move(this Transform transform, Vector3 target, float time, AnimationCurve curve = null)

и изменим использование curve следующим образом
transform.position = Vector3.Lerp(start, target, curve != null ? curve.Evaluate(deltaTime) : deltaTime);


Или создать две перегрузки, как предлагает insighter

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы