Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

Код:

#ifndef CORE_H
#define CORE_H

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

// &#192;&#225;&#241;&#242;&#240;&#224;&#234;&#242;&#237;&#251;&#233; &#234;&#235;&#224;&#241;&#241; &#228;&#235;&#255; &#226;&#241;&#229;&#245; &#241;&#238;&#242;&#240;&#243;&#228;&#237;&#232;&#234;&#238;&#226;
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;
};

// &#192;&#225;&#241;&#242;&#240;&#224;&#234;&#242;&#237;&#251;&#233; &#225;&#224;&#231;&#238;&#226;&#251;&#233; &#234;&#235;&#224;&#241;&#241; &#228;&#235;&#255; &#241;&#238;&#242;&#240;&#243;&#228;&#237;&#232;&#234;&#238;&#226;, &#234;&#238;&#242;&#238;&#240;&#251;&#229; &#236;&#238;&#227;&#243;&#242; &#232;&#236;&#229;&#242;&#252; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#251;&#245;
class head : public worker
{
public:
	head() = default;

protected:
	// &#205;&#224;&#225;&#238;&#240; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#251;&#245; (&#243;&#234;&#224;&#231;&#224;&#242;&#229;&#235;&#232; &#237;&#224; &#234;&#235;&#224;&#241;&#241;&#251;, &#238;&#239;&#232;&#241;&#251;&#226;&#224;&#254;&#249;&#232;&#229; &#239;&#240;&#238;&#232;&#231;&#226;&#238;&#235;&#252;&#237;&#238;&#227;&#238; &#240;&#224;&#225;&#238;&#242;&#237;&#232;&#234;&#224;)
	typedef std::set<std::shared_ptr<worker>> storage_type;
	storage_type subordinates;
};

// Employee &#237;&#229; &#236;&#238;&#230;&#229;&#242; &#232;&#236;&#229;&#242;&#252; &#239;&#238;&#228;&#247;&#232;&#237;&#229;&#237;&#237;&#251;&#245;
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, 20:36   #2
Aoizora
Форумчанин
 
Аватар для Aoizora
 
Регистрация: 11.11.2016
Сообщений: 235
Репутация: 107
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




06:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru