Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Пример простейшей объектной модели





Ниже приведена UML-диаграмма простейшей объектной модели, предназначенной для хранения данных о заказах товаров в магазине.

Созданные классы имеют следующие обязанности:

1. Класс Shop – представляет собой информацию о магазине, существенную для данного примера. Этот класс будет создаваться только в одном экземпляре за время выполнения программы.

2. Класс Order – представляет заказ в магазине, имеет уникальный идентификатор, время регистрации. Имеется ярко выраженная операция вычисления стоимости.

3. Класс Item – представляет строку заказа: товар, количество штук, цену на момент заказа.

4. Класс Product – представляет собой описание товара, включая уникальный номер, название, описание, код страны происхождения, а также текущую стоимость.

5. Класс Money – тип-значение, представляющий денежную единицу с целой частью и копейками.

Ниже приведена упрощенная реализация данной модели на языке С++.

money.hpp

#ifndef _MONEY_HPP_

#define _MONEY_HPP_

 

//-----------------------------------------------------------------------------

 

#include <string>

 

//-----------------------------------------------------------------------------

 

 

class Money

{

 

//-------------------------

 

public:

 

//-------------------------

 

Money ();

 

Money (unsigned int _integralPart, unsigned char _fractionalPart);

 

static Money fromString (const std::string & _moneyAsText);

 

//-------------------------

 

std::string toString () const;

 

bool operator == (const Money & _m) const;

 

Money operator + (Money const & _m) const;

 

Money operator * (unsigned int _n) const;

 

//-------------------------

 

private:

 

//-------------------------

 

unsigned int m_integralPart;

 

unsigned char m_fractionalPart;

 

//-------------------------

 

};

 

 

//-----------------------------------------------------------------------------

 

#endif // _MONEY_HPP_

money.cpp

//-----------------------------------------------------------------------------

 

#include "money.hpp"

 

#include <boost/lexical_cast.hpp>

 

//-----------------------------------------------------------------------------

 

 

Money::Money ()

: m_integralPart(0),

m_fractionalPart(0)

{

}

 

 

//-----------------------------------------------------------------------------

 

 

Money::Money (unsigned int _integralPart, unsigned char _fractionalPart)

: m_integralPart(_integralPart),

m_fractionalPart(_fractionalPart)

{

}

 

 

//-----------------------------------------------------------------------------

 

 

Money

Money::fromString (const std::string & _moneyAsText)

{

double money = boost::lexical_cast< double >(_moneyAsText);

if (money < 0.)

throw std::exception();

 

unsigned int integralPart = static_cast< unsigned int >(money);

unsigned char fractionalPart = static_cast< unsigned char >(

(money - integralPart) * 100.0

);

return Money(integralPart, fractionalPart);

}

 

 

//-----------------------------------------------------------------------------

 

 

std::string

Money::toString () const

{

char buf[ 100 ];

sprintf(buf, "%d.%02d", m_integralPart, m_fractionalPart);

return buf;

}

 

 

//-----------------------------------------------------------------------------

 

 

bool

Money::operator == (const Money & _m) const

{

return m_integralPart == _m.m_integralPart &&

m_fractionalPart == _m.m_fractionalPart;

}

 

 

//-----------------------------------------------------------------------------

 

 

Money

Money::operator + (Money const & _m) const

{

unsigned int resultIngeralPart = m_integralPart + _m.m_integralPart;

 

unsigned char resultFractionalPart = m_fractionalPart + _m.m_fractionalPart;

if (resultFractionalPart >= 100)

{

++resultIngeralPart;

resultFractionalPart %= 100;

}

 

return Money(resultIngeralPart, resultFractionalPart);

}

 

 

//-----------------------------------------------------------------------------

 

 

Money

Money::operator * (unsigned int _n) const

{

unsigned int moneyInCents = m_integralPart * 100 + m_fractionalPart;

moneyInCents *= _n;

return Money(moneyInCents / 100, moneyInCents % 100);

}

 

 

//-----------------------------------------------------------------------------

 

 

product.hpp

#ifndef _PRODUCT_HPP_

#define _PRODUCT_HPP_

 

//-----------------------------------------------------------------------------

 

#include "money.hpp"

 

#include <string>

 

//-----------------------------------------------------------------------------

 

 

class Product

{

 

//-------------------------

 

public:

 

//-------------------------

 

Product (

unsigned int _uniqueID,

const std::string & _name,

const std::string & _description,

const Money & _initialPrice

);

 

//-------------------------

 

unsigned int getUniqueID () const;

 

const std::string & getName () const;

 

const std::string & getDescription () const;

 

const Money & getCurrentPrice () const;

 

void setPrice (const Money & _newPrice);

 

//-------------------------

 

private:

 

//-------------------------

 

const unsigned int m_uniqueID;

 

const std::string m_name;

 

const std::string m_description;

 

Money m_currentPrice;

 

//-------------------------

 

};

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Product::getUniqueID () const

{

return m_uniqueID;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

const std::string &

Product::getName () const

{

return m_name;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

const std::string &

Product::getDescription () const

{

return m_description;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

const Money &

Product::getCurrentPrice () const

{

return m_currentPrice;

}

 

//-----------------------------------------------------------------------------

 

 

inline

void

Product::setPrice (const Money & _newPrice)

{

m_currentPrice = _newPrice;

}

 

 

//-----------------------------------------------------------------------------

 

#endif // _PRODUCT_HPP_

product.cpp

//-----------------------------------------------------------------------------

 

#include "product.hpp"

 

//-----------------------------------------------------------------------------

 

 

Product::Product (

unsigned int _uniqueID,

const std::string & _name,

const std::string & _description,

const Money & _initialPrice

)

: m_uniqueID(_uniqueID),

m_name(_name),

m_description(_description),

m_currentPrice(_initialPrice)

{

}

 

 

//-----------------------------------------------------------------------------

item.hpp

#ifndef _ITEM_HPP_

#define _ITEM_HPP_

 

//-----------------------------------------------------------------------------

 

#include "money.hpp"

 

//-----------------------------------------------------------------------------

 

class Product;

 

//-----------------------------------------------------------------------------

 

 

class Item

{

 

//-------------------------

 

public:

 

//-------------------------

 

Item (Product const & _product, unsigned int _quantity);

 

//-------------------------

 

Product const & getProduct () const;

 

unsigned int getQuantity () const;

 

void setQuantity (unsigned int _newQuantity);

 

Money getPrice () const;

 

Money getCost () const;

 

//-------------------------

 

private:

 

//-------------------------

 

Product const & m_product;

 

unsigned int m_quantity;

 

Money const m_price;

 

//-------------------------

 

};

 

 

//-----------------------------------------------------------------------------

 

 

inline

Product const &

Item::getProduct () const

{

return m_product;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Item::getQuantity () const

{

return m_quantity;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

void

Item::setQuantity (unsigned int _newQuantity)

{

m_quantity = _newQuantity;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

Money

Item::getPrice () const

{

return m_price;

}

 

 

//-----------------------------------------------------------------------------

 

 

#endif // _ITEM_HPP_

item.cpp

//-----------------------------------------------------------------------------

 

#include "item.hpp"

#include "product.hpp"

 

//-----------------------------------------------------------------------------

 

 

Item::Item (Product const & _product, unsigned int _quantity)

: m_product(_product),

m_price(_product.getCurrentPrice()),

m_quantity (_quantity)

{

}

 

 

//-----------------------------------------------------------------------------

 

 

Money

Item::getCost () const

{

return m_price * m_quantity;

}

 

 

//-----------------------------------------------------------------------------

order.hpp

#ifndef _ORDER_HPP_

#define _ORDER_HPP_

 

//-----------------------------------------------------------------------------

 

#include "money.hpp"

 

#include <vector>

 

//-----------------------------------------------------------------------------

 

class Item;

class Product;

 

//-----------------------------------------------------------------------------

 

 

class Order

{

 

//-------------------------

 

public:

 

//-------------------------

 

Order (unsigned int _uniqueID, time_t _registeredAt);

 

~Order ();

 

//-------------------------

 

unsigned int getUniqueID () const;

 

time_t getRegistrationTime () const;

 

//-------------------------

 

unsigned int getItemsCount () const;

 

Item const & getItem (unsigned int _itemIndex) const;

 

Item & newItem (Product const & _item, unsigned int _quantity);

 

void removeItem (Item & _item);

 

//-------------------------

 

Money getCost () const;

 

//-------------------------

 

private:

 

//-------------------------

 

const unsigned int m_uniqueID;

 

const time_t m_registeredAt;

 

typedef std::vector< Item * > Items;

Items m_items;

 

//-------------------------

 

};

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Order::getUniqueID () const

{

return m_uniqueID;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

time_t

Order::getRegistrationTime () const

{

return m_registeredAt;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Order::getItemsCount () const

{

return m_items.size();

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

Item const &

Order::getItem (unsigned int _itemIndex) const

{

return * (m_items.at(_itemIndex));

}

 

 

//-----------------------------------------------------------------------------

 

#endif // _ORDER_HPP_

order.cpp

//-----------------------------------------------------------------------------

 

#include "order.hpp"

#include "item.hpp"

 

#include <algorithm>

#include <boost/checked_delete.hpp>

#include <exception>

 

//-----------------------------------------------------------------------------

 

 

Order::Order (unsigned int _uniqueID, time_t _registeredAt)

: m_uniqueID(_uniqueID),

m_registeredAt(_registeredAt)

{

}

 

 

//-----------------------------------------------------------------------------

 

 

Order::~Order ()

{

std::for_each(

m_items.begin(),

m_items.end(),

boost::checked_deleter< Item >()

);

}

 

 

//-----------------------------------------------------------------------------

 

 

Item &

Order::newItem (Product const & _product, unsigned int _quantity)

{

Item * pNewItem = new Item(_product, _quantity);

m_items.push_back(pNewItem);

return * pNewItem;

}

 

 

//-----------------------------------------------------------------------------

 

 

void

Order::removeItem (Item & _item)

{

Items::iterator it = std::find(m_items.begin(), m_items.end(), & _item);

if (it == m_items.end())

throw std::exception();

 

m_items.erase(it);

}

 

 

//-----------------------------------------------------------------------------

 

 

Money

Order::getCost () const

{

Money totalCost = Money();

 

Items::const_iterator it = m_items.begin();

while (it!= m_items.end())

{

const Item * pItem = * it;

totalCost = totalCost + pItem->getCost();

++ it;

}

 

return totalCost;

}

 

 

//-----------------------------------------------------------------------------

shop.hpp

#ifndef _SHOP_HPP_

#define _SHOP_HPP_

 

//-----------------------------------------------------------------------------

 

#include <string>

#include <vector>

#include <map>

#include <memory>

 

//-----------------------------------------------------------------------------

 

class Product;

class Order;

class Money;

 

//-----------------------------------------------------------------------------

 

 

class Shop

{

 

//-------------------------

 

public:

 

//-------------------------

 

Shop (const std::string &_title);

 

~Shop ();

 

//-------------------------

 

const std::string & getTitle () const;

 

//-------------------------

 

Product const & addProduct (

const std::string & _productName,

const std::string & _description,

const Money & _initialPrice

);

 

void dropProduct (const std::string & _name);

 

unsigned int getProductsCount () const;

 

Product const * findProduct (const std::string & _name) const;

 

class ProductIterator

{

public:

virtual bool hasNext () const = 0;

virtual Product const & getProduct () const = 0;

virtual void next () = 0;

};

 

std::auto_ptr< ProductIterator > browseProducts () const;

 

 

//-------------------------

 

unsigned int getOrdersCount () const;

 

const Order & getOrder (unsigned int _orderIndex) const;

 

Order & newOrder ();

 

//-------------------------

 

private:

 

//-------------------------

 

const std::string m_title;

 

typedef std::map< std::string, Product * > ProductDescriptions;

ProductDescriptions m_products;

 

std::vector< Order * > m_orders;

 

//-------------------------

 

};

 

 

//-----------------------------------------------------------------------------

 

 

inline

const std::string &

Shop::getTitle () const

{

return m_title;

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Shop::getProductsCount () const

{

return m_products.size();

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

unsigned int

Shop::getOrdersCount () const

{

return m_orders.size();

}

 

 

//-----------------------------------------------------------------------------

 

 

inline

const Order &

Shop::getOrder (unsigned int _orderIndex) const

{

return *(m_orders.at(_orderIndex));

}

 

 

//-----------------------------------------------------------------------------

 

#endif // _SHOP_HPP_

shop.cpp

//-----------------------------------------------------------------------------

 

#include "shop.hpp"

#include "order.hpp"

#include "product.hpp"

 

#include <ctime>

#include <algorithm>

#include <exception>

#include <boost/checked_delete.hpp>

 

//-----------------------------------------------------------------------------

 

 

Shop::Shop (const std::string & _title)

: m_title(_title)

{

}

 

 

//-----------------------------------------------------------------------------

 

 

Shop::~Shop ()

{

std::for_each(

m_orders.begin(),

m_orders.end(),

boost::checked_deleter< Order >()

);

 

std::for_each(

m_products.begin(),

m_products.end(),

std::compose1(

boost::checked_deleter< Product >(),

std::select2nd< ProductDescriptions::value_type >()

)

);

}

 

 

//-----------------------------------------------------------------------------

 

 

Order &

Shop::newOrder ()

{

Order * pNewOrder = new Order(getOrdersCount(), time(NULL));

m_orders.push_back(pNewOrder);

return * pNewOrder;

}

 

 

//-----------------------------------------------------------------------------

 

 

Product const &

Shop::addProduct (

const std::string & _productName,

const std::string & _description,

const Money & _initialPrice

)

{

if (findProduct(_productName))

throw std::exception();

 

Product * pProduct = new Product(

m_products.size(), /* id */

_productName,

_description,

_initialPrice

);

 

m_products.insert(

std::make_pair(

pProduct->getName(),

pProduct

)

);

 

return * pProduct;

}

 

 

//-----------------------------------------------------------------------------

 

 

void

Shop::dropProduct (const std::string & _name)

{

ProductDescriptions::iterator it = m_products.find(_name);

if (it!= m_products.end())

{

Product * pProduct = it->second;

m_products.erase(it);

delete pProduct;

}

else

throw std::exception();

 

}

 

 

//-----------------------------------------------------------------------------

 

Product const *

Shop::findProduct (const std::string & _name) const

{

ProductDescriptions::const_iterator it = m_products.find(_name);

if (it == m_products.end())

return NULL;

 

return it->second;

}

 

 

//-----------------------------------------------------------------------------

 

 

std::auto_ptr< Shop::ProductIterator >

Shop::browseProducts () const

{

class ProductIteratorImpl

: public ProductIterator

{

 

//-----------------------

 

public:

 

//-----------------------

 

ProductIteratorImpl (ProductDescriptions const & _descriptions)

: m_descriptions(_descriptions),

m_it(_descriptions.begin())

{

}

 

//-----------------------

 

virtual bool hasNext () const

{

return m_it!= m_descriptions.end();

}

 

//-----------------------

 

virtual Product const & getProduct () const

{

return *(m_it->second);

}

 

//-----------------------

 

virtual void next ()

{

++ m_it;

}

 

//-----------------------

 

private:

 

//-----------------------

 

ProductDescriptions const & m_descriptions;

 

ProductDescriptions::const_iterator m_it;

 

//-----------------------

 

};

 

return std::auto_ptr< ProductIterator >(

new ProductIteratorImpl(m_products)

);

}

 

 

//-----------------------------------------------------------------------------

 


Date: 2015-12-12; view: 263; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию