Вопрос о дизайне полиморфизма

Прежде всего, извините за длинный вопрос, но я не смог написать его короче :)

Пример из реальной жизни: у нас есть большой рулон бумаги, на котором есть маленькие «наклейки» напечатаны на них. На каждой наклейке есть код. Первые две буквы кода говорят нам, что это за наклейка (наклейка, обозначающая новый рулон, наклейка, обозначающая конец текущего рулона, наклейка, которая должна пройти контроль качества, ... но большинство из них представляют собой обычные пронумерованные наклейки) .

Например, наклейка с кодом XX0001 означает, что после него должны быть только нормальные нумерованные коды (например, от NN0001 до NN9999), всегда один и тот же номер. Код QC0001 сообщает нам, что следующие 10 кодов (от QC0001 до QC0010) должны пройти контроль качества.

Я разработал приложение таким образом, чтобы каждый тип стикера был отдельным классом - NormalSticker , BadSticker , ControllSticker , QualitySticker , ... Все они наследуются от класса SticerBase, который содержит некоторые общие данные для всех из них (качество сканирования, дата и время сканирования, содержание кода). Экземпляры этих классов создаются в статическом классе Parser, который проверяет код и возвращает нам соответствующий объект.

Все работает нормально, но теперь я остановился. У меня также есть класс Roll , в котором есть набор стикеров, реализован как Список . В этом классе есть общедоступный метод AddSticker (StickerBase) , с помощью которого мы добавляем стикеры в рулон. Но этот метод должен содержать некоторую логику, например, если мы получим код XX001, то следующие 9999 стикеров должны быть от NN0001 до NN9999. Единственный вариант, который я вижу здесь, - это принимать решения на основе типа наклейки, например:

public void AddSticker(StickerBase sticker)
{
    if (sticker.GetType().Equals(typeof(StickerNewRoll)))
    {
        // Next 9999 sticker should be in the form of NN0001 to NN9999
    }

    if (sticker.GetType().Equals(typeof(EnumeratedSticker)))
    {
        // Add 9999 stickers to the list, other business logic...
    }

    if (sticker.GetType().Equals(typeof(QualitySticker)))
    {
        // Stop the machine and notify the worker
    }
}

Я был бы очень удивлен, если бы это был правильный подход. Есть идеи?

Редактировать - возможное решение: поскольку я знаю, как должен выглядеть следующий стикер, я могу добавить новый метод public Sticker NextStickerShouldLookLike () метод к каждому стикеру ] учебный класс. В логике проверки (аналогично Péter Török ' s answer ) Я могу просто проверить, совпадает ли текущий стикер с previousSticker.NextStickerShouldLookLike () . Метод Validate будет иметь два входных параметра - текущий и предыдущий стикер.

8
задан Community 23 May 2017 в 11:48
поделиться