A
Ash81
Господа, прошу прощения за довольно ламерский вопрос, однако своим умом додуматься у меня не получилось, а время в большом дефиците =(
Суть вот в чем. Есть некий клас ответственный за разбор(парсинг) входящей строки. Предполагается что формат строки время от времени меняется, мы этот процесс не контролируем, по этому нужен некий "запас прочности" на случай изменений в формате. Предполагается сделать это посредством набора масок. Например из строки требуется считать дату. Маски будут соответственно чем-то вроде "??/??/????", "??/??/??", "??-??-??". Так же для времени, и прочего, что нам может понадобиться. Если к "слову"(элементу строки) не подходит ни одна маска - отбрасываем.
Проблемы на первый взгляд никакой, пиши по методу для каждой маски, вот и всё. Но, для того чтобы быть уверенными, что из строки считана вся полезная нам информация, нужно применить к ней все маски по очереди. И так во всех классах, которые производят парсинг строк (речь вообще идет об анализе разнородных логов, формат которых сильно плавает);
Если потребуется добавить новую маску, придется проделать много ненужной работы...
Очевидно есть какое-то более красивое решение. Что-нибудь наподобие: объявить класс
public abstract AbstractMask{
...
string mask;
virtual DateTime Parse(string frase);
}
От него сделать для каждой маски по потомку, с собственным методом обработки. Потом сделать коллекцию объектов, и вызывая объекты по очереди в цикле, применять метод Parse каждого.
Только вот возвращаемое функцией Parse значение может быть любым (и дата, и строка, и число), а Си язык со строгой типизацией. Так что виртуальную функцию "на все случаи жизнь" в предке объявить не удасться. Вобщем я в ступоре...
Буду очень благодарен за помощь!
Суть вот в чем. Есть некий клас ответственный за разбор(парсинг) входящей строки. Предполагается что формат строки время от времени меняется, мы этот процесс не контролируем, по этому нужен некий "запас прочности" на случай изменений в формате. Предполагается сделать это посредством набора масок. Например из строки требуется считать дату. Маски будут соответственно чем-то вроде "??/??/????", "??/??/??", "??-??-??". Так же для времени, и прочего, что нам может понадобиться. Если к "слову"(элементу строки) не подходит ни одна маска - отбрасываем.
Проблемы на первый взгляд никакой, пиши по методу для каждой маски, вот и всё. Но, для того чтобы быть уверенными, что из строки считана вся полезная нам информация, нужно применить к ней все маски по очереди. И так во всех классах, которые производят парсинг строк (речь вообще идет об анализе разнородных логов, формат которых сильно плавает);
Если потребуется добавить новую маску, придется проделать много ненужной работы...
Очевидно есть какое-то более красивое решение. Что-нибудь наподобие: объявить класс
public abstract AbstractMask{
...
string mask;
virtual DateTime Parse(string frase);
}
От него сделать для каждой маски по потомку, с собственным методом обработки. Потом сделать коллекцию объектов, и вызывая объекты по очереди в цикле, применять метод Parse каждого.
Только вот возвращаемое функцией Parse значение может быть любым (и дата, и строка, и число), а Си язык со строгой типизацией. Так что виртуальную функцию "на все случаи жизнь" в предке объявить не удасться. Вобщем я в ступоре...
Буду очень благодарен за помощь!