Глава VI. Как да направим складова програма със ЗЗЗ сървър ?

Въведение

Какво може да научите в настоящия раздел от документацията?
  1. Как се създава програмен продукт от нулата?

  2. Каква е методиката за създаване на MVP (Minimum Viable Product или минимално жизнеспособен продукт) и как да я приложим на практика при създаване на складова програма?

  3. Какво е design pattern (шаблони за дизайн)? Като ще приложим основно шаблона MVC (Model View Controller или модел, изглед, контролер).

  4. Как да направим складова програма?

  5. Как можем да използваме ЗЗЗ сървър за разработка на мултиплатформен програмен продукт?

В края на всяка секция има връзка към архив с описания в нея програмен код.

Авторът на настоящата документация е участвал в разработването на едни от най-известните български програмни продукти за управление на складови стопанства, счетоводство, ТРЗ и личен състав, както и в разработката на много други програмни продукти.

Настоящият документ е в процес на разработка!

1. Планиране

Преди да започнем разработката на програмен продукт трябва да обмислим как да го реализираме. За целта ще използваме методиката MVP (Minimum Viable Product или минимално жизнеспособен продукт).

Какво представлява MVP ?

MVP е продукт полезен за потребителите и създаден с минимално множество функции.

За да определим минималното множество функции на нашия продукт ще използваме следните 5 стъпки:
  1. Определяне основната цел на продукта.
  2. Определяне главния процес при използване на продукта.
  3. Създаване на списък с функции за всеки етап.
  4. Подреждане на функциите от списъка според тяхната важност.
  5. Определяне на MVP.
Нека да приложим тези стъпки към нашия складов програмен продукт:
1. Основната цел на нашия продукт е доставяне и изписване на стоки от склад и извеждане на справки.

2. Основен процес: Позволява на потребителите да доставят и изписват стоки както и да извеждат справки.
доставка
изписване
справки

3. Списък с функции за всеки етап (включваме всички функции, за които се сетим).
доставка
изписване
справки
доставка на стока
изписване на стока
справка за наличност
доставка на стоки
изписване на стоки
справка за доставки
стокова разписка
складова разписка
справка за изписвания
доставна фактура
изходяща фактура
дадени на консигнация
вземане на консигнация
даване на консигнация
взети на консигнация
доставка по партиди
изписване по партиди
наличност по партиди
доставка по среднопретеглена
изписване по среднопретеглена
доставки по партиди
доставка по (FIFO)
изписване по (FIFO)
изписвания по партиди
доставка по (LIFO)
изписване по (LIFO)
издаване на касова бележка

среднопретеглена - имаме предвид доставка и изписване на стоки по среднопретеглена цена.
(FIFO) First In First Out - имаме предвид, че първо изписваме най-рано доставените стоки.
(LIFO) Last In First Out - имаме предвид, че първо изписваме най-скоро доставените стоки.

4. Подреждаме функциите вертикално по важност, като най-отгоре са функциите с най-голям приоритет(в нашия случай не се налага разместване).
доставка
изписване
справки
доставка на стока
изписване на стока
справка за наличност
доставка на стоки
изписване на стоки
справка за доставки
стокова разписка
складова разписка
справка за изписвания
доставна фактура
изходяща фактура
дадени на консигнация
вземане на консигнация
даване на консигнация
взети на консигнация
доставка по партиди
изписване по партиди
наличност по партиди
доставка по среднопретеглена
изписване по среднопретеглена
доставки по партиди
доставка по (FIFO)
изписване по (FIFO)
изписвания по партиди
доставка по (LIFO)
изписване по (LIFO)
издаване на касова бележка

5. Определяме MVP.
5.1. Определяме скелета на приложението (това са функциите, без които продукта не може да осъществява своята основна цел) обикновено е първия ред с функции и ги ограждаме с черна прекъсната рамка.
5.2. Определяме минималния набор от функции необходим за реално използване на приложението от потребители и ги ограждаме с червена прекъсната рамка.
Останалите функции можем да реализираме на по-късен етап от разработката на продукта.
доставка
изписване
справки
доставка на стока
изписване на стока
справка за наличност
доставка на стоки
изписване на стоки
справка за доставки
стокова разписка
складова разписка
справка за изписвания
доставна фактура
изходяща фактура
дадени на консигнация
вземане на консигнация
даване на консигнация
взети на консигнация
доставка по партиди
изписване по партиди
наличност по партиди
доставка по среднопретеглена
изписване по среднопретеглена
доставки по партиди
доставка по (FIFO)
изписване по (FIFO)
изписвания по партиди
доставка по (LIFO)
изписване по (LIFO)
издаване на касова бележка
Отлично, вече сме готови да преминем към реализация, като тя ще бъде осъществена чрез следните етапи:
  1. Реализиране скелета на продукта;
  2. Реализиране на MVP;
  3. Поетапно добавяне на допълнителни функции.

2. Реализиране скелета на продукта

За да започнем разработването на продукта е необходимо да разполагаме със следния минимум от инструменти:
  1. Компютър с 32 или 64 битова операционна система Windows, Linux или 64 битова Mac OS X.
  2. ЗЗЗ сървър + демонстрационния пакет към него.
  3. Текстов редактор, който може да обработва файлове с UTF-8 кодировка.
Аз лично ще използвам при създаването на настоящата документация:
  1. Компютър с операционна система Windows.
  2. ЗЗЗ сървър + демонстрационния пакет към него.
  3. Текстов редактор - Notepad++, който можете да изтеглите безплатно от Интернет.

Преди да продължим ще обясня какво е design pattern (шаблони за дизайн)?

Шаблоните за дизайн представят най-добрите практики използвани от напредналите разработчици на обектно-ориентиран софтуер. Те са решения на основни проблеми, с които се сблъскват програмистите. До тези решения се е стигнало по пътя на пробите и грешките от множество софтуерни разработчици за дълъг период от време.

Шаблонът MVC
MVC шаблона означава Model-View-Controller. Този шаблон се използва за разделяне на дейностите, които реализира приложението.
Model - моделът представлява обект, който се грижи за данните. Той може да има и логика за актуализиране на контролера при промяна на данните.
View - изгледа визуализира данните, които съдържа модела.
Controller - контролера взаимодейства с модела (Model) и изгледа (View). Той контролира потока на данните в обекта описващ модела и актуализира изгледа при промяна на данните, като разделя модела от данните. На практика функциите на контролера са тези, чрез които модела реагира на външния за шаблона свят.

ModelClass <-- ControllerClass --> ViewClass
			^
			|
		Application

Видяхме, че скелета на продукта се състои от следните функции:
  1. Доставка на стока.
  2. Изписване на стока.
  3. Справка за наличност.
Нека започнем да ги реализираме последователно.
1. Доставка на стока.
При доставката на стока задаваме: името на стоката, мерната единица, количеството и доставната цена, евентуално и баркод.

Проектиране обектния модел на приложението

Така ще изглежда планирания обектен модел на складовото приложение:
StockModelClass <-- StockControllerClass --> StockViewClass
				^
				|
StoreModelClass <-- StoreControllerClass --> StoreViewClass
				^
				|
			StoreApplication

Нека да планираме всеки един клас поотделно:

StockModelClass
  • getName()
  • setName(name)
  • getMeasure()
  • setMeasure(measure)
  • getQuantity()
  • setQuantity(quantity)
  • getDeliveryPrice()
  • setDeliveryPrice(deliveryPrice)
  • getBarcode()
  • setBarcode(barcode)

  • save()
    - записва информацията за стоката в базата данни
  • loadByName(name)
    - прочита стоката от базата данни, като я намира по име
  • loadByBarcode(barcode)
    - прочита стоката от базата данни, като я намира по баркод

StockViewClass
  • displayStock()

StockControllerClass
  • getStockName()
  • setStockName(name)
  • getStockMeasure()
  • setStockMeasure(measure)
  • getStockQuantity()
  • setStockQuantity(quantity)
  • getStockDeliveryPrice()
  • setStockDeliveryPrice(deliveryPrice)
  • getStockBarcode()
  • setStockBarcode(barcode)

  • saveStock()
    - записва информацията за стоката в базата данни
  • loadStockByName(name)
    - прочита стоката от базата данни, като я намира по име
  • loadStockByBarcode(barcode)
    - прочита стоката от базата данни, като я намира по баркод
  • updateView()
    - изобразява стоката

StoreModelClass
  • deliveryStock(name, barode, measure, quantity, deliveryPrice)
  • takeStockByName(name, measure, quantity)
  • takeStockByBarcode(name, measure, quantity)
  • getAvailability()

StoreViewClass
  • displayAvailability()

StoreControllerClass
  • deliveryStockInStore(name, barode, measure, quantity, deliveryPrice)
  • takeStockByNameFromStore(name, measure, quantity)
  • takeStockByBarcodeFromStore(name, measure, quantity)

  • updateAvailabilityView()
    - извежда наличността на стоки в склада

StoreApplication
  • delivery()
  • take()
  • updateView()

* Тази част от документацията е в процес на разработване!

3. Реализиране на MVP

* Тази част от документацията е в процес на разработване!

4. Добавяне на допълнителни функции

* Тази част от документацията е в процес на разработване!