Задать вопрос
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)

Нужно ли от этого избавлятся и как-то пытатся делать короче?
  • Вопрос задан
  • 160 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 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 из-за ошибки и когда так задумано ничем не отличается. При перегрузке тоже правда будет использоваться некий дефолтный параметр.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы