Описание предметной области




КУРСОВАЯ РАБОТА

студента 2 курса 252 группы

направления 38.03.05 — «Бизнес-информатика»

код и наименование направления

механико-математического факультета

наименование факультета

Мизь Андрей Александрович

фамилия, имя, отчество

 

 

Научный руководитель

доцент, д.ф.м.н. С.П.Сидоров

должность, уч. степень, уч. звание подпись, дата инициалы, фамилия

 

 

Зав. кафедрой

д.ф.м.н. С.П.Сидоров

должность, уч. степень, уч. звание подпись, дата инициалы, фамилия

 

Саратов 2017 г.

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ…………………………………………………………………………..3

1 Объектно-ориентированное программирование…….........................................4

1.1 Основные понятия ООП...........................................................................4

1.2 Принципы ООП.........................................................................................8

1.3 Язык программирования Python…………………………………...…...9

2 Практическая часть…………………..……….………………………………...12

2.1 Описание предметной области …………………………….…………12

2.2 Диаграмма классов……………………………………………………..13

2.3 Реализация на языке Python…………………………………….......….17

ЗАКЛЮЧЕНИЕ.…………………………………………………………………....35

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ …………...............................37

 


ВВЕДЕНИЕ

Одной из важнейших задач при ведении такого бизнес как отель это создание условий для автоматизации его внутренних процессов. При отсутствии автоматических систем записи данных работа менеджеров может быть слишком долгой и нудной. Самое главное, что из-за мелких не точностей и ошибок людей, возможны серьезные последствия и даже финансовые проблемы, а при сегодняшнем уровне научного прогресса и высокой конкуренции на рынке услуг, отсутствие автоматизации может привести даже к краху бизнеса.

Цель данной работы: используя методы объектно-ориентированного программирование (ООП), создать модель информационной системы регистрации и размещения клиентов отеля.

Задачи работы: анализ теоретических основ ООП, изучение языка программирования Python, применение полученных знаний на практике для реализации предметной области.

Данная работа состоит из двух глав. В первой глава состоит из трех частей. В первой и второй частях говорится об объектно-ориентированном подходе. Здесь подробно освещается основная информация о понятиях и принципах ООП. Третья часть посвящена самому языку программирования Python, истории его создания и развития, основных алгоритмических конструкциях и типах данных. Во второй главе глава разделена на трети части: в первой производится описание предметной области, во второй создаётся диаграмма классов в соответствии с выбранной предметной областью и описание основных классов, и в третьей представлена реализация на языке Python.

Объектно-ориентированное программирование

Основные понятия ООП

Объектно-ориентированное программирование (ООП) — это способ организации кода в программе путем его группировки в виде объектов, то есть отдельных элементов, которые включают информацию (значения данных) и функции. Объектно-ориентированный подход к организации программы позволяет группировать определенные фрагменты информации (например, информацию об отеле, такую как ФИО клиента или характеристику номера) вместе с часто используемыми функциями или действиями, связанными с этой информацией (например, «удалить клиента из поселения» или «добавить новый номер отеля»).

По определению авторитета в области объектно-ориентированных методов разработки программ Гради Буча «объектно-ориентированное программирование (ООП) – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости».

Объектно-ориентированная методология так же, как и структурная методология, была создана с целью дисциплинировать процесс разработки больших программных комплексов и тем самым снизить их сложность и стоимость.

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

Сейчас объектно-ориентированное программирование стало настолько распространенным подходом в мире, что понимание его основных концепций стало необходимо для всех, кто собирается заняться программированием.

Объектно-ориентированное программирование — это парадигма программирования (совокупность идей и понятий, определяющая стиль написания программ). В нем основными концепциями являются понятия объектов и классов.

Класс – это тип данных, определяющий схожие объекты. Объект же является экземпляром некоторого класса.

Первичным понятием объектно-ориентированного подхода к программированию является понятие класса как совокупности объектов. Заметим, что класс при объектно-ориентированном подходе является аналогом понятия типа в том смысле, что к нему относят лишь объекты, отобранные по определенному правилу. Это правило возможно формализовать математически посредством предикатной функции, т.е. функции, область значений которой совпадает со значениями истинности: «истина» и «ложь». При этом, тот или иной объект относится к классу, если значение аппликации функции к данному объекту истинно, и не относится в противном случае.

Объект – синтаксически обособленная часть программы для имитации определенного ориентира из реального мира. Объект – упрощенное, идеализированное описание сущности предметной области, котораяспособна сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. Неотъемлемые характеристики объекта:

· состояние

· поведение

· идентифицируемость

Состояние объекта объединяет все его поля данных (статический компонент, т.е. неизменный) и текущие значения каждо­го из этих полей (динамический компонент, т.е. обычно изменяющийся).

Поведение выражает динамику изменения состояний объ­екта и его реакцию на поступающие сообщения, т.е. как объект изменяет свои состояния и взаи­модействует с другими объектами.

Идентификация (рас­познавание) объекта — это свойство, которое позволяет от­личить объект от других объектов того же или других клас­сов. Осуществляется идентификация посредством уникального имени (кода), которым наделяется объект в программе, впрочем, как и любая другая переменная.

Предмет моделирования при построении объекта в ООП может быть различным. Например, могут существовать следующие типы абстракции, используемые при построении объекта:

· абстракция понятия: объект — это модель какого-то понятия предметной области;

· абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;

· абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;

· случайная абстракция: объект объединяет не связанные между собой операции.

Иногда нужно идентифицировать объекты в ООП, т.е., если имеются два объекта, как можно определить что эти объекты разные. На самом деле существует два вопроса: равны ли два объекта или тождественны. Обычно для идентификации применяются специальные атрибуты объектов — идентификаторы. В свою очередь, зная идентификаторы объектов можно точно определить, являются ли они тождественными или нет. Поэтому в объектно-ориентированном методе каждый модуль должен самостоятельно инициализировать свои структуры данных [1].

Индивидуальные объекты называются экземплярами класса, а класс в ООП — это шаблон по которому строятся объекты.

Класс — это конструкция, которая позволяет создавать собственные настраиваемые типы путем группирования переменных других типов, методов и событий. В некотором смысле классы объединяют в себе записи и программы, обрабатывающие эти записи, – методы реализуют логику интерпретации и изменения данных (этот стиль программирования потому и называется объектно-ориентированным, что при таком подходе всегда обрабатываются данные объектов) [2].

Класс похож на проект. Он определяет данные и поведение типа. Если класс не объявлен как статический, клиентский код может использовать его, создавая объекты или экземпляры, назначенные переменной. Переменная остается в памяти до тех пор, пока все ссылки на нее не выйдут из области. В этот момент среда CLR помечает ее пригодной для сборки мусора. Если класс объявляется как статический, то в памяти существует только одна копия, и клиентский код может получать к ней доступ только через сам класс, а не переменную экземпляра. Объект, созданный на основе некоторого класса, называется экземпляром класса. Все объекты определенных пользователем классов являются экземплярами класса. Тем не менее, объекты даже с одним и тем же состоянием могут быть разными объектами. Поэтому и говорят, что они имеют разную индивидуальность.

В отличие от структур, классы поддерживают наследование, фундаментальную характеристику объектно-ориентированного программирования.

Классы, объекты и методы имеют разные вариации, что позволяет сделать процесс реализации и сами программы достаточно удобными, гибкими и универсальными.

 

Концепции ООП

Объектно-ориентированное программирование требует понимания его основных концепций, на которых оно построено. Во всех объектно-ориентированных языках программирования реализованы следующие основные «постулаты» ООП:

· Инкапсуляция

· Наследование

· Полиморфизм

Все эти механизмы важны для разработки и использования абстракций.

Инкапсуляция – механизм, связывающий вместе код и данные, которыми он манипулирует, и одновременно защищающий их от произвольного доступа со стороны другого кода, внешнего по отношению к рассматриваемому. Доступ к коду и данным жестко контролируется интерфейсом. Основой инкапсуляции при ООП является класс. Механизма инкапсуляции позволяет оставлять скрытыми от пользователя некоторые детали реализации класса (то есть инкапсулировать их в классе), что упрощает работу с объектами этого класса.

Наследование – механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базового класса). При использовании наследования новый объект не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста. Наследование позволяет какому-либо объекту наследовать от своего родителя общие атрибуты, а для себя определять только те характеристики, которые делают его уникальным внутри класса. Наследование есть очень важное понятие, поддерживающее концепцию иерархической классификации.

Полиморфизм – механизм, позволяющий использовать один и тот же интерфейс для общего класса действий [3]. Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием). Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода.

1.3 Язык программирования ” Python ”

Язык программирования Python начал свою историю ещё в конце 80-x годов XX века. Нидерландский программист Гвидо ван Россум является автором Python. В декабре 1989 года Россум приступил к его созданию в центре математики и информатики в Нидерландах. Ему был необходим расширяемый язык, который бы обеспечил поддержку системных вызовов. Python создавался под влиянием множества языков программирования: С, C++, Java, Smalltalk, Модула-3 и ABC. Хоть многие считали, что назван язык в честь змеи, но всё-таки свое название язык получил в честь популярного британского комедийного телешоу 1970-х “Летающий цирк Монти-Питона” на канале “BBC”. С тех пор Python развивался при поддержке тех организаций, в которых Гвидо работал.

Сам Россум говорит о своем языке так: “ Python - интерпретируемый, объектно-ориентированный высокоуровневый язык программирования с динамической семантикой. Встроенные высокоуровневые структуры данных в сочетании с динамической типизацией и связыванием делают язык привлекательным для быстрой разработки приложений (RAD, Rapid Application Development). Кроме того, его можно использовать в качестве сценарного языка для связи программных компонентов. Синтаксис Python прост в изучении, в нем придается особое значение читаемости кода, а это сокращает затраты на сопровождение программных продуктов. Python поддерживает модули и пакеты, поощряя модульность и повторное использование кода. Интерпретатор Python и большая стандартная библиотека доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформ и могут свободно распространяться ”.

Python – это высокоуровневый универсальный язык программирования, ориентированный на повышение производительности разработчика и читаемости кода. Python проектировался как объектно-ориентированный язык программирования, и поэтому он построен с учетом следующих принципов:

· все данные в нем представляются объектами.

· все объекты одного типа могут принимать одни и те же сообщения (и выполнять одни и те же действия).

· программу можно составить как набор посылающих друг другу сообщения взаимодействующих объектов.

· каждый объект имеет тип.

· каждый объект имеет собственную часть памяти и может состоять из других объектов.

Для решения широкого круга задач в поставку Python входит достаточно обширная стандартная библиотека. Для ещё большего расширения возможностей языка в интернете доступны другие разнообразные качественные библиотеки по различным предметным областям: инструменты для создания приложений, средства обработки текстов и изображений, механизмы работы с базами данных, библиотеки построения графического интерфейса, пакеты для научных вычислений, и т.п. Python портирован и работает практически на большинстве известных платформ — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, Mac OS и Mac OS X, практически все вариации UNIX (включая FreeBSD и Linux), Plan 9, Palm OS, OS/2, Amiga, HaikuOS, AS/400 и OS/390, Windows Mobile, iPhone OS 2.0 и выше, Symbian и Android. Так же Python имеет достаточно простые средства для интеграции с языками C, C++ и Java, как путем встраивания (embedding) интерпретатора в программы на этих языках, так и наоборот, посредством использования библиотек, написанных на этих языках, в Python-программах. Язык Python поддерживает некоторые виды парадигм программирования: функциональное, императивное и объектно-ориентированное программирование. Язык Python используется в самых разных областях, от администрирования систем, разработки веб-сайтов, создания сценариев для мобильных устройств и обучения, до тестирования аппаратуры, анализа капиталовложений, компьютерных игр и управления космическими кораблями [4].

В настоящее время язык совершенствуется особенно активно, так как теперь над ним работает не только команда создателей, но и целое сообщество программистов со всего мира. Но даже сейчас Гвидо ван Россум остается ведущим специалистом языка и за ним всегда стоит последнее слово о направлении его развития.

 

Практическая часть

Описание предметной области

 

Задачей является фиксирование информационной работы отеля. Деятельность организована следующим образом: отель предоставляет номера клиентам на определенный срок. Каждый номер характеризуется вместимостью, комфортностью (люкс, полулюкс, обычный), ценой и некоторым комментарием. Клиентами являются различные лица, о которых собирается определенная информация (фамилия, имя, отчество, паспортные данные (серия паспорта, номер паспорта), пол и некоторый комментарий). Сдача номера производится по подходящим клиенту критериям из указанных выше параметров. При поселении фиксируется дата поселения. При выезде из гостиницы для каждого места запоминается дата освобождения.

Классы объектов:

Клиенты (Клиент, Фамилия, Имя, Отчество, Серия, Номер, Комментарий).
Номера (Номер, Количество человек, Комфортность, Цена, Комментарий).
Поселение (Клиент, Номер, Дата поселения, Дата освобождения, Комментарий).

Диаграмма классов

Рисунок 1 – Диаграмма классов.

Большинство основных классов имеют сходные атрибуты – “code” и “comment”. В этом случае их можно выделить в отдельный класс, от которого будут унаследованы остальные классы. Подобное выделение общих свойств классов в общий класс-предок называется обобщением (generalization). Назовем этот класс “general”.

Класс “ general ” имеет атрибуты:

“code” – уникальный код для однозначной идентификации объекта;

“comment” – комментарий.

Вначале описывается конструктор класса “__init__” – функция, размещающая объект в памяти и возвращающая ссылку на него, кроме того конструктор может выполнять некоторые действия, необходимые при создании объекта, в данном случае это задание начальных значений атрибутов.

Двойной символ подчёркивания в названии атрибута означает, что атрибут является приватный, недоступный для использования вне класса. Это позволяет использовать одинаковые имена атрибутов в разных классах. Доступ к атрибуту осуществляется через специальные функции:

“setcode”, “setcomment”

“getcode”, “getcomment”

“set” – позволяет задать или изменить значение атрибута;

“get” – возвращает в качестве результата значения атрибута;

Через “general.__init__(self,code,comment)” остальные классы смогут унаследовать атрибуты класса general.

Далее будут подробно описаны только основные классы и их атрибуты.

 

Клиенты представлены классом “client”, который имеет атрибуты:

“code” – код клиента;

"surname” – фамилия;

“name” – имя;

“secname” – отчество;

“series” – серия;

“number” – номер;

“sex” – пол.

“comment” – комментарий.

 

Специальные функции:

“setsurname”, “setname”, “setsecname”, “setseries”, “setnumber”, “setsex”;

“getsurname”, “getname”, “getsecname”, “getseries”, “getnumber”, “getsex”;

 

Комнаты представлены классом “room”, который имеет атрибуты:

“code” – код номера;

“number” – номер;

“occupancy” – вместимость;

“comfort” – комфорт;

“price” – цена;

“comment” – комментарий.

 

Специальные функции:

“setnumber”, “setoccupancy”, “setcomfort”, “setprice”;

“getnumber”, “getoccupancy”, “getcomfort”, “getprice”.

 

Поселения представлены классом “settlement”, который имеет атрибуты:

“code” – код поселения;

“room” – комната, представлена классом “room”;

“date_in ” – дата поселения;

“date_out ” – дата освобождения;

“comment” – комментарий.

 

Специальные функции:

“setroom”, “setdate_in”, “setdate_out”;

“getdate_in”, “getdate_out”, “getroomcode”;

“getroomnumber”, “getroomoccupancy”, “getroomcomfort”, “getroomprice”, “getroomcomment”;

“appendclient” – позволяет добавить клиента в поселение,

“removeclient” – позволяет удалить клиента из поселения,

“clearclients” – позволяет удалить всех клиентов из поселения;

“getclientcodes”, “getclientsurname”, “getclientname”, “getclientsecname”, “getclientseries”, “getclientnumber”, “getclientsex”, “getclientcomment”;

“getclientshotelstr”– позволяет получить: “ФИО клиента”,

“gethotelstr” – позволяет получить: “ФИО клиента, номер комнаты клиента, дата поселения, дата освобождения”.

 

 

2.3 Реализация на языке “Python”

Рассмотрим реализацию модели информационной системы регистрации и размещения клиентов отеля.

# -*- coding: utf-8 -*-

В первой строке задаётся кодировка файла программы, если вдруг в тексте программы понадобиться использовать символы кириллицы. Воспользуемся кодировкой utf-8.

Далее следует описание класса “general”.

#-*- coding: utf-8 -*-

 

class general:

def __init__(self,code=1,comment=''):

self.setcode(code)

self.setcomment(comment)

def setcode(self,code):

if not(isinstance(code, int)):

raise Exception("Znachenie polja *cod* dolzhno byt' celym chislom")

if (code < 0):

raise Exception("Znachenie polja kod dolzhno byt' polozhitel'nym. Peredano %i" % code)

self.__code=code

def setcomment(self,comment):

self.__comment=comment

def getcode(self):

return self.__code

def getcomment(self):

return self.__comment

 

Далее следует описание класса “generalistedit”.

# -*- coding: utf-8 -*-

from general import general

 

class generallistedit():

def __init__(self):self.__list=[]

def clear(self):self.__list=[]

def findByCode(self,code):

for h in self.__list:

if h.getcode()==code:

return h

def getcodes(self):return [s.getcode() for s in self.__list]

def getnewcode(self):

m=0

for c in self.getcodes():

if c>m:m=c

return m+1

def appendlist(self,value):self.__list.append(value)

def removelist(self,code):

for s in self.__list:

if s.getcode()==code:self.__list.remove(s)

def getcomment(self,code):return self.findByCode(code).getcomment()

 

Далее следует описание класса “client”.

# -*- coding: utf-8 -*-

from general import general

sextypes = {"man", "woman", "мужской", "женский"}

class client(general):

def __init__(self,code,surname,name,secname,series,number,sex,comment=""):

general.__init__(self,code,comment)

self.setsurname(surname)

self.setname(name)

self.setsecname(secname)

self.setseries(series)

self.setnumber(number)

self.setsex(sex)

def setsurname(self,surname):

if not(isinstance(surname, str)):

raise Exception("Znachenie polja *familia* dolzhno byt' strokoj")

self.__surname=surname

def setname(self,name):

if not(isinstance(name, str)):

raise Exception("Znachenie polja *imya* dolzhno byt' strokoj")

self.__name=name

def setsecname(self,secname):

if not(isinstance(secname, str)):

raise Exception("Znachenie polja *otchestvo* dolzhno byt' strokoj")

self.__secname=secname

def setseries(self,series):

if not(isinstance(series, int)):

raise Exception("Znachenie polja *serija* dolzhno byt' celym chislom")

if (series < 1000 or series > 9999):

raise Exception("Znachenie polja *serija* dolzhno byt' polozhitel'nym i v predele ot 1000 do 9999")

self.__series=series

def setnumber(self,number):

if not(isinstance(number, int)):

raise Exception("Znachenie polja *nomer* dolzhno byt' celym chislom")

if (number < 100000 or number > 999999):

raise Exception("Znachenie polja *nomer* dolzhno byt' polozhitel'nym i v predele ot 100000 do 999999")

self.__number=number

def setsex(self,sex):

if not(isinstance(sex, str)):

raise Exception("Znachenie polja *pol* dolzhno byt' strokoj")

if not(sex in sextypes):

raise Exception("Pol dolzhen byt' muzhskoj ili zheskij")

self.__sex=sex

def getsurname(self):

return self.__surname

def getname(self):

return self.__name

def getsecname(self):

return self.__secname

def getseries(self):

return self.__series

def getnumber(self):

return self.__number

def getsex(self):

return self.__sex

def getperson(self):

return self.__surname + " " + self.__name[0] + "." + " " + self.__secname[0] + "."

 

Далее следует описание класса “сlientlistedit” – список клиентов.

# -*- coding: utf-8 -*-

from client import client

from generallistedit import generallistedit

 

class clientlistedit(generallistedit):

def newrec(self,code,surname,name,secname,series,number,sex,comment=""):

self.appendlist(client(code,surname,name,secname,series,number,sex,comment))

def setsurname(self,code,value):self.findByCode(code).setsurname(value)

def setname(self,code,value):self.findByCode(code).setname(value)

def setsecname(self,code,value):self.findByCode(code).setsecname(value)

def setseries(self,code,value):self.findByCode(code).setseries(value)

def setnumber(self,code,value):self.findByCode(code).setnumber(value)

def setsex(self,code,value):self.findByCode(code).setsex(value)

def setcomment(self,code,value):self.findByCode(code).setcomment(value)

 

def getsurname(self,code):return self.findByCode(code).getsurname()

def getname(self,code):return self.findByCode(code).getname()

def getsecname(self,code):return self.findByCode(code).getsecname()

def getseries(self,code):return self.findByCode(code).getseries()

def getnumber(self,code):return self.findByCode(code).getnumber()

def getsex(self,code):return self.findByCode(code).getsex()

 

def getpersonstr(self,code):

return self.findByCode(code).getperson()

 

def getlistpersonstr(self):

s=''

for code in self.getcodes():

s+=self.getpersonstr(code)

s+=', '

return s[:-2]

 

Далее следует описание класса “room”.

# -*- coding: utf-8 -*-

from general import general

occupancytypes = {1,2,3,4,6,10}

 

class room(general):

def __init__(self,code,number,occupancy,comfort,price,comment=""):

general.__init__(self,code,comment)

self.setnumber(number)

self.setoccupancy(occupancy)

self.setcomfort(comfort)

self.setprice(price)

def setnumber(self,number):

if not(isinstance(number, int)):

raise Exception("Znachenie polja *nomer* dolzhno byt' celym chislom")

if (number < 1):

raise Exception("Znachenie polja *nomer* za den' dolzhno byt' polozhitel'nym")

self.__number=number

def setoccupancy(self,occupancy):

if not(isinstance(occupancy, int)):

raise Exception("Znachenie polja *kolichestvo mest* dolzhno byt' celym chislom")

if not(occupancy in occupancytypes):

raise Exception("Znachenie polja *kolichestvo mest* dolzhno byt': 1/2/3/4/6/10")

self.__occupancy=occupancy

def setcomfort(self,comfort):

if not(isinstance(comfort, str)):

raise Exception("Znachenie polja *komfortnost'* dolzhno byt' strokoj")

self.__comfort=comfort

def setprice(self,price):

if not(isinstance(price, int)):

raise Exception("Znachenie polja *tsena* dolzhno byt' celym chislom")

if (price < 1):

raise Exception("Znachenie polja *tsena* za den' dolzhno byt' polozhitel'nym")

self.__price=price

def getnumber(self):

return self.__number

def getoccupancy(self):

return self.__occupancy

def getcomfort(self):

return self.__comfort

def getprice(self):

return self.__price

 

 

Далее следует описание класса “roomlistedit” – список комнат.

# -*- coding: utf-8 -*-

from room import room

from generallistedit import generallistedit

 

class roomlistedit(generallistedit):

def newrec(self,code,number,occupancy,comfort,price,comment=""):

self.appendlist(room(code,number,occupancy,comfort,price,comment))

def setnumber(self,code,value):self.findByCode(code).setnumber(value)

def setoccupancy(self,code,value):self.findByCode(code).setoccupancy(value)

def setcomfort(self,code,value):self.findByCode(code).setcomfort(value)

def setprice(self,code,value):self.findByCode(code).setprice(value)

def setcomment(self,code,value):self.findByCode(code).setcomment(value)

 

def getcode(self,code):return self.findByCode(code).getcode()

def getnumber(self,code):return self.findByCode(code).getnumber()

def getoccupancy(self,code):return self.findByCode(code).getoccupancy()

def getcomfort(self,code):return self.findByCode(code).getcomfort()

def getprice(self,code):return self.findByCode(code).getprice()

def getcomment(self,code):return self.findByCode(code).getcomment()

 

 

Далее следует описание класса “settlement”.

# -*- coding: utf-8 -*-

from general import general

from room import room

from clientlistedit import clientlistedit

 

class settlement(general,room):

def __init__(self,code,date_in,date_out,room=None,comment=""):

general.__init__(self,code,comment)

self.__clients=clientlistedit()

self.setroom(room)

self.setdate_in(date_in)

self.setdate_out(date_out)

def setroom(self, room):

self.__room = room

def setdate_in(self,di):

if not(isinstance(di, str)):

raise ValueError("Znachenie *data zaezda* dolzhno byt' strokoj")

self.__date_in=di

def setdate_out(self,do):

if not(isinstance(do, str)):

raise ValueError("Znachenie *data vyezda* dolzhno byt' strokoj")

self.__date_out=do

def getdate_in(self):

return self.__date_in

def getdate_out(self):

return self.__date_out

def getroomcode(self):return self.__room.getcode()

def getroomnumber(self):return self.__room.getnumber()

def getroomoccupancy(self):return self.__room.getoccupancy()

def getroomcomfort(self):return self.__room.getcomfort()

def getroomprice(self):return self.__room.getprice()

def getroomcomment(self):return self.__room.getcomment()

 

def appendclient(self,value):self.__clients.appendlist(value)

def removeclient(self,code):self.__clients.removelist(code)

def clearclients(self):self.__clients.clear()

 

def getclientcodes(self):return self.__clients.getcodes()

def getclientsurname(self,code):return self.__clients.findByCode(code).getsurname()

def getclientname(self,code):return self.__clients.findByCode(code).getname()

def getclientsecname(self,code):return self.__clients.findByCode(code).getsecname()

def getclientseries(self,code):return self.__clients.findByCode(code).getseries()

def getclientnumber(self,code):return self.__clients.findByCode(code).getnumber()

def getclientsex(self,code):return self.__clients.findByCode(code).getsex()

def getclientcomment(self,code):return self.__clients.findByCode(code).getcomment()

 

def getclientshotelstr(self):

return self.__clients.getlistpersonstr()

def gethotelstr(self):

s=self.getclientshotelstr()

if self.__room:sroom=self.getroomnumber()

else:sroom=""

s+=': room %s, %s - %s'%(sroom,self.getdate_in(),self.getdate_out())

return s

 

Далее следует описание класса “settlementlistedit” – список поселений.

# -*- coding: utf-8 -*-

from generallistedit import generallistedit

from settlement import settlement

class settlementlistedit(generallistedit):

def newrec(self,code,date_in,date_out,room=None,comment=""):

self.appendlist(settlement(code,date_in,date_out,room,comment))

def setdate_in(self,code,value):self.findByCode(code).setdate_in(value)

def setdate_out(self,code,value):self.findByCode(code).setdate_out(value)

def setroom(self,code,value):self.findByCode(code).setroom(value)

def setcomment(self,code,value):self.findByCode(code).setcomment(value)

 

def appendclient(self,code,value):self.findByCode(code).appendclient(value)

def removeclient(self,scode,ccode):self.findByCode(scode).removeclient(ccode)

def clearclients(self,code):self.findByCode(code).clearclients()

 

def getdate_in(self,code):return self.findByCode(code).getdate_in()

def getdate_out(self,code):return self.findByCode(code).getdate_out()

def getcomment(self,code):return self.findByCode(code).getcomment()

 

def getroomcode(self,code):return self.findByCode(code).getroomcode()

def getroomnumber(self,code):return self.findByCode(code).getroomnumber()

def getroomoccupancy(self,code):return self.findByCode(code).getroomoccupancy()

def getroomcomfort(self,code):return self.findByCode(code).getroomcomfort()

def getroomprice(self,code):return self.findByCode(code).getroomprice()

def getroomcomment(self,code):return self.findByCode(code).getroomcomment()

 

def getclientsurname(self,scode,ccode):return self.findByCode(scode).getclientsurname(ccode)

def getclientname(self,scode,ccode):return self.findByCode(scode).getclientname(ccode)

def getclientsecname(self,scode,ccode):return self.findByCode(scode).getclientsecname(ccode)

def getclientseries(self,scode,ccode):return self.findByCode(scode).getclientseries(ccode)

def getclientnumber(self,scode,ccode):return self.findByCode(scode).getclientnumber(ccode)

def getclientsex(self,scode,ccode):return self.findByCode(scode).getclientsex(ccode)

def getclientcomment(self,scode,ccode):return self.findByCode(scode).getclientcomment(ccode)

 

def getclientcodes(self,code):return self.findByCode(code).getclientcodes()

def getclientshotelstr(self,code):return self.findByCode(code).getclientshotelstr()

def gethotelstr(self,code):return self.findByCode(code).gethotelstr()

 

Теперь напишем программу в файле «main1.py», которая будет создавать объекты по описанным классам. В качестве примера добавим новое поселение. Информация о работе программы будет выведена на экран.

#-*- coding:utf-8 -*-

from settlement import settlement

from client import client

from room import room

 

h1=settlement(1,"01.01.17","10.01.17")

h1.appendclient(client(1, "Rinder", "Andrew", "Aleksandrovich", 7123, 129033, "man"))

h1.appendclient(client(2, "Rinder", "Olivia", "Maksimovna", 7156, 528745, "woman"))

h1.appendclient(client(3, "Rinder", "Alex", "Andreevich", 7156, 528745, "woman"))

h1.setroom(room(12,12,3,"standart",5000))

print h1.gethotelstr()

h1.removeclient(2)

print h1.gethotelstr()

h1.clearclients()

print "No clients", h1.gethotelstr()

h1.appendclient(client(1, "Rinder", "Andrew", "Aleksandrovich", 7123, 129033, "man"))

h1.appendclient(client(2, "Rinder", "Olivia", "Maksimovna", 7136, 528745, "woman"))

h1.appendclient(client(3, "Rinder", "Alex", "Andreevich", 7182, 288744, "man"))

print h1.gethotelstr()

 

После активации программы в файле «main1.py» получаем информацию о добавленном поселении:

Rinder A. A., Rinder O. M., Rinder A. A.: room 12, 01.01.17 - 10.01.17

Rinder A. A., Rinder A. A.: room 12, 01.01.17 - 10.01.17

No clients: room 12, 01.01.17 - 10.01.17

Rinder A. A., Rinder O. M., Rinder A. A.: room 12, 01.01.17 - 10.01.17

 

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

Далее следует описание класса “hotel”.

# -*- coding: utf-8 -*-

from clientlistedit import clientlistedit

from roomlistedit import roomlistedit

from settlementlistedit import settlementlistedit

 

class hotel(clientlistedit,roomlistedit,settlementlistedit):

def __init__(self):

self.__clients=clientlistedit()

self.__rooms=roomlistedit()

self.__settlements=settlementlistedit()

def removeclient(self,code):

self.__clients.removelist(code)

for c in self.__settlements.getcodes():

self.__settlements.removeclient(c,code)

def removeroom(self, code):

self.__rooms.removelist(code)

for c in self.__settlements.getcodes():

self.__settlements.setroom(c,None)

def removesettlement(self,code):

self.__settlements.removelist(code)

 

def clear(self):

self.__settlements.clear()

self.__clients.clear()

self.__rooms.clear()

 

def newclient(self,code,surname,name,secname,series,number,sex,comment=""):

self.__clients.newrec(code,surname,name,secname,series,number,sex,comment)

def findClientByCode(self,code):return self.__clients.findByCode(code)

def getclientnewcode(self):return self.__clients.getnewcode()

def getclientcodes(self):return self.__clients.getcodes()

 

def getclientsurname(self,code):return self.__clients.getsurname(code)

def getclientname(self,code):return self.__clients.getname(code)

def getclientsecname(self,code):return self.__clients.getsecname(code)

def getclientseries(self,code):return self.__clients.getseries(code)

def getclientnumber(self,code):return self.__clients.getnumber(code)

def getclientsex(self,code):return self.__clients.getsex(code)

def getclientcomment(self,code):return self.__clients.getcomment(code)

 

def getclientshotelstr(self,code):

return self.__clients.getlistpersonstr(code)

def getclienthotelstr(self,code):

return self.__clients.getpersonstr(code)

 

def setclientsurname(self,code,value): self.__clients.setsurname(code,value)

def setclientname(self,code,value): self.__clients.setname(code,value)

def setclientsecname(self,code,value): self.__clients.setsecname(code,value)

def setclientseries(self,code,value): self.__clients.setseries(code,value)

def setclientnumber(self,code,value): self.__clients.setnumber(code,value)

def setclientsex(self,code,value): self.__clients.setsex(code,value)

def setclientcomment(self,code,value): self.__clients.setcomment(code,value)

 

def newroom(self,code,number,occupancy,comfort,price,comment=""):

self.__rooms.newrec(code,number,occupancy,comfort,price,comment)

def findRoomByCode(self,code):return self.__rooms.findByCode(code)

def getroomnewcode(self):return self.__rooms.getnewcode()

def getroomcodes(self):return self.__rooms.getcodes()

 

def getroomcode(self,code):return self.__rooms.getcode(code)

def getroomnumber(self,code):return self.__rooms.getnumber(code)

def getroomoccupancy(self,code):return self.__rooms.getoccupancy(code)

def getroomcomfort(self,code):return self.__rooms.getcomfort(code)

def getroomprice(self,code):return self.__rooms.getprice(code)

def getroomcomment(self,code):return self.__rooms.getcomment(code)

 

def setroomnumber(self,code,value):self.__rooms.setnumber(code,value)

def setroomoccupancy(self,code,value):self.__rooms.setoccupancy(code,value)

def setroomcomfort(self,code,value):self.__rooms.setcomfort(code,value)

def setroomprice(self,code,value):self.__rooms.setprice(code,value)

def setroomcomment(self,code,value):self.__rooms.setcomment(code,value)

 

def newsettlement(self,code,date_in,date_out,room=None,comment=""):

self.__settlements.newrec(code,date_in,date_out,room,comment)

def findSettlementByCode(self,code):return self.__settlements.findByCode(code)

def appendsettlementclient(self,scode,value):self.__settlements.appendclient(scode,value)

def removesettlementclient(self,scode,ccode): self.__settlements.removeclient(scode,ccode)

def clearsettlementclients(self,scode):self.__settlements.clearclients(scode)

 

def setsettlementdate_in(self,code,value):self.__settlements.setdate_in(code,value)

def setsettlementdate_out(self,code,value):self.__settlements.setdate_out(code,value)

def setsettlementroom(self,code,rcode):self.__settlements.setroom(code,self.findRoomByCode(rcode))

def setsettlementcomment(self,code,value):self.__settlements.setcomment(code,value)

 

def getsettlementcodes(self):return self.__settlements.getcodes()

def getsettlementnewcode(self):return self.__settlements.getnewcode()

def getsettlements(self):return self.__settlements

 

def getsettlementdate_in(self,code):return self.__settlements.getdate_in(code)

def getsettlementdate_out(self,code):return self.__settlements.getdate_out(code)

 

def getsettlementroomcode(self,code):return self.__settlements.getroomcode(code)

def getsettlementroomnumber(self,code):return self.__settlements.getroomnumber(code)

def getsettlementroomoccupancy(self,code):return self.__settlements.getroomoccupancy(code)

def getsettlementroomcomfort(self,code):return self.__settlements.getroomcomfort(code)

def getsettlementroomprice(self,code):return self.__settlements.getroomprice(code)

def getsettlementroomcomment(self,code):return self.__settlements.getroomcomment(code)

 

def getsettlementcomment(self,code):return self.__settlements.getcomment(code)

 

def getsettlementclientsurname(self,scode,ccode):return self.__settlements.getclientsurname(scode,ccode)

def getsettlementclientname(self,scode,ccode):return self.__settlements.getclientname(scode,ccode)

def getsettlementclientsecname(self,scode,ccode):return self.__settlements.getclientsecname(scode,ccode)

def getsettlementclientseries(self,scode,ccode):return self.__settlements.getclientseries(scode,ccode)

def getsettlementclientnumber(self,scode,ccode):return self.__settlements.getclientnumber(scode,ccode)

def getsettlementclientsex(self,scode,ccode):return self.__settlements.getclientsex(scode,ccode)

def getsettlementclientcomment(self,scode,ccode):

return self.__settlements.getclientcomment(scode,ccode)

 

def getsettlementclientcodes(self,code):return self.__settlements.getclientcodes(code)

 

def getsettlementclientshotelstr(self,code):return self.__settlements.getclientshotelstr(code)

 

def getsettlementhotelstr(self,code):return self.__settlements.gethotelstr(code)

 

def getsettlementhotelstrs(self):

return [self.getsettlementhotelstr(s) for s in self.getsettlementcodes()]

 

Класс “hotel” - главный модуль при последующей работе с базами данных xml и sql, в котором вызываются основные функции для работы с программой. Все данные и операции проходят через него.

Далее следует описание класса “dataxml”.

# -*- coding: utf-8 -*-

from xml.dom.minidom import parse, Document

 

class dataxml:

def read(self,inp,hot):

dom=parse(inp)

dom.normalize()

for node in dom.childNodes[0].childNodes:

if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="client"):

code,surname,name,secname,series,number,sex,comment=1,"","","","","","",""

for t in node.attributes.items():

if t[0]=="code":code=int(t[1])

if t[0]=="surname":surname=str(t[1])

if t[0]=="name":name=str(t[1])

if t[0]=="secname":secname=str(t[1])

if t[0]=="series":series=int(t[1])

if t[0]=="number":number=int(t[1])

if t[0]=="sex":sex=str(t[1])

if t[0]=="comment":comment=str(t[1])

hot.newclient(code,surname,name,secname,series,number,sex,comment)

if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="room"):

code,number,occupancy,comfort,price,comment=1,"","","","",""

for t in node.attributes.items():

if t[0]=="code":code=int(t[1])

if t[0]=="number":number=int(t[1])

if t[0]=="occupancy":occupancy=int(t[1])

if t[0]=="comfort":comfort=str(t[1])

if t[0]=="price":price=int(t[1])

if t[0]=="comment":comment=str(t[1])

hot.newroom(code,number,occupancy,comfort,price,comment)

if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="settlement"):

code,date_in,date_out,room,comment=1,"","",None,""

for t in node.attributes.items():

if t[0]=="code":code=int(t[1])

if t[0]=="date_in":date_in=str(t[1])

if t[0]=="date_out":date_out=str(t[1])

if t[0]=="room":room=hot.findRoomByCode(int(t[1]))

if t[0]=="comment":comment=str(t[1])

hot.newsettlement(code,date_in,date_out,room,comment)

for n in node.childNodes:

if (n.nodeType==n.ELEMENT_NODE)and(n.nodeName=="client"):

for t in n.attributes.items():

if t[0]=="code":client=hot.findClientByCode (int(t[1]))

hot.appendsettlementclient(code,client)

def write(self,out,hot):

dom=Document()

root=dom.createElement("hotel")

dom.appendChild(root)

for c in hot.getclientcodes():

cli=dom.createElement("client")

cli.setAttribute("code",str(c))

cli.setAttribute("surname",hot.getclientsurname(c))

cli.setAttribute("name",hot.getclientname(c))

cli.setAttribute("secname",hot.getclientsecname(c))

cli.setAttribute("series",str(hot.getcl<



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: