#set text(size: 1.3em) #show raw.where(block: false): box.with( fill: luma(240), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, ) #show raw.where(block: true): block.with( fill: luma(240), inset: 10pt, radius: 4pt, ) // title #align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики] \ \ \ #align(center)[Факультет инфокоммуникационных технологий] #align(center)[Направление подготовки 11.03.02] \ \ #align(center)[Лабораторная работа №6] #align(center)[Создание и использование классов] \ \ \ //#align(center)[Вариант 19] \ \ \ \ \ \ \ #align(right)[Выполнил:] #align(right)[Дощенников Никита Андреевич] #align(right)[Группа: К3221] #align(right)[Проверил:] #align(right)[Иванов Сергей Евгеньевич] \ \ #align(center)[Санкт-Петербург] #align(center)[2025] #pagebreak() === Цель работы: Изучить понятия класса как пользовательского типа данных и приобрести навыки работы с классами. === Упражнение 1. Разработка класса Book. В этом упражнении я создал класс `Book` c полями автор, название, год издания и стоимость аренды за книгу, а также методами. ```cs using System; class Book { private String author; private String title; private String publisher; private int pages; private int year; private static double price = 9; static Book() { price = 10; } public Book() { } public Book(String author, String title, String publisher, int pages, int year) { this.author = author; this.title = title; this.publisher = publisher; this.pages = pages; this.year = year; } public Book(String author, String title) { this.author = author; this.title = title; } public void SetBook(String author, String title, String publisher, int pages, int year) { this.author = author; this.title = title; this.publisher = publisher; this.pages = pages; this.year = year; } public static void SetPrice(double price) { Book.price = price; } public void Show() { Console.WriteLine("\nКнига:\n Автор: {0}\n Название: {1}\n Год издания: {2}\n {3} стр.\n Стоимость аренды: {4}", author, title, year, pages, Book.price); } public double PriceBook(int s) { double cost = s * price; return cost; } } ``` Тесты: ```cs public static void Main(string[] args) { Book b1 = new Book(); b1.SetBook("Пушкин А.С.", "Капитанская дочка", "Вильямс", 123, 2012); Book.SetPrice(12); b1.Show(); Console.WriteLine("\n Итоговая стоимость аренды: {0} р.", b1.PriceBook(3)); } ``` Пример: #align(center)[#image("assets/1.png")] === Упражнение 2. Использование конструкторов. В этом упражнении я добавил конструктор для инициализации объекта. Тесты: ```cs public static void Main(string[] args) { Book b1 = new Book(); b1.SetBook("Пушкин А.С.", "Капитанская дочка", "Вильямс", 123, 2012); Book.SetPrice(12); b1.Show(); Console.WriteLine("\n Итоговая стоимость аренды: {0} р.", b1.PriceBook(3)); Book b2 = new Book("Толстой Л.Н.", "Война и мир", "Наука и жизнь", 1234, 2013); b2.Show(); Book b3 = new Book("Лермонтов М.Ю.", "Мцыри"); b3.Show(); } ``` Примеры: #align(center)[#image("assets/2.png")] === Упражнение 3. Реализация класса Triangle. В этом упражнении я создал класс Triangle и разработал следующие элементы класса: - Поля: стороны треугольника. - Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон. - Методы, позволяющие вывести длины сторон треугольника на экран, расчитать периметр треугольника, расчитать площадь треугольника, реализовать проверку, позволяющую установить, существует ли треугольник с данными длинами сторон. ```cs using System; class Triangle { private int a; private int b; private int c; public Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } public void Show() { Console.WriteLine("a: {0}\nb: {1}\nc: {2}", a, b, c); } public int Perimeter() { return a + b + c; } public double Area() { double p = Perimeter() / 2; return Math.Sqrt(p * (p - a) * (p - b) * (p - c)); } public bool Exists() { if (a <= 0 || b <= 0 || c <= 0) return false; double maxSide = Math.Max(Math.Max(a, b), Math.Max(b, c)); if (maxSide >= a + b + c - maxSide) return false; return true; } } ``` Тесты: ```cs public static void Main(string[] args) { Triangle t1 = new Triangle(3, 4, 5); t1.Show(); Console.WriteLine("perimeter = {0}", t1.Perimeter()); Console.WriteLine("area = {0}", t1.Area()); Console.WriteLine("does this triangle exist? {0}", t1.Exists()); Triangle t2 = new Triangle(3, 4, 7); t2.Show(); Console.WriteLine("does this triangle exist? {0}", t2.Exists()); } ``` Пример: #align(center)[#image("assets/3.png")] === Выводы. В ходе проделанной работы я изучил понятия класса как пользовательского типа данных и приобрел навыки работы с классами. === Code review. (by #link("https://zzzcode.ai")[zzzcode.ai]) *Резюме* Код, представленный выше, реализует два класса: `Book` и `Triangle`. Класс `Book` управляет информацией о книгах, включая автора, название, издателя, количество страниц и год издания. Класс `Triangle` отвечает за свойства треугольника, такие как стороны, периметр и площадь. В целом, код демонстрирует базовые принципы объектно-ориентированного программирования, но требует улучшений в области стиля, структуры и обработки ошибок. *Ошибка* В классе `Book` метод `SetBook` не проверяет входные параметры на корректность. Например, количество страниц и год издания могут быть отрицательными значениями. Это может привести к некорректным данным. Рекомендуется добавить валидацию входных данных. *Стиль кода* Код написан в целом в соответствии с общепринятыми стандартами C\#. Однако, использование типа `String` вместо `string` не является стандартным стилем C\#. Рекомендуется использовать `string` для повышения читаемости и соответствия стилю C\#. *Структура кода* Структура классов в целом логична, но методы и свойства можно было бы организовать более последовательно. Например, методы, связанные с установкой и получением значений, можно сгруппировать вместе. Это улучшит читаемость и упростит навигацию по коду. *Читаемость* Читаемость кода можно улучшить, добавив комментарии к методам и классам, чтобы объяснить их назначение. Также стоит использовать более описательные имена переменных и методов, чтобы сделать код более самодокументируемым. *Производительность* Код не содержит явных проблем с производительностью, однако использование статического поля `price` может быть улучшено. Если цена книги должна быть уникальной для каждого экземпляра, лучше сделать это полем экземпляра. *Масштабируемость* Код может быть сложно масштабировать из-за жесткой привязки к конкретным полям и методам. Рекомендуется рассмотреть возможность использования интерфейсов или абстрактных классов для улучшения гибкости и расширяемости. *Безопасность* Код не содержит явных уязвимостей, однако отсутствие валидации входных данных может привести к проблемам. Рекомендуется добавить проверки на корректность данных, чтобы избежать потенциальных ошибок. *Обработка ошибок* Обработка ошибок в коде отсутствует. Рекомендуется использовать исключения для обработки некорректных данных и других возможных ошибок, чтобы обеспечить более надежное выполнение программы. *Заключение* Код представляет собой хорошую основу для работы с книгами и треугольниками, но требует улучшений в области стиля, структуры и обработки ошибок. Внедрение предложенных изменений повысит качество кода и упростит его поддержку в будущем.