WPF Если вспомогательные классы плохие, как правильно устранить дублирующийся код?

Итак, я провел сегодня ночь, чтобы прочитать о вспомогательных классах, и есть много людей, которые советуют избегать вспомогательных классов. Мне понравилась жестокость этого парня: http://simpleprogrammer.com/2010/04/12/should-i-leave-that-helper-class/. Это заставило меня спросить себя, что еще, если не вспомогательный класс тогда?

Так что в моем приложении WPF у меня есть 3 страницы. На каждой странице у меня есть Label, и я использую этот метод для его анимации:

    public static void SetUpAnimation()
    {
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        doubleAnimation.From = -nameLabel.ActualWidth;
        doubleAnimation.To = nameCanvas.ActualWidth;
        doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
        doubleAnimation.Duration = new Duration(TimeSpan.Parse("0:0:10"));
        nameLabel.BeginAnimation(Canvas.RightProperty, doubleAnimation);
    }

Итак, теперь я создал статический класс LabelAnimator и поставил этот метод, все в порядке. Но что происходит, когда я добавляю больше кода, который не связан с этим аниматором, и использую его также на других страницах. Например, Таймер, который обновляет эту метку. Код идентичен, что означает, что я скопирую его на каждую страницу WPF (класс).

При таком подходе мне пришлось бы создать еще один вспомогательный класс, такой как LabelTimer. Что означает, что у меня будет 2 класса с 1 методом каждый.. Я не знаю, сколько это будет тратить, но что меня больше беспокоит, так это вообще хороший подход, есть ли лучший способ, чем делать вспомогательные классы для каждого метода, как этот?

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

Как я прочитал здесь: https://softwareengineering.stackexchange.com/questions/107458/how-to-remove-duplicate-code-in-general правильный способ устранения дублирующегося кода в классах одной и той же иерархии - извлечь метод и потяните его вверх, что, как я понимаю, я и делаю. Помещение метода во вспомогательный класс.

Но хорошо ли это? Наличие 10 различных вспомогательных классов (если вы не хотите помещать все методы в один вспомогательный класс и сделать его очень запутанным), является единственным вариантом устранения дублирующих методов в одной иерархии классов?

В те дни, когда я был маленьким, я всегда беспокоился о том, что программы будут работать, теперь, когда я большой ребенок, я должен думать о таких вещах. Но я люблю кодировать из-за таких вещей;)

Спасибо за любой совет.

2 ответа

Это предотвращает повторное использование кода и поможет только одной части кода, которая в этом случае вам даже не нужен новый класс.

Вы можете просто поместить дополнительный код за пределы класса, который вы вызываете.

"pull it up" не всегда означает создание статического вспомогательного класса. В приведенном выше примере вы можете создать базовый класс для ваших 3 страниц, содержащих одинаковую анимацию (но на самом деле это относится только к Xaml)

public LabelPage : Page
{
    public virtual void SetUpAnimation()
    {
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        doubleAnimation.From = -nameLabel.ActualWidth;
        doubleAnimation.To = nameCanvas.ActualWidth;
        doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
        doubleAnimation.Duration = new Duration(TimeSpan.Parse("0:0:10"));
        nameLabel.BeginAnimation(Canvas.RightProperty, doubleAnimation);
    }
}

И если вам нужно добавить / изменить анимацию, вы можете переопределить в своем классе

public Page1 : LabelPage
{
    public override void SetUpAnimation()
    {
       base.SetUpAnimation();

       // more stuff to do;
    }
}

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

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