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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
05.02.2012, 07:18     Составить грамотный интерфейс и стиль программы. (ООП) #1
Всем доброго времени суток.
На этом форуме есть люди, которые разрабатывали крупные проекты.
Мне нужны советы по грамотному составлению программы.

Специально для примера придумал простую маленькую программу: "Телефонная книга".
Пользовательским интерфейсом будет консоль и библиотека 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 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2012, 07:18     Составить грамотный интерфейс и стиль программы. (ООП)
Посмотрите здесь:

Интерфейс программы C++
Две Программы по С++ по ООП - не получается сделать C++
C++ Разделение программы на интерфейс и реализацию
C++ ООП часть программы
Графический интерфейс программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
4938 / 3014 / 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++
4938 / 3014 / 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++
4938 / 3014 / 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++ Как изменить интерфейс программы?

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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     Составить грамотный интерфейс и стиль программы. (ООП)
Ответ Создать тему
Опции темы

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