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

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

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

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

05.02.2012, 07:18. Просмотров 1355. Ответов 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() {}
И где можно почитать на эту тему?
0
Вложения
Тип файла: rar cyberforum(phonebook).rar (1.7 Кб, 12 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2012, 07:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составить грамотный интерфейс и стиль программы. (ООП) (C++):

Отвечает за стиль программы - Code Blocks или mingw? - C++
Здравствуйте! Столкнулся с такой проблемой - при компиляции программ в Code Blocks с помощью mingw стиль получается как у классического...

Проектирование ООП программы - C++
Привет, начал писать большие программы, без планирования, в итоге , приходится переписывать по 100 раз, что посоветуете, как правильно...

ООП часть программы - C++
Доброго времени суток. Может кто поможет разобраться с частью программы? void Input() // ввод { double Ch; ...

Интерфейс программы - C++
можно ли написать код чтобы у программы написанной наС++ не было интерфейса?

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

Графический интерфейс программы - C++
Доброго времени суток! Я пока не фея, я только учусь, поэтому у меня возникает вопрос: что надо знать, чтобы дать программе графический...

9
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
05.02.2012, 07:22 #2
Тут такое никто не знает. Ответа не стоит ждать.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 07:27  [ТС] #3
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
05.02.2012, 08:09 #4
Цитата Сообщение от res Посмотреть сообщение
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
Я имел в виду, что на такие вопросы никто не хочет отвечать.
Сложить два массива, найти минимальный элемент в массиве - без проблем. А тут никак.
Я решил, что это пустая трата времени. Лучше взять учебник по ООП и учить самому.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.02.2012, 08:33 #5
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
1
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 08:49  [ТС] #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
На некоторых очень серьёзных проектах я видел именно такую реализацию.
Утечка памяти произойдет если я его не сконтроллирую.
Вот такая вот гибкость
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.02.2012, 09:06 #7
res, не заметил, что у вас нет виртуальных функций. Как-то привык, что наследование и полиморфизм идут рядышком. Суть в том, что если планируется использовать полиморфизм, то деструктор должен быть виртуальным. В вашем случае наследование возможно, пока вы не захотите написать виртуальную функцию. Если такого желания не возникнет, спокойно наследуйте std::list.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 09:10  [ТС] #8
Цитата Сообщение от silent_1991 Посмотреть сообщение
res, не заметил, что у вас нет виртуальных функций. Как-то привык, что наследование и полиморфизм идут рядышком. Суть в том, что если планируется использовать полиморфизм, то деструктор должен быть виртуальным. В вашем случае наследование возможно, пока вы не захотите написать виртуальную функцию. Если такого желания не возникнет, спокойно наследуйте std::list.
ну я забыл написать комментарий
C++
1
// is not inherited
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.02.2012, 09:12 #9
res, точнее будет даже так: если не хотите использовать динамическое выделение памяти совместно с указателями на базовые классы (std::list<Member *> *plst = new MemberList; /* ... */ delete plst; ) - можно наследовать класс без виртуального деструктора.
0
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 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.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 09:40
Привет! Вот еще темы с ответами:

Интерфейс для программы - C++
Как сделать интерфейс для программы?

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

Составить программу имитирующую пользовательский интерфейс - C++
Составить программу имитирующую пользовательский интерфейс с использованием меню, переключателей и радио кнопок.

Написать интерфейс программы путешествий - C++
Доброе время суток! Задали задачу , в которой пользователь дожен указать количество путешествий и каждому путешествию назначить свой номер,...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
05.02.2012, 09:40
Ответ Создать тему
Опции темы

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