Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Выполнение неопределенного количества методов - C++

09.09.2010, 21:09. Просмотров 685. Ответов 14

Не знал как точнее сформулировать название темы, так что если слабо соответствует действительности, то прошу прощения

Собственно сама задачка.
Есть некоторая система (программа), которая при запуске должна запустить подсистему предварительного тестирования. Количество предварительных тестов в процессе развития самой системы соответственно увеличивается. Поэтому подсистему тестирования надо сделать как можно более гибкой и расширяемой. Организация работы подсистемы тестирования у меня и вызывает некоторые вопросы. Если для этого есть какое-то решение в виде паттерна, то прошу подкинуть мне название (ну можно и литературку сразу ).

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

Вкратце вот, что вышло (здесь привожу только скелет подсистемы, без конкретной реализации).
Написан
интерфейс для теста

C++
1
2
3
4
5
6
7
8
class Inspection
{
public:
    virtual ~Inspection() {
    }
    
    virtual bool Run() = 0; // перегруженный метод Run должен выполнять проверку и сигнализировать об успешности/неуспешности
};

Класс самой подсистемы
Наследуется от интерфейса проверки (отчасти в надежде на то, что некоторые тесты можно будет собирать в инспекторы и добавлять в инспектор верхнего уровня, а от части, что для системы могут понадобиться тесты по завершению работы)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Inspector : public Inspection
{
public:
    // Деструктор
    ~Inspector() {
        while(!methods.empty()) {
            delete methods.front();
            methods.pop();
        }
    }
 
    // Добавление нового теста в список инспектора
    void AddMethod(Inspection *method) {
        methods.push(method);
    }
    
    // Опять же запуск всех методов из инспектора и сигнализирование об успешности
    bool Run() {      
        while(!methods.empty()) {
            if(!methods.front()->Run())
                return false;
            
            delete methods.front();
            methods.pop();
        }
 
        return true;
    }
    
private:
    std::queue<Inspection*> methods;
};

Теперь реализовывается
отдельный класс для каждой проверки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ExistInspection : public Inspection
{
    bool Run() {
        // Проверка на существование компонент системы
        return true;
    }
};
 
class ChecksumInspection : public Inspection
{
    bool Run() {
        // Проверка контрольных сумм компонент системы
        return true;
    }
};


Осталось только все это использовать
следующим образом

C++
1
2
3
4
5
6
7
Inspector PrestartInspector;
PrestartInspector.AddMethod(new ExistInspection);
PrestartInspector.AddMethod(new ChecksumInspection);
 
if(!PrestartInspector.Run()) {
    // Проверка не пройдена
}


Такое решение мне конечно самому в целом вполне нравится
Но как говорится нет предела совершенству, а перелопачивать абсолютно все паттерны в поиске необходимого боюсь не хватит времени.
Повторюсь с вопросом, может кто-то может подсказать мне или решение или паттерн описывающий решение (... или улучшить/покритиковать чтобы знать, что следует ожидать от того, что я попробовал написать)?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2010, 21:09     Выполнение неопределенного количества методов
Посмотрите здесь:

Ввод неопределенного количества символов - C++
В программе нужно реализовать возможность ввода символов, но не известно сколько раз надо это сделать. После идет обработка того, что мы...

Как разделить заданное число на сумму неопределенного количества заданных чисел? - C++
Есть число n необходимо разделить его на a сумму a b c или a b c d. В общем кол-во заданных чисел может быть любым. Ввод n и этих чисел...

Программирование НЕопределенного интеграла - C++
Как запрограммировать НЕопределенный интеграл, есть ли какая-то библиотека, в которой есть такая функция ? В инете поиск постоянно выдает...

Статический массив неопределенного размера - C++
Добрый день! Помогите, пожалуйста, разобраться вот с этим кодом: #include &lt;iostream&gt; using namespace std; main () { int x; cin...

Ошибка использование неопределенного класса - C++
Добрый день. У меня есть несколько классов с циклической вложенностью, мною были использовано предварительное объявление класса, но это...

Передача неопределенного числа параметров в функцию - C++
В общем вот программка реализовано так,чтобы узнать когда конец переданных параметров, последним передается 0, и проверяется в ф-ии на 0. ...

Создание неопределенного двумерного массива из файла - C++
Собственно, что выделено комментариями у меня и не получается. Я не могу (хотя даже не знаю) как создать двумерный массив из файла. В файле...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
09.09.2010, 21:26     Выполнение неопределенного количества методов #2
Цитата Сообщение от fasked Посмотреть сообщение
Количество предварительных тестов в процессе развития самой системы соответственно увеличивается. Поэтому подсистему тестирования надо сделать как можно более гибкой и расширяемой.
как я понял есть набор тестов который может расти и какая то система которая эти тесты проводит и надо сделать так чтобы при добавлении теста ничего не приходилось менять в системе. Возможно подойдет паттерн абстрактная фабрика. каждый тест сам регистрирует себя, система перебирает все зарегистрированные тесты и что-то с ними делает. Естественно что тесты должны иметь одинаковый интерфейс.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 21:31  [ТС]     Выполнение неопределенного количества методов #3
Цитата Сообщение от rrrFer Посмотреть сообщение
как я понял есть набор тестов который может расти и какая то система которая эти тесты проводит и надо сделать так чтобы при добавлении теста ничего не приходилось менять в системе.
Да-да, именно так.
Цитата Сообщение от rrrFer Посмотреть сообщение
Возможно подойдет паттерн абстрактная фабрика.
Как я понял, абстрактная фабрика позволяет управлять так называемыми семействами (наборами). То есть одно семейство тестов можно легко заменить на другое семейство. Возможно я что-то недопонял, если можно было бы показать пример...
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 21:39     Выполнение неопределенного количества методов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
1. не храните в контейнерах указатели.
2. у вас течет память.
3. повторю - абстрактная фабрика.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 21:42  [ТС]     Выполнение неопределенного количества методов #5
Цитата Сообщение от niXman Посмотреть сообщение
не храните в контейнерах указатели.
Именно это мне больше всего и не нравилось.
Цитата Сообщение от niXman Посмотреть сообщение
у вас течет память.
Понадеялся на деструктор
Цитата Сообщение от niXman Посмотреть сообщение
повторю - абстрактная фабрика.
Пошел читать
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 21:44     Выполнение неопределенного количества методов #6
Цитата Сообщение от fasked Посмотреть сообщение
Это мне больше всего и не нравилось.
почему же так сделали?

Цитата Сообщение от fasked Посмотреть сообщение
Понадеялся на деструктор
у вас динамический объект. кто должен высвободить память из под него?
есть правило: кто память выделяет, тот и высвобождает.
но это не относится к смарт-поинтерам.
rrrFer
Заблокирован
09.09.2010, 21:45     Выполнение неопределенного количества методов #7
прикрепил презентации, в одной описание, во второй применение
Вложения
Тип файла: zip презентации.zip (473.1 Кб, 15 просмотров)
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 21:48  [ТС]     Выполнение неопределенного количества методов #8
Цитата Сообщение от niXman Посмотреть сообщение
почему же так сделали?
Потому что не нашел другого решения
Цитата Сообщение от niXman Посмотреть сообщение
у вас динамический объект. кто должен высвободить память из под него?
Я же говорю деструктор:
C++
1
2
3
4
5
6
~Inspector() {
    while(!methods.empty()) {
        delete methods.front();
        methods.pop();
   }
}
Разве этот кусок не приберет мусор?

Не по теме:

Цитата Сообщение от rrrFer Посмотреть сообщение
прикрепил презентации, в одной описание, во второй применение
Жаль, но у меня нет MS Office

niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 21:54     Выполнение неопределенного количества методов #9
Цитата Сообщение от fasked Посмотреть сообщение
Потому что не нашел другого решения
boost.shared_ptr

Цитата Сообщение от fasked Посмотреть сообщение
Я же говорю деструктор
в коде в первом посту, оператора delete нет. посему и заметил.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 22:01  [ТС]     Выполнение неопределенного количества методов #10
Цитата Сообщение от niXman Посмотреть сообщение
auto_ptr подойдет?
Цитата Сообщение от niXman Посмотреть сообщение
в коде в первом посту, оператора delete нет. посему и заметил.
Наверное резанул лишков, но потом поправил
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 22:06     Выполнение неопределенного количества методов #11
Цитата Сообщение от fasked Посмотреть сообщение
auto_ptr подойдет?
я уже и не помню его семантику. помоему с ним что-то не ладно, в ситуациях, когда его приходится хранить в контейнерах.
обновите компилятор, и юзайте std::shared_ptr
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 22:28  [ТС]     Выполнение неопределенного количества методов #12
Цитата Сообщение от niXman Посмотреть сообщение
обновите компилятор, и юзайте std::shared_ptr
Спасибо, в gcc 4.5.0 думаю они уже есть
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 22:30     Выполнение неопределенного количества методов #13
угу..
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.09.2010, 23:26     Выполнение неопределенного количества методов #14

Не по теме:

Цитата Сообщение от niXman Посмотреть сообщение
я уже и не помню его семантику. помоему с ним что-то не ладно, в ситуациях, когда его приходится хранить в контейнерах.
Он монопольно владает переданным указателем, а при копирование сбрасывается.


Inspector мне кажется неподходящее название, по смыслу больше бы подошло CompositeInspection.
Вот только смысл использования фабрики мне не очень понятен. Для создания проверок по имени?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2010, 23:57     Выполнение неопределенного количества методов
Еще ссылки по теме:

Множественное наследование от неопределенного числа шаблонов - C++
Есть шаблон Header принимающий в качестве аргумента число ID. Есть шаблон Node принимающий в качестве аргумента число MaxID. Вопрос - как...

Error C2079: ошибка использования неопределенного класса - C++
Вылезает ошибка использования неопределенного класса. Я знаю, что можно сделать предварительную декларацию и создать указатель на экземпляр...

Функции вычисления количества дней заданного месяца и количества месяцев между двумя датами - C++
Область first - положительное целое число , год; second - положительное целое число от 1 до 12 - номер месяца. Реализовать методы daysCount...

Наследование методов - C++
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот: Есть у нас древо классов: base &gt; s2 &gt; s3 &gt; s4 &gt; ......

Переопределение методов - C++
Как вызвать переопределенный (не перегруженный) метод из производного класса? Base* obj_1 = new Der1; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2010, 23:57  [ТС]     Выполнение неопределенного количества методов #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Вот только смысл использования фабрики мне не очень понятен.
Мне пока что тоже. Либо я что-то не понимаю в фабрике (что учитывая мои познания паттернов наиболее вероятно )
Пока что заменил простые указатели на умные. И выделил отдельный класс для предтестирования:
C++
1
2
3
4
5
6
7
8
class PrestartingInspection : public CompositeInspection
{
public:
    PrestartingInspection() {
        AddMethod(std::shared_ptr<Inspection>(new ExistInspection));
        AddMethod(std::shared_ptr<Inspection>(new ChecksumInspection));
    }
};

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Inspector мне кажется неподходящее название, по смыслу больше бы подошло CompositeInspection.
Кажется так и есть. Какое чудо, что есть средства рефакторинга

Yandex
Объявления
09.09.2010, 23:57     Выполнение неопределенного количества методов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru