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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
#1

Составить грамотный интерфейс и стиль программы. (ООП) - C++

05.02.2012, 07:18. Просмотров 1253. Ответов 9
Метки нет (Все метки)

Всем доброго времени суток.
На этом форуме есть люди, которые разрабатывали крупные проекты.
Мне нужны советы по грамотному составлению программы.

Специально для примера придумал простую маленькую программу: "Телефонная книга".
Пользовательским интерфейсом будет консоль и библиотека conio.h. В качестве базы данных используется текстовый файл.
У меня получился вот такой интерфейс:

MemberList.h
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
33
34
35
36
#include <string>
#include <list>
 
enum eNameTypes { NT_LNAME, NT_FNAME, NT_MNAME };
 
struct Member
{
    std::string lname; // фамилия
    std::string fname; // имя 
    std::string mname; // отчество
    std::string phoneNumber; // телефонный номер
};
 
class MemberList : public std::list <Member*>
{
public:
    // поиск члена
    Member* GetBy(eNameTypes nameType, std::string xName);
    bool Replace(Member* pOldMember, Member* pNewMember);
 
    // импорт данных из базы
    bool ImportFromDB();
    // экспорт данных в базу
    bool ExportToDB();
};
 
// методы сортировки. Статические члены, для метода доступа без создания экземпляра. 
struct MemberOrderPredicate 
{
    // функтор, сортирует по ФИО
    bool operator() (const Member *first, const Member *second);
 
    static bool ByLName(const Member* first, const Member *second);
    static bool ByFName(const Member* first, const Member *second);
    static bool ByMName(const Member* first, const Member *second);
};
Menu.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// #include <conio.h> включить в .cpp
// #include <iostream> включить в .cpp
#include "MemberList.h"
class Menu
{
public:
    // главное меню
    void MainMenu();
 
    void FindMember();
    void CreateMemer();
    void ShowAllMembers();
private:
    MemberList* pMemberList;
};
Но у меня остались лишние типы, которые не имеют отношения, но нужны для работы с Menu и MemberList
Работа со строками:
C++
1
2
3
4
5
6
7
8
9
10
struct НезнаюКакНазвать
{
    // функция для стандартизаций строки 
    void NormalizeString(std::string& str);
    // сравнивание строк без учёта регистра
    bool CompareString(std::string firstStr, std::string secondStr) ;
    // проверка строки на буквы в алфавите
    bool IsInABC(std::string str);
    ...
};
Его включать или создавать экземпляр? Или?

Версия программы:
C++
1
2
3
4
5
6
7
8
struct Version
{
    // номер ревизий программы
    std::string GetRevisionNumber();
    // хеш ревизий программы
    std::string GetRevisionHash();
    ...
};
Включать или как синглтон? Или?

Лог ошибок в файл:
C++
1
2
3
4
5
6
struct LogFile
{
    bool SetErrorLevel(int levelId);
    bool GetErrorLevel();
    void OutError(std::string str);
};
Как синглтон или включать? Или?

Стоить ли использовать namespace? И в каких целях?
И нужно ли создавать базовый класс? И какие объекты там должны быть?
C++
1
2
3
4
class Phonebook
{
    // ?
};


Вообщем вопрос, как всё это правильно составить?
До самого:
C++
1
int main() {}
И где можно почитать на эту тему?
Вложения
Тип файла: rar cyberforum(phonebook).rar (1.7 Кб, 12 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
05.02.2012, 07:22     Составить грамотный интерфейс и стиль программы. (ООП) #2
Тут такое никто не знает. Ответа не стоит ждать.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 07:27  [ТС]     Составить грамотный интерфейс и стиль программы. (ООП) #3
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
05.02.2012, 08:09     Составить грамотный интерфейс и стиль программы. (ООП) #4
Цитата Сообщение от res Посмотреть сообщение
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
Я имел в виду, что на такие вопросы никто не хочет отвечать.
Сложить два массива, найти минимальный элемент в массиве - без проблем. А тут никак.
Я решил, что это пустая трата времени. Лучше взять учебник по ООП и учить самому.
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
05.02.2012, 08:33     Составить грамотный интерфейс и стиль программы. (ООП) #5
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 08:49  [ТС]     Составить грамотный интерфейс и стиль программы. (ООП) #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
На некоторых очень серьёзных проектах я видел именно такую реализацию.
Утечка памяти произойдет если я его не сконтроллирую.
Вот такая вот гибкость
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
05.02.2012, 09:06     Составить грамотный интерфейс и стиль программы. (ООП) #7
res, не заметил, что у вас нет виртуальных функций. Как-то привык, что наследование и полиморфизм идут рядышком. Суть в том, что если планируется использовать полиморфизм, то деструктор должен быть виртуальным. В вашем случае наследование возможно, пока вы не захотите написать виртуальную функцию. Если такого желания не возникнет, спокойно наследуйте std::list.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 09:10  [ТС]     Составить грамотный интерфейс и стиль программы. (ООП) #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
res, не заметил, что у вас нет виртуальных функций. Как-то привык, что наследование и полиморфизм идут рядышком. Суть в том, что если планируется использовать полиморфизм, то деструктор должен быть виртуальным. В вашем случае наследование возможно, пока вы не захотите написать виртуальную функцию. Если такого желания не возникнет, спокойно наследуйте std::list.
ну я забыл написать комментарий
C++
1
// is not inherited
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
05.02.2012, 09:12     Составить грамотный интерфейс и стиль программы. (ООП) #9
res, точнее будет даже так: если не хотите использовать динамическое выделение памяти совместно с указателями на базовые классы (std::list<Member *> *plst = new MemberList; /* ... */ delete plst; ) - можно наследовать класс без виртуального деструктора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 09:40     Составить грамотный интерфейс и стиль программы. (ООП)
Еще ссылки по теме:

C++ Интерфейс для программы
C++ Интерфейс для программы
C++ Как изменить интерфейс программы?
C++ Написать интерфейс программы путешествий
Проектирование ООП программы C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
05.02.2012, 09:40     Составить грамотный интерфейс и стиль программы. (ООП) #10
Класс MemberList - это класс для хранения и работы со списком членов, он ни чего не знает о БД. Поэтому эти строки
C++
1
2
3
4
    // импорт данных из базы
    bool ImportFromDB();
    // экспорт данных в базу
    bool ExportToDB();
я бы убрал и сделал в отдельном файле примерно такой класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class DataBase {
    DataBase(){};
    DataBase(const DataBase&){};
    DataBase operator = (const DataBase&){};
    static DataBase *db;
   //добавить еще членов по необходимости
public:
    static DataBase* GetDb()
    {
        if (db == NULL) {
            db = new DataBase;
        }
        return db;
    }
 
    MemberList ReadDb(){};
    bool WriteDb(const MemberList&){};
};
 
DataBase* DataBase::db = NULL;
ну т.е. понятно, что это синглтон. Потом, где нужно, просто вызываешь GetDb() и пишешь/читаешь из/в БД

Добавлено через 4 минуты
Но у меня остались лишние типы, которые не имеют отношения, но нужны для работы с Menu и MemberList
Честно говоря, я еще тот ОО архитектор , но вот это
C++
1
2
3
4
5
6
7
8
9
10
struct НезнаюКакНазвать
{
    // функция для стандартизаций строки 
    void NormalizeString(std::string& str);
    // сравнивание строк без учёта регистра
    bool CompareString(std::string firstStr, std::string secondStr) ;
    // проверка строки на буквы в алфавите
    bool IsInABC(std::string str);
    ...
};
я бы вынес в отдельный файл, который назвал бы к примеру string_utils.cpp, и сделал бы эти функции просто в виде функций, т.е. не членов какого-либо класса.

Добавлено через 1 минуту

Не по теме:

У кого-нибудь еще пару минут назад поменялся шрифт на форуме или у меня Опера глючит?



Добавлено через 9 минут
еще вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "MemberList.h"
class Menu
{
public:
    // главное меню
    void MainMenu();
 
    void FindMember();
    void CreateMemer();
    void ShowAllMembers();
private:
    MemberList* pMemberList;
};
непонятно, что в классе Menu делает указатель на MemberList? В Menu должно быть только то, что касается меню ( я так понимаю, что это меню, которое будет выведено на экран, с пунктами "добавить", "удалить" и т.д.) Поэтому этот момент нужно пересмотреть.
FindMember(), CreateMemer() и ShowAllMembers() я бы переложил на плечи класса MemberList.
Yandex
Объявления
05.02.2012, 09:40     Составить грамотный интерфейс и стиль программы. (ООП)
Ответ Создать тему
Опции темы

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