Система учёта регистрации и размещения клиентов отеля
КУРСОВАЯ РАБОТА
Система учёта регистрации и размещения клиентов отеля
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
. Объектно-ориентированное программирование
.1 Основные понятия ООП
.2 Принципы ООП
.3 Язык программирования Python
. Практическая часть
.1 Описание предметной области
.2 Диаграмма классов
.3 Реализация на языке Python
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ВВЕДЕНИЕ
Одной из важнейших задач при ведении такого бизнес как отель это создание условий для автоматизации его внутренних процессов. При отсутствии автоматических систем записи данных работа менеджеров может быть слишком долгой и нудной. Самое главное, что из-за мелких не точностей и ошибок людей, возможны серьезные последствия и даже финансовые проблемы, а при сегодняшнем уровне научного прогресса и высокой конкуренции на рынке услуг, отсутствие автоматизации может привести даже к краху бизнеса.
Цель данной работы: используя методы объектно-ориентированного программирование (ООП), создать модель информационной системы регистрации и размещения клиентов отеля.
Задачи работы: анализ теоретических основ ООП, изучение языка программирования Python, применение полученных знаний на практике для реализации предметной области.
Данная работа состоит из двух глав. В первой глава состоит из трех частей. В первой и второй частях говорится об объектно-ориентированном подходе. Здесь подробно освещается основная информация о понятиях и принципах ООП. Третья часть посвящена самому языку программирования Python, истории его создания и развития, основных алгоритмических конструкциях и типах данных. Во второй главе глава разделена на трети части: в первой производится описание предметной области, во второй создаётся диаграмма классов в соответствии с выбранной предметной областью и описание основных классов, и в третьей представлена реализация на языке Python.
1. Объектно-ориентированное программирование
.1Основные понятия ООП
Объектно-ориентированное программирование (ООП) - это способ организации кода в программе путем его группировки в виде объектов, то есть отдельных элементов, которые включают информацию (значения данных) и функции. Объектно-ориентированный подход к организации программы позволяет группировать определенные фрагменты информации (например, информацию об отеле, такую как ФИО клиента или характеристику номера) вместе с часто используемыми функциями или действиями, связанными с этой информацией (например, «удалить клиента из поселения» или «добавить новый номер отеля»).
По определению авторитета в области объектно-ориентированных методов разработки программ Гради Буча «объектно-ориентированное программирование (ООП) - это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости».
Объектно-ориентированная методология так же, как и структурная методология, была создана с целью дисциплинировать процесс разработки больших программных комплексов и тем самым снизить их сложность и стоимость.
Объектно-ориентированная методология преследует те же цели, что и структурная, но решает их с другой отправной точки и в большинстве случаев позволяет управлять более сложными проектами, чем структурная методология.
Сейчас объектно-ориентированное программирование стало настолько распространенным подходом в мире, что понимание его основных концепций стало необходимо для всех, кто собирается заняться программированием.
Объектно-ориентированное программирование - это парадигма программирования (совокупность идей и понятий, определяющая стиль написания программ). В нем основными концепциями являются понятия объектов и классов.
Класс - это тип данных, определяющий схожие объекты. Объект же является экземпляром некоторого класса.
Первичным понятием объектно-ориентированного подхода к программированию является понятие класса как совокупности объектов. Заметим, что класс при объектно-ориентированном подходе является аналогом понятия типа в том смысле, что к нему относят лишь объекты, отобранные по определенному правилу. Это правило возможно формализовать математически посредством предикатной функции, т.е. функции, область значений которой совпадает со значениями истинности: «истина» и «ложь». При этом, тот или иной объект относится к классу, если значение аппликации функции к данному объекту истинно, и не относится в противном случае.
Объект - синтаксически обособленная часть программы для имитации определенного ориентира из реального мира. Объект - упрощенное, идеализированное описание сущности предметной области, которая способна сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. Неотъемлемые характеристики объекта:
·состояние
·поведение
·идентифицируемость
Состояние объекта объединяет все его поля данных (статический компонент, т.е. неизменный) и текущие значения каждого из этих полей (динамический компонент, т.е. обычно изменяющийся).
Поведение выражает динамику изменения состояний объекта и его реакцию на поступающие сообщения, т.е. как объект изменяет свои состояния и взаимодействует с другими объектами.
Идентификация (распознавание) объекта - это свойство, которое позволяет отличить объект от других объектов того же или других классов. Осуществляется идентификация посредством уникального имени (кода), которым наделяется объект в программе, впрочем, как и любая другая переменная.
Предмет моделирования при построении объекта в ООП может быть различным. Например, могут существовать следующие типы абстракции, используемые при построении объекта:
·абстракция понятия: объект - это модель какого-то понятия предметной области;
·абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;
·абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;
·случайная абстракция: объект объединяет не связанные между собой операции.
Иногда нужно идентифицировать объекты в ООП, т.е., если имеются два объекта, как можно определить что эти объекты разные. На самом деле существует два вопроса: равны ли два объекта или тождественны. Обычно для идентификации применяются специальные атрибуты объектов - идентификаторы. В свою очередь, зная идентификаторы объектов можно точно определить, являются ли они тождественными или нет. Поэтому в объектно-ориентированном методе каждый модуль должен самостоятельно инициализировать свои структуры данных [1].
Индивидуальные объекты называются экземплярами класса, а класс в ООП - это шаблон по которому строятся объекты.
Класс - это конструкция, которая позволяет создавать собственные настраиваемые типы путем группирования переменных других типов, методов и событий. В некотором смысле классы объединяют в себе записи и программы, обрабатывающие эти записи, - методы реализуют логику интерпретации и изменения данных (этот стиль программирования потому и называется объектно-ориентированным, что при таком подходе всегда обрабатываются данные объектов) [2].
Класс похож на проект. Он определяет данные и поведение типа. Если класс не объявлен как статический, клиентский код может использовать его, создавая объекты или экземпляры, назначенные переменной. Переменная остается в памяти до тех пор, пока все ссылки на нее не выйдут из области. В этот момент среда CLR помечает ее пригодной для сборки мусора. Если класс объявляется как статический, то в памяти существует только одна копия, и клиентский код может получать к ней доступ только через сам класс, а не переменную экземпляра. Объект, созданный на основе некоторого класса, называется экземпляром класса. Все объекты определенных пользователем классов являются экземплярами класса. Тем не менее, объекты даже с одним и тем же состоянием могут быть разными объектами. Поэтому и говорят, что они имеют разную индивидуальность.
В отличие от структур, классы поддерживают наследование, фундаментальную характеристику объектно-ориентированного программирования.
Классы, объекты и методы имеют разные вариации, что позволяет сделать процесс реализации и сами программы достаточно удобными, гибкими и универсальными.
1.2Концепции ООП
Объектно-ориентированное программирование требует понимания его основных концепций, на которых оно построено. Во всех объектно-ориентированных языках программирования реализованы следующие основные «постулаты» ООП:
·Инкапсуляция
·Наследование
·Полиморфизм
Все эти механизмы важны для разработки и использования абстракций.
Инкапсуляция - механизм, связывающий вместе код и данные, которыми он манипулирует, и одновременно защищающий их от произвольного доступа со стороны другого кода, внешнего по отношению к рассматриваемому. Доступ к коду и данным жестко контролируется интерфейсом. Основой инкапсуляции при ООП является класс. Механизма инкапсуляции позволяет оставлять скрытыми от пользователя некоторые детали реализации класса (то есть инкапсулировать их в классе), что упрощает работу с объектами этого класса.
Наследование - механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базового класса). При использовании наследования новый объект не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста. Наследование позволяет какому-либо объекту наследовать от своего родителя общие атрибуты, а для себя определять только те характеристики, которые делают его уникальным внутри класса. Наследование есть очень важное понятие, поддерживающее концепцию иерархической классификации.
Полиморфизм - механизм, позволяющий использовать один и тот же интерфейс для общего класса действий [3]. Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию - например, реализация класса может быть изменена в процессе наследования. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Полиморфизм - один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием). Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода.
.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].
В настоящее время язык совершенствуется особенно активно, так как теперь над ним работает не только команда создателей, но и целое сообщество программистов со всего мира. Но даже сейчас Гвидо ван Россум остается ведущим специалистом языка и за ним всегда стоит последнее слово о направлении его развития.
2. Практическая часть
.1 Описание предметной области
Задачей является фиксирование информационной работы отеля. Деятельность организована следующим образом: отель предоставляет номера клиентам на определенный срок. Каждый номер характеризуется вместимостью, комфортностью (люкс, полулюкс, обычный), ценой и некоторым комментарием. Клиентами являются различные лица, о которых собирается определенная информация (фамилия, имя, отчество, паспортные данные (серия паспорта, номер паспорта), пол и некоторый комментарий). Сдача номера производится по подходящим клиенту критериям из указанных выше параметров. При поселении фиксируется дата поселения. При выезде из гостиницы для каждого места запоминается дата освобождения.
Клиенты (Клиент, Фамилия, Имя, Отчество, Серия, Номер, Комментарий).
Номера (Номер, Количество человек, Комфортность, Цена, Комментарий).
Поселение (Клиент, Номер, Дата поселения, Дата освобождения, Комментарий).
2.2 Диаграмма классов
Рисунок 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:__init__(self,code=1,comment=''):.setcode(code).setcomment(comment)setcode(self,code):not(isinstance(code, int)):Exception("Znachenie polja *cod* dolzhno byt' celym chislom")(code < 0):Exception("Znachenie polja kod dolzhno byt' polozhitel'nym. Peredano %i" % code).__code=codesetcomment(self,comment):.__comment=commentgetcode(self):self.__codegetcomment(self):self.__comment
Далее следует описание класса generalistedit.
# -*- coding: utf-8 -*-general import general
generallistedit():__init__(self):self.__list=[]clear(self):self.__list=[]findByCode(self,code):h in self.__list:h.getcode()==code:hgetcodes(self):return [s.getcode() for s in self.__list]getnewcode(self):=0c in self.getcodes():c>m:m=cm+1appendlist(self,value):self.__list.append(value)removelist(self,code):s in self.__list:s.getcode()==code:self.__list.remove(s)getcomment(self,code):return self.findByCode(code).getcomment()
Далее следует описание класса client.
# -*- coding: utf-8 -*-general import general = {"man", "woman", "мужской", "женский"}
class client(general):__init__(self,code,surname,name,secname,series,number,sex,comment=""):.__init__(self,code,comment).setsurname(surname).setname(name).setsecname(secname).setseries(series).setnumber(number).setsex(sex)setsurname(self,surname):not(isinstance(surname, str)):Exception("Znachenie polja *familia* dolzhno byt' strokoj").__surname=surnamesetname(self,name):not(isinstance(name, str)):Exception("Znachenie polja *imya* dolzhno byt' strokoj").__name=namesetsecname(self,secname):not(isinstance(secname, str)):Exception("Znachenie polja *otchestvo* dolzhno byt' strokoj").__secname=secnamesetseries(self,series):not(isinstance(series, int)):Exception("Znachenie polja *serija* dolzhno byt' celym chislom")(series < 1000 or series > 9999):Exception("Znachenie polja *serija* dolzhno byt' polozhitel'nym i v predele ot 1000 do 9999").__series=seriessetnumber(self,number):not(isinstance(number, int)):Exception("Znachenie polja *nomer* dolzhno byt' celym chislom")(number < 100000 or number > 999999):Exception("Znachenie polja *nomer* dolzhno byt' polozhitel'nym i v predele ot 100000 do 999999").__number=numbersetsex(self,sex):not(isinstance(sex, str)):Exception("Znachenie polja *pol* dolzhno byt' strokoj")not(sex in sextypes):Exception("Pol dolzhen byt' muzhskoj ili zheskij").__sex=sexgetsurname(self):self.__surnamegetname(self):self.__namegetsecname(self):self.__secnamegetseries(self):self.__seriesgetnumber(self):self.__numbergetsex(self):self.__sexgetperson(self):self.__surname + " " + self.__name[0] + "." + " " + self.__secname[0] + "."
Далее следует описание класса сlientlistedit