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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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,133
05.02.2012, 08:09     Составить грамотный интерфейс и стиль программы. (ООП) #4
Цитата Сообщение от res Посмотреть сообщение
Chelioss, почему же, я тут много кого встречал, которые известны по OpenSource проектам.
Я имел в виду, что на такие вопросы никто не хочет отвечать.
Сложить два массива, найти минимальный элемент в массиве - без проблем. А тут никак.
Я решил, что это пустая трата времени. Лучше взять учебник по ООП и учить самому.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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++
Добрый вечер! Проблема в следующем: Компилятор visual studio 2010. есть программа, в которой создан 1 класс (данные о пользователях) ...

Как изменить интерфейс программы? - C++
Я новичок в С++, и мне не нравится, что окно котрое открывается после запуска программы, чёрное! Как изменить дизайн, интерфейс программы?


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

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

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