Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инкапсуляция класса. Велосипед.

87
27 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Замучился перекомпилировать проекты при внесении изменений в хедеры классов. Почитал Страуструпа - он рекомендует активнее использовать абстрактные классы, как интерфейсы, и давай схемы чертить. В общем понятного примера не нашел.

Стал изобретать свой велосипед, чтоб как-то разбраться. Хочу спросить у опытных программистов, насколько кривой он вышел и в какую сторону исправлять.

Базовый класс - интерфейс
Код:
// BaseClass.h
#include <iostream>

class BaseClass
{
public:
    virtual void Set(int numb) = 0;
    virtual int Get() = 0;
    static BaseClass* MakeChild();
    virtual ~BaseClass(){std::cout << "Base Object Deleted" << std::endl;}
};

Код:
// BaseClass.cpp
#include <iostream>
#include "BaseClass.h"

// ChildClass может быть во включенном хедере
class ChildClass: public BaseClass
{
    int v;
    int Transform(int i){return i*2;}
public:
    void Set(int numb){v = Transform(numb); }
    int Get(){return v;}
    ~ChildClass(){ std::cout << "Child Object Deleted" << std::endl;}
};

// В исполнимом файле BaseClass эта функция необходима
BaseClass* BaseClass::MakeChild()
{
    return new ChildClass;
}

Применение
Код:
// main.cpp
#include <memory>
#include <iostream>

#include "BaseClass.h"
// тут не виден ChildClass

int main()
{
    std::auto_ptr<BaseClass> p(BaseClass::MakeChild());
    p->Set(5);
    std::cout << p->Get() << std::endl;

    // рисковый трюк, но можно сделать проверку
    std::auto_ptr<BaseClass> *p2 = &p;
    //p.reset(); // для испытания проверки
    if(p2->get()) std::cout << (*p2)->Get() << std::endl;

    return 0;
}

Заодно и auto_ptr помучал. Можно его так использовать или по варварски к нему я отнесся?
87
28 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Ладно, пока поизвращаюсь над этой моделью еще. Базового интерфейса тоже много для большинства пользователей - выделю часть из него.

Код:
// GetClass.h
#ifndef KS_GETCLASS
#define KS_GETCLASS
#include <iostream>

class GetClass
{
public:
    virtual int Get() = 0;
};

#endif

 
Код:
// BaseClass.h
#include "GetClass.h"

class BaseClass: public GetClass
{
public:
    virtual void Set(int numb) = 0;
    static BaseClass* MakeChild();
    virtual ~BaseClass(){std::cout << "Base Object Deleted" << std::endl;}
};


Код:
// TestModuleGet
#include "GetClass.h"
// Тут даже BaseClass не виден

void test(GetClass *gc)
{
    if(gc)
        std::cout << gc->Get() << std::endl;
    else
        std::cout << 0 << std::endl;
}


Код:
// BaseClass.cpp
#include "BaseClass.h"

// ChildClass может быть во включенном хедере
class ChildClass: public BaseClass
{
    int v;
    int Transform(int i){return i*2;}
public:
    void Set(int numb){v = Transform(numb); }
    int Get(){return v;}
    ~ChildClass(){ std::cout << "Child Object Deleted" << std::endl;}
};

// В исполнимом файле BaseClass эта функция необходима
BaseClass* BaseClass::MakeChild()
{
    return new ChildClass;
}

Код:
#include <memory>
#include <iostream>

#include "BaseClass.h"
#include "TestModuleGet.h"
// тут не виден ChildClass

int main()
{
    std::auto_ptr<BaseClass> p(BaseClass::MakeChild());
    p->Set(5);
    std::cout << p->Get() << std::endl;

    // рисковый трюк, но можно сделать проверку
    std::auto_ptr<BaseClass> *p2 = &p;
    //p.reset(); // для испытания проверки
    if(p2->get()) std::cout << (*p2)->Get() << std::endl;
    //p.reset(); // для испытания проверки
    test(p2->get());

    return 0;
}


Хотя основная идея уже в первой версии получилась. Тут почти ничего нового.
505
28 декабря 2008 года
vAC
343 / / 28.02.2006
Я бы посоветовал не заниматься абстрагированием абстрактных задач, а попробовать решить тестовую, но приближенную к "боевой".
Вот например здесь разобрана очень простая задачка:
http://www.javenue.info/post/48, правда на Java, но это не имеет большого значения для проектирования.
Не обойтись и без паттернов (http://ooad.asf.ru/Patterns.aspx).
Если найдете интересную задачу, то (надеюсь) заинтересуете других участников форума.
87
28 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: vAC
Я бы посоветовал не заниматься абстрагированием абстрактных задач, а попробовать решить тестовую, но приближенную к "боевой".
Вот например здесь разобрана очень простая задачка:
http://www.javenue.info/post/48, правда на Java, но это не имеет большого значения для проектирования.
Не обойтись и без паттернов (http://ooad.asf.ru/Patterns.aspx).
Если найдете интересную задачу, то (надеюсь) заинтересуете других участников форума.


За ссылки спасибо. Особенно за первую (по второй у меня книга есть, до понимания которой я не дорос).

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

Умные люди давно мне советуют изучать паттерны. Однако пока я в книге банды четырех ничего не понял. Наверно, пока для меня их советы и есть "абстрагирование абстрактной задачи" - потому и не лезет в голову.

Я не студент (ВУЗ закончил сравнительно давно). Я никогда не работал на кафедрах в ВУЗах. Работаю на производстве. Но программированием занялся недавно.

505
28 декабря 2008 года
vAC
343 / / 28.02.2006
Цитата: Kogrom
У меня есть реальный проект - программа, которая регистрирует данные от измерительного устройства (измеряет давление и температуру), выводит эти данные на экран, записывает в файл.


Это же замечательно!
Тогда очень советую заглянуть в книжку:
Гради Буч. Объектно-ориентированный анализ и проектирование.

В главе 8 разобран пример проектирования системы сбора данных: метеорологическая станция - очень близко к вашей теме. Ключевые абстракции будут практически теми же.

1
28 декабря 2008 года
kot_
7.3K / / 20.01.2000
Я честно говоря не вижу - че тут замечаетльного. Во первх предполагается что чем тупее тем лучшее. Рекомендую читать книгу Буча до посинения. Или все же по пытаться - и сделать нормальную программу. Тупизм != профи
87
28 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: vAC
Тогда очень советую заглянуть в книжку:
Гради Буч. Объектно-ориентированный анализ и проектирование.


Спасибо. Надеюсь, что это будет ступень, на которую я смогу забраться.

1
28 декабря 2008 года
kot_
7.3K / / 20.01.2000
сам по себе буч - он очень четко оговаривает возможности своего метода. Те кто читает не внимательно - они суют свое понимание куда за благорассудится. Это vAC`у. Не всегда аналог = объекту.
87
28 декабря 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: kot_
Я честно говоря не вижу - че тут замечаетльного. Во первх предполагается что чем тупее тем лучшее. Рекомендую читать книгу Буча до посинения. Или все же по пытаться - и сделать нормальную программу. Тупизм != профи


Бесы одолевают? Судя по опечаткам - одолевают :)

Но, вроде бы, человек уважаемый. Буду думать, что я просто еще не дорос до понимания глубины мыслей Кота_. Вот дорасту - тогда сделаю ему его базу данных с испольованием STL и т.п... подождите годик-другой.

505
28 декабря 2008 года
vAC
343 / / 28.02.2006
Цитата: kot_
Не всегда аналог = объекту.


Почему равенство? Раскройте тайный смысл...

1
28 декабря 2008 года
kot_
7.3K / / 20.01.2000
Цитата: vAC
Почему равенство? Раскройте тайный смысл...


вы фразы целиком читаете? или только те буквы которые вам известны?
2Kogrom
нет. только тупиздни. к счастью.

505
28 декабря 2008 года
vAC
343 / / 28.02.2006
Цитата: kot_
вы фразы целиком читаете? или только те буквы которые вам известны?


Целиком и полностью, а вот вы, по-моему, не читаете их вовсе. Я использовал такие слова, как: пример, близко, практически. Поэтому мне не понятно ваше высказывание. Так что повторю вопрос:

Цитата:

Почему равенство? Раскройте тайный смысл...

87
06 января 2009 года
Kogrom
2.7K / / 02.02.2008
Изучаю теорию. Оказывается, я "изобрел" фабричный метод (Factory Method). Точнее, вычислил по намекам разных авторов.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог