Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 / пр2

.pdf
Скачиваний:
1
Добавлен:
16.05.2025
Размер:
339.33 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА №41

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

Доцент, к. т. н.

 

 

 

С. А. Чернышев

 

 

 

 

 

должность, уч. степень,

 

подпись, дата

 

инициалы, фамилия

звание

 

 

 

 

 

 

Практическая работа №2

На тему: Порождающие шаблоны GoF

по дисциплине: Технологии программирования

РАБОТУ ВЫПОЛНИЛА

 

 

 

 

СТУДЕНТКА ГР. №

Z0411

28.05.23

 

М. В. Карелина

 

 

 

 

 

 

 

номер

 

подпись, дата

 

инициалы, фамилия

 

группы

 

 

Номер студенческого билета: 2020/3477

Санкт-Петербург

2023

Цель работы:

познакомиться с основными способами реализации порождающих шаблонов проектирования GoF средствами Python.

Вариант 8. Задания 8 и 13.

Разработайте консольное приложение, которое моделирует создание электронных курсов с разными модулями и уровнями сложности. Объявите класс ElearningCourse с полями для хранения информации о курсе (название,

описание, модули, уровень сложности и т.д.). Напишите класс

ElearningCourseBuilder с методами для пошагового создания курса (set_title(), set_description(), add_module(), set_difficulty_level() и т.д.), после чего создайте несколько конкретных строителей для разных тематик курсов

(ProgrammingCourseBuilder, DesignCourseBuilder, MarketingCourseBuilder).

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

Текст программы:

class ElearningCourse: def __init__(self):

self.title = "" self.description = "" self.modules = [] self.difficulty_level = ""

def __str__(self):

return f"Title: {self.title}\nDescription: {self.description}\nModules: {self.modules}\nDifficulty Level: {self.difficulty_level}"

class ElearningCourseBuilder: def __init__(self):

self.course = ElearningCourse()

def set_title(self, title): self.course.title = title

def set_description(self, description): self.course.description = description

def add_module(self, module): self.course.modules.append(module)

def set_difficulty_level(self, difficulty_level): self.course.difficulty_level = difficulty_level

def get_course(self):

return self.course

class ProgrammingCourseBuilder(ElearningCourseBuilder): def __init__(self):

super().__init__()

self.course.title = "Programming Course"

self.course.description = "Learn to program in various languages" self.course.difficulty_level = "Intermediate"

def add_module(self, module): self.course.modules.append(f"Programming {module}")

class DesignCourseBuilder(ElearningCourseBuilder): def __init__(self):

super().__init__() self.course.title = "Design Course"

self.course.description = "Learn various design techniques" self.course.difficulty_level = "Beginner"

def add_module(self, module): self.course.modules.append(f"Design {module}")

class MarketingCourseBuilder(ElearningCourseBuilder): def __init__(self):

super().__init__()

self.course.title = "Marketing Course"

self.course.description = "Learn various marketing strategies" self.course.difficulty_level = "Advanced"

def add_module(self, module): self.course.modules.append(f"Marketing {module}")

class ElearningCourseDirector: def __init__(self):

self.builder = None

def set_builder(self, builder): self.builder = builder

def construct_course(self, difficulty_level): self.builder.set_difficulty_level(difficulty_level) self.builder.add_module("Introduction") self.builder.add_module("Intermediate") self.builder.add_module("Advanced")

def get_course(self):

return self.builder.get_course()

def main():

director = ElearningCourseDirector()

while True:

print("Choose a course:") print("1. Programming Course") print("2. Design Course") print("3. Marketing Course")

choice = input("Enter choice (1-3): ")

if choice == "1":

builder = ProgrammingCourseBuilder() break

elif choice == "2":

builder = DesignCourseBuilder() break

elif choice == "3":

builder = MarketingCourseBuilder() break

else:

print("Invalid choice. Please try again.")

while True:

difficulty_level = input("Enter difficulty level (Beginner, Intermediate, or Advanced): ")

if difficulty_level in ["Beginner", "Intermediate", "Advanced"]: break

else:

print("Invalid difficulty level. Please try again.")

director.set_builder(builder) director.construct_course(difficulty_level) course = director.get_course()

print("Course created:") print(course)

if __name__ == "__main__": main()

Результат выполнения:

Текст тестов:

import unittest from pr2 import *

class TestDesignCourseBuilder(unittest.TestCase): def test_add_module(self):

builder = DesignCourseBuilder() builder.add_module("Intermediate") builder.add_module("Advanced") course = builder.get_course()

expected_output = "Title: Design Course\nDescription: Learn various design techniques\nModules: ['Design Intermediate', 'Design Advanced']\nDifficulty Level: Beginner"

self.assertEqual(str(course), expected_output)

class TestElearningCourseDirector(unittest.TestCase): def test_create_programming_course(self):

director = ElearningCourseDirector() builder = ProgrammingCourseBuilder() director.set_builder(builder) director.construct_course("Intermediate") course = director.get_course()

expected_output = "Title: Programming Course\nDescription: Learn to program in various languages\nModules: ['Programming Introduction', 'Programming Intermediate', 'Programming Advanced']\nDifficulty Level: Intermediate"

self.assertEqual(str(course), expected_output)

def test_create_marketing_course(self): director = ElearningCourseDirector() builder = MarketingCourseBuilder() director.set_builder(builder) director.construct_course("Advanced") course = director.get_course()

expected_output = "Title: Marketing Course\nDescription: Learn various marketing strategies\nModules: ['Marketing Introduction', 'Marketing Intermediate', 'Marketing Advanced']\nDifficulty Level: Advanced"

self.assertEqual(str(course), expected_output)

if __name__ == '__main__': unittest.main()

Результат выполнения:

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

котором реализуйте методы для записи сообщений разного уровня (info(), warning(), error() и т.д.). Пользователь должен иметь возможность использовать логгер для записи сообщений.

Текст программы:

class LoggerSingleton: __instance = None

def __init__(self):

if LoggerSingleton.__instance != None:

raise Exception("LoggerSingleton is a singleton class. Use getInstance() method instead")

else:

LoggerSingleton.__instance = self self.log_file = "log.txt"

@staticmethod

def getInstance():

if LoggerSingleton.__instance == None: LoggerSingleton()

return LoggerSingleton.__instance

def info(self, message):

print("[INFO]: {}".format(message)) self._write_to_log("[INFO]: {}".format(message))

def warning(self, message): print("[WARNING]: {}".format(message))

self._write_to_log("[WARNING]: {}".format(message))

def error(self, message): print("[ERROR]: {}".format(message))

self._write_to_log("[ERROR]: {}".format(message))

def log_from_input(self):

message = input("Введите сообщение: ") self._write_to_log("[INPUT]: {}".format(message))

def _write_to_log(self, message):

with open(self.log_file, "a") as f: f.write("{}\n".format(message))

logger = LoggerSingleton.getInstance() logger.log_from_input()

Результат выполнения:

Текст тестов:

import unittest

from h import LoggerSingleton

class TestLoggerSingleton(unittest.TestCase): def setUp(self):

self.logger = LoggerSingleton.getInstance()

def test_write_to_log(self):

self.logger._write_to_log("Test message for _write_to_log()") with open(self.logger.log_file, "r") as f:

self.assertTrue("Test message for _write_to_log()" in f.read())

def test_singleton_instance(self):

logger1 = LoggerSingleton.getInstance() logger2 = LoggerSingleton.getInstance()

self.assertEqual(logger1, logger2)

def test_log_file_exists(self): self.assertIsNotNone(self.logger.log_file)

if __name__ == '__main__': unittest.main()

Результат выполнения:

Вывод

В ходе выполнения данной работы мы поближе познакомились с абстрактными классами, а также получили навыки работы с порождающими шаблонами GoF. В моей работе были использованы паттерны Factory и Builder.

Соседние файлы в папке 2