Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2017, 19:31   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Проектирование классов для расчета зарплаты сотрудников разных типов

В образовательных целях делаю одно из тестовых заданий, которые когда-то получал. Надо было на Qt нашлепать приложение для расчета зарплаты о сотрудниках, информация о которых хранится в базе sqlite. Сейчас я взялся за эту задачу, используя только C++ без лишних библиотек (библиотека sqlite не в счет).

Есть такая иерархия классов:

Код:
#ifndef CORE_H
#define CORE_H

#include <string>
#include <set>
#include <algorithm>
#include <memory>

// Àáñòðàêòíûé êëàññ äëÿ âñåõ ñîòðóäíèêîâ
class worker
{
public:
	worker() = default;
	worker(std::string & _name, unsigned _base_rate, unsigned _date)
		: name(_name), base_rate(_base_rate), enrollment_date(_date) {}
	virtual ~worker() = default;

	virtual double salary() const = 0;
	virtual unsigned work_experience() const = 0;

protected:
	std::string name;
	unsigned base_rate;
	unsigned enrollment_date;
	unsigned worker_id;
};

// Àáñòðàêòíûé áàçîâûé êëàññ äëÿ ñîòðóäíèêîâ, êîòîðûå ìîãóò èìåòü ïîä÷èíåííûõ
class head : public worker
{
public:
	head() = default;

protected:
	// Íàáîð ïîä÷èíåííûõ (óêàçàòåëè íà êëàññû, îïèñûâàþùèå ïðîèçâîëüíîãî ðàáîòíèêà)
	typedef std::set<std::shared_ptr<worker>> storage_type;
	storage_type subordinates;
};

// Employee íå ìîæåò èìåòü ïîä÷èíåííûõ
class employee : public worker
{
public:
	employee() = default;
	double   salary()            const override;
	unsigned work_experience()   const override;
};

class manager : public head
{
public:
	manager() = default;
	double   salary()            const override;
	unsigned work_experience()   const override;
};

class sales : public head
{
public:
	sales();
	double   salary()            const override;
	unsigned work_experience()   const override;
};

#endif
Зарплата расчитывается в зависимости от числа подчиненных у сотрудника (employee не может иметь подчиненных). Кроме того, формулы расчета зарплаты у сотрудников разных типов отличаются только тем, что у manager и sales есть прибавка за счет числа подчиненных, а это значит, что базовый алгоритм можно определить в базовом классе для всех сотрудников, а в переопределенных виртуальных методах можно вызывать виртуальный метод базового класса и добавить расчет прибавки у sales и manager.

Как мне луччше спроектировать эти классы? Где хранить информацию о сотруднике? Заносить необходимые для расчетов данные в поля класса (и тогда можно будет насоздавать много классов)? Или вместо этого реализовать много методов для получения нужной информации, и тогда для получения информации о многих сотрудниках хватит одного класса, но много раз будет вызываться соответствующий метод и будет много запросов к БД?
Aoizora вне форума Ответить с цитированием
Старый 17.06.2017, 19:36   #2
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

И еще не менее важный вопрос: при создании класса сотрудника по каким параметрам запрашивать сведения о нем из БД? По имени и фамилия, что может привести к неоднозначности выбора? По ID, и тогда этот id надо будет как-то предварительно получить?
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дерево для разных типов данных zhenya.ya Общие вопросы C/C++ 0 06.12.2010 20:29
Шаблоны. Создать отедльный конструктор копирования для типов, другой для классов TwiX Общие вопросы C/C++ 3 19.09.2010 16:29
Для решения проблемы конверсии типов из разных сред нужно крохотнуюю DLL Psionic Помощь студентам 12 10.02.2010 21:22
Програмка для отслеживания разных типов в памяни ПК. Трабл с типом BOOL eXalleR- Общие вопросы C/C++ 6 13.10.2009 15:55