Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать внешний объект 
V
    Опции темы
 
Как передать внешний объект
Принимать в одном из аргументов конструктора класса [ 6 ]  [100.00%]
Принимать в доп. методе класса setExternalObject() [ 0 ]  [0.00%]
Всего проголосовавших: 6
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
EvilsInterrupt
Дата 5.6.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Разверну суть опроса чуть подробней. Есть две ситуации:

1)
Код

std::ifstream file( "sample.bin" );
CustomFormat reader( file );


2)
Код

std::ifstream file( "sample.bin" );
CustomFormat reader;
reader.setStream( file );


Какую чаще применяете?
PM MAIL WWW ICQ Jabber   Вверх
boostcoder
Дата 5.6.2012, 22:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



второй пример лишний, если не предполагается переназначать поток вывода.

PM WWW   Вверх
EvilsInterrupt
Дата 5.6.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



boostcoder, Со вчерашнего вечера мне в джаббер за этот "лишний" высказалось уже 5 человек! ;)
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 5.6.2012, 22:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  5.6.2012,  21:34 Найти цитируемый пост)
, Со вчерашнего вечера мне в джаббер за этот "лишний"


Цитата(boostcoder @  5.6.2012,  21:32 Найти цитируемый пост)
если не предполагается переназначать поток вывода.




--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 5.6.2012, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Ок, здраво. 
Я всегда был стороником первого метода и старался избегать ситуаций с переназначением, но когда вчера
попытался написать свой первый unit-тест с помощью boost::test мне стало не удобно тестировать. Именно
поэтому возникла мысль в голове "А прав ли я что всегда принимаю на внешний объект в конструкторе?".

Вод кусок кода:
Код

BOOST_AUTO_TEST_SUITE( FileImageSuite )

const char* IncompleteFileHeader = "IncompleteFileHeader.bin";

struct IncompleteFileHeaderFixture
{
    IncompleteFileHeaderFixture()
    {
        using namespace std;

        int mode = ios::in | ios::ate | ios::binary;
        file.open(IncompleteFileHeader,mode);
//        fileImg.setImageStream(file);
    }
    ~IncompleteFileHeaderFixture()
    {
        file.close();
        std::remove(IncompleteFileHeader);
    }
    std::fstream    file;
//    FileImage   fileImg;
};

BOOST_FIXTURE_TEST_CASE( testIncompleteFileHeader, IncompleteFileHeaderFixture )
{

}

BOOST_AUTO_TEST_SUITE_END()


Сложность заключена в следующем:
В результате конструирования объекта FileImage возникла ошибка и брошено std::runtime. Как лучше тестировать это?

У меня пока нет четкого понимания как тестировать подобные случаи без усложнения тест-кейсов.
PM MAIL WWW ICQ Jabber   Вверх
borisbn
Дата 6.6.2012, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



А почему "В этом опросе возможен один вариант ответа" ?
Это, конечно, не догма, но в Qt (а его не балбесы разрабатывали) почти везде предоставляют обе возможности.
Цитата
QFile ( const QString & name )
void    setFileName ( const QString & name )

Цитата
QRegExp ( const QString & pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, PatternSyntax syntax = RegExp )
void    setPattern ( const QString & pattern )
void    setPatternSyntax ( PatternSyntax syntax )

Цитата
QUrl ( const QString & url )
void    setUrl ( const QString & url )

и это, на самом деле, очень удобно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Amp
Дата 6.6.2012, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



Класс без конструктора по-умолчанию становится местами проблематично использовать.
PM MAIL   Вверх
EvilsInterrupt
Дата 6.6.2012, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Amp, Судя по всему из-за этого тестировать не особо и удобно )

То что сейчас:

Код

typedef boost::shared_ptr<std::iostream>  InOutStreamPtr;

struct IncompleteFileHeaderFixture
{
    IncompleteFileHeaderFixture()
        : filename( string(FILE_TEST_SAMPLES_DIR) + string("IncompleteFileHeader.bin") )
        , filePtr( new fstream( filename.c_str(), ios::in | ios::ate | ios::binary ) )
        , fileImg( filePtr )
    {
    }
    ~IncompleteFileHeaderFixture()
    {
        std::remove( filename.c_str() );
    }
    std::string         filename;
    InOutStreamPtr  filePtr;
    FileImage       fileImg;
};

BOOST_FIXTURE_TEST_CASE( testIncompleteFileHeader, IncompleteFileHeaderFixture )
{
    BOOST_CHECK_THROW( fileImg.read(), FormatError );
}


Выглядит не особо удобно и не особо красиво. Я завишу от порядка:
Код

    std::string         filename;
    InOutStreamPtr  filePtr;
    FileImage       fileImg;


Это сообщение отредактировал(а) EvilsInterrupt - 6.6.2012, 09:02
PM MAIL WWW ICQ Jabber   Вверх
bsa
Дата 6.6.2012, 11:19 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



EvilsInterrupt, делай оба варианта.
PM   Вверх
EvilsInterrupt
Дата 10.6.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Цитата

делай оба варианта. 


Пишу уже 5-й юнит-тест и понимаю, что оба варианта это выигрышная стратегия. Первый вариант удобно юзать, когда код уже написан, а вот второй удобен при написании unit-тестов. По крайней мере пользуясь boost::test именно к этому пришел.

Вопрос исчерпан, спасибо!
PM MAIL WWW ICQ Jabber   Вверх
Randajad
Дата 10.6.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Почему зависишь? Кто-то мешает написать код в конструкторе, а не делать все при инициализации?
PM MAIL   Вверх
EvilsInterrupt
Дата 10.6.2012, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Randajad
Приведу пример текущего куска кода из своих юнит-тестов, где будет видна эта зависимость.

Код

struct Correct32Fixture
{
    Correct32Fixture()
        : outputfile( string(OUTPUT_FILES_DIR) + string("Correct32.bin") )
    {
        string sourcefile( string(TEST_SAMPLES_DIR) + string("Correct32.bin") );

        std::remove( outputfile.c_str() );
        copy_file( path(sourcefile), path(outputfile) );

        fileRaw =  new fstream( outputfile.c_str(), ios::in | ios::out | ios::ate | ios::binary );
        filePtr = InOutStreamPtr( fileRaw );
        templateImg.setStream( filePtr );
        templateImg.read();
    }
    ~Correct32Fixture()
    {
        if(fileRaw->is_open() )
        {
            fileRaw->close();
        }
        std::remove( outputfile.c_str() );
    }
    string          outputfile;
    fstream*        fileRaw;
    InOutStreamPtr  filePtr; // InOutStreamPtr это boost::shared_ptr<std::iostream>
    CustomImage32   templateImg;
};


BOOST_FIXTURE_TEST_CASE( testSuperHeaderChanghing, Correct32Fixture )
{
    BOOST_REQUIRE( templateImg.SuperHeader().boundary_field1 == 0x90 );
    BOOST_REQUIRE( templateImg.SuperHeader().boundary_field2[9] == 0 );

    // Arrange
    templateImg.SuperHeader().boundary_field1 = 0xE9;
    templateImg.SuperHeader().boundary_field2[9] = 0xE8E9;
    templateImg.write();

    // Act
    fileRaw->close();
    fstream* fileRaw2 = new fstream( outputfile.c_str(), ios::in | ios::ate | ios::binary );
    InOutStreamPtr filePtr2( fileRaw2 );
    CustomImage32 checkImg( filePtr2 );

    //Assert
    BOOST_CHECK( checkImg.SuperHeader().boundary_field = 0xE9 );
    BOOST_CHECK( checkImg.SuperHeader().boundary_field[9] = 0xE8E9 );
}


Цель этого тест-кейса проста: проверить что класс CustomImage32 умеет корректно записывать измененные значение в хидере.
Для этого я копирую эталонный файл, потом эту копию открываю по чтению\записи, далее присваиваю новые значения в его хидер, сохраняю и через новые объекты читаю эти записанные значения. Ожидаю что записываемое равно прочитанному.

Добавлено через 2 минуты и 41 секунду
Кстати, если есть Enhancement-предложения по моему коду буду очень рад )
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2887 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.