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

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

Восстановить пароль Регистрация
 
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2010, 21:09     Выполнение неопределенного количества методов #1
Не знал как точнее сформулировать название темы, так что если слабо соответствует действительности, то прошу прощения

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

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

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

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++ Перегрузка методов
Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов C++
C++ Передача неопределенного числа параметров в функцию
Статический массив неопределенного размера C++
Вычислить произведение количества отрицательных и количества положительных элементов одномерного массива C++
Создание неопределенного двумерного массива из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
09.09.2010, 21:26     Выполнение неопределенного количества методов #2
Цитата Сообщение от fasked Посмотреть сообщение
Количество предварительных тестов в процессе развития самой системы соответственно увеличивается. Поэтому подсистему тестирования надо сделать как можно более гибкой и расширяемой.
как я понял есть набор тестов который может расти и какая то система которая эти тесты проводит и надо сделать так чтобы при добавлении теста ничего не приходилось менять в системе. Возможно подойдет паттерн абстрактная фабрика. каждый тест сам регистрирует себя, система перебирает все зарегистрированные тесты и что-то с ними делает. Естественно что тесты должны иметь одинаковый интерфейс.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2010, 21:31  [ТС]     Выполнение неопределенного количества методов #3
Цитата Сообщение от rrrFer Посмотреть сообщение
как я понял есть набор тестов который может расти и какая то система которая эти тесты проводит и надо сделать так чтобы при добавлении теста ничего не приходилось менять в системе.
Да-да, именно так.
Цитата Сообщение от rrrFer Посмотреть сообщение
Возможно подойдет паттерн абстрактная фабрика.
Как я понял, абстрактная фабрика позволяет управлять так называемыми семействами (наборами). То есть одно семейство тестов можно легко заменить на другое семейство. Возможно я что-то недопонял, если можно было бы показать пример...
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 21:39     Выполнение неопределенного количества методов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
1. не храните в контейнерах указатели.
2. у вас течет память.
3. повторю - абстрактная фабрика.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2010, 21:42  [ТС]     Выполнение неопределенного количества методов #5
Цитата Сообщение от niXman Посмотреть сообщение
не храните в контейнерах указатели.
Именно это мне больше всего и не нравилось.
Цитата Сообщение от niXman Посмотреть сообщение
у вас течет память.
Понадеялся на деструктор
Цитата Сообщение от niXman Посмотреть сообщение
повторю - абстрактная фабрика.
Пошел читать
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 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
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 21:54     Выполнение неопределенного количества методов #9
Цитата Сообщение от fasked Посмотреть сообщение
Потому что не нашел другого решения
boost.shared_ptr

Цитата Сообщение от fasked Посмотреть сообщение
Я же говорю деструктор
в коде в первом посту, оператора delete нет. посему и заметил.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2010, 22:01  [ТС]     Выполнение неопределенного количества методов #10
Цитата Сообщение от niXman Посмотреть сообщение
auto_ptr подойдет?
Цитата Сообщение от niXman Посмотреть сообщение
в коде в первом посту, оператора delete нет. посему и заметил.
Наверное резанул лишков, но потом поправил
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 22:06     Выполнение неопределенного количества методов #11
Цитата Сообщение от fasked Посмотреть сообщение
auto_ptr подойдет?
я уже и не помню его семантику. помоему с ним что-то не ладно, в ситуациях, когда его приходится хранить в контейнерах.
обновите компилятор, и юзайте std::shared_ptr
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.09.2010, 22:28  [ТС]     Выполнение неопределенного количества методов #12
Цитата Сообщение от niXman Посмотреть сообщение
обновите компилятор, и юзайте std::shared_ptr
Спасибо, в gcc 4.5.0 думаю они уже есть
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
09.09.2010, 22:30     Выполнение неопределенного количества методов #13
угу..
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 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++ Наследование методов
Error C2079: ошибка использования неопределенного класса C++
C++ Функции вычисления количества дней заданного месяца и количества месяцев между двумя датами
C++ Программирование НЕопределенного интеграла
C++ Ошибка использование неопределенного класса

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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     Выполнение неопределенного количества методов
Ответ Создать тему

Метки
паттерны
Опции темы

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