Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
res
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
#1

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

05.02.2012, 07:18. Просмотров 1475. Ответов 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
Ответы с готовыми решениями:

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

ООП часть программы
Доброго времени суток. Может кто поможет разобраться с частью программы? ...

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

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

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

9
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
05.02.2012, 07:22 #2
Тут такое никто не знает. Ответа не стоит ждать.
0
res
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 07:27  [ТС] #3
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
05.02.2012, 08:09 #4
Цитата Сообщение от res Посмотреть сообщение
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
Я имел в виду, что на такие вопросы никто не хочет отвечать.
Сложить два массива, найти минимальный элемент в массиве - без проблем. А тут никак.
Я решил, что это пустая трата времени. Лучше взять учебник по ООП и учить самому.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
05.02.2012, 08:33 #5
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
1
res
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 08:49  [ТС] #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
res, MemberList.h : 15 : Нельзя наследовать от std::list. У него нет виртуального деструктора, так что могут возникнуть проблемы в виде утечек памяти, незакрытых файлов и т.д.
На некоторых очень серьёзных проектах я видел именно такую реализацию.
Утечка памяти произойдет если я его не сконтроллирую.
Вот такая вот гибкость
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
05.02.2012, 09:06 #7
res, не заметил, что у вас нет виртуальных функций. Как-то привык, что наследование и полиморфизм идут рядышком. Суть в том, что если планируется использовать полиморфизм, то деструктор должен быть виртуальным. В вашем случае наследование возможно, пока вы не захотите написать виртуальную функцию. Если такого желания не возникнет, спокойно наследуйте std::list.
0
res
85 / 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
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
05.02.2012, 09:12 #9
res, точнее будет даже так: если не хотите использовать динамическое выделение памяти совместно с указателями на базовые классы (std::list<Member *> *plst = new MemberList; /* ... */ delete plst; ) - можно наследовать класс без виртуального деструктора.
0
Kastaneda
Jesus loves me
Эксперт С++
4763 / 2966 / 342
Регистрация: 12.12.2009
Сообщений: 7,531
Записей в блоге: 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
05.02.2012, 09:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 09:40

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

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

Составить программу имитирующую пользовательский интерфейс
Составить программу имитирующую пользовательский интерфейс с использованием...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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