Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование АИС.pdf
Скачиваний:
250
Добавлен:
05.06.2015
Размер:
3.32 Mб
Скачать

0.2.3 Развитие постановки задачи

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

Поскольку сотрудники могут одновременно входить в разные подразделения, заменим Subdivision на Group. Также Subdivision образовывали иерархическую структуру, а Group нет, поэтому для

организации хранения введем множество групп Groups. Из предыдущего решения задачи видно, что Collaborators, TelephoneTypes, Telephones и теперь и Groups обладают общими свойствами и поведением, а именно все они множества с запретом на добавление элемента если он уже там есть. Поэтому они могут быть порождены от общего класса Suite (Набор), который в свою очередь порожден от стандартного типа языка Python set. Атрибуты и операции классов уже описаны в предыдущей задаче.

Объектная модель и её реализация

Изменения, по сравнению с предыдущей задачей, коснулись в основном классов TelephoneRecord,

TelephoneDir. Это связано с тем, что теперь запись в телефоном справочнике представляет собой набор из телефона, сотрудника и группы. Соответственно TelephoneDir содержит Telephones,

Collaborators и Groups.

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

2

3 """

4 Телефонная книга организации

5 """

6

7 class Suite(set):

8"""

9 Множество с запретом на добавление элементов

10уже содержащихся в нём

11"""

12def add(self, elt):

13assert elt not in self

14set.add(self, elt)

16class Collaborator:

17"""

18Сотрудник

19"""

20def __init__(self, code, family, name, patronym):

21self.code = code

22self.family = family

23self.name = name

24self.patronym = patronym

26def __hash__(self):

27return hash(self.code)

28

29def __eq__(self, other):

30return self.code == other.code

32class Collaborators(Suite):

33"""

34Сотрудники

35"""

36pass

37

38class Group:

39"""

40Группа сотрудников

41"""

42def __init__(self, name):

43self.name = name

44

45def __hash__(self):

46return hash(self.name)

47

48def __eq__(self, other):

49return self.name == other.name

51class Groups(Suite):

52"""

53Группы

54"""

55pass

56

57class TelephoneType:

58"""

59Тип телефона

60"""

61def __init__(self, name):

62self.name = name

63

64def __hash__(self):

65return hash(self.name)

66

67def __eq__(self, other):

68return self.name == other.name

70class TelephoneTypes(Suite):

71"""

72Типы телефонов

73"""

74pass

75

76class Telephone:

77"""

78Телефон

79"""

80def __init__(self, telephone, telephoneType):

81self.number = telephone

82self.type = telephoneType

83

84def __hash__(self):

85return hash(self.number)

86

87def __eq__(self, other):

88return self.number == other.number

90class Telephones(set):

91"""

92Телефоны

93"""

94def __init__(self, telephoneTypes):

95set.__init__(self)

96self.telephoneTypes = telephoneTypes

98def add(self, telephone):

99assert telephone not in self

100assert telephone.type in self.telephoneTypes

101set.add(self, telephone)

102

103class TelephoneRecord:

104"""

105Запись в телефонном справочнике

106"""

107def __init__(self, telephone, collaborator, group):

108self.telephone = telephone

109self.collaborator = collaborator

110self.group = group

111

112def __hash__(self):

113return hash((self.telephone, self.collaborator, self.group))

115def __eq__(self, other):

116return self.telephone == other.telephone and \

117

self.collaborator == other.collaborator and \

118

self.group == other.group

119

 

120class TelephoneDir(set):

121"""

122Телефонный справочник

123"""

124def __init__(self, telephones, collaborators, groups):

125set.__init__(self)

126self.telephones = telephones

127self.collaborators = collaborators

128self.groups = groups

129

130def add(self, telephoneRecord):

131assert telephoneRecord.telephone in self.telephones

132assert telephoneRecord.collaborator in self.collaborators

133assert telephoneRecord.group in self.groups

134assert telephoneRecord not in self

135set.add(self, telephoneRecord)

136

137 if __name__ == ’__main__’: 138 import tdcsv

139

140 telephoneDir = tdcsv.load()

141

142for r in telephoneDir:

143if r.group.name == ’помощник проректора’ and r.collaborator.family.find(’ск’) >= 0:

144print r.telephone.number, "%s %s. %s."% \

145 (r.collaborator.family, r.collaborator.name[:2], r.collaborator.patronym[:2])

146

147for r in telephoneDir:

148if r.group.name == ’зав. кафедрой’ and r.collaborator.family.find(’сс’)

>= 0:

149print r.telephone.number, "%s %s. %s."% \

150

(r.collaborator.family, r.collaborator.name[:2],

r.collaborator.patronym[:2])

Заметно, что один и тот же сотрудник может быть членом различных групп. Поэтому работа запросов дала немного другой результат.

51-57-39 Виноградский С. Г.

51-18-84 Лосатинская А. С.

26-16-96 Коссович Л. Ю.

Сработал и второй запрос.