Прежде всего, извините за длинный вопрос, но я не мог написать его короче:)
Пример из реального мира: у нас есть большой рулон бумаги, на котором напечатаны маленькие «наклейки».Каждая наклейка имеет код.Первые две буквы кода указывают нам, что это за наклейка (наклейка, обозначающая новый рулон, наклейка, обозначающая конец текущего броска, наклейка, которая должна пройти проверку качества, ... но большинство из них - это обычные наклейки с нумерацией).
Например, наклейка с кодом XX0001 означает, что после нее должны быть только нормальные нумерованные коды (от NN0001 до NN9999), всегда один и тот же номер.Код QC0001 говорит нам, что следующие 10 кодов (от QC0001 до QC0010) должны перейти к контролю качества.
Я разработал приложение так, чтобы каждый тип наклейки был своего класса - NormalSticker
, BadSticker
, ControllSticker
, QualitySticker
, ... Все они наследуются от класса SticerBase, который содержит некоторые общие данные для всех из них (качество сканирования, дата и время сканирования, содержимое кода).Экземпляры этих классов создаются в статическом классе Parser, который проверяет код и возвращает нам соответствующий объект.
Все это работает нормально, но теперь я остановился.У меня также есть класс Roll
, который имеет набор стикеров, реализованных как List<StickerBase>.
. Этот класс имеет открытый метод 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()
метод к каждому Sticker
классу.В логике проверки (аналогично ответу Петера Торока ) я могу просто проверить, совпадает ли текущая наклейка с previousSticker.NextStickerShouldLookLike()
.Метод Validate будет иметь два входных параметра - текущий и предыдущий стикер.