Найти в Дзене
Изучаем C# - Деревья и рекурсия (часть 3)
Часть 1: Часть 2: Пусть мы хотим найти все организации в дереве, которые удовлетворяют определённому условию. Подумаем, каким будет метод поиска. Во-первых, он будет принимать на вход корневую организацию и условие поиска. Условие может быть любым куском кода, то есть, это будет функция. Функция условия должна принимать на вход организацию, которую мы хотим проверить, и выдавать в ответ логическое значение true/false. Таким образом, функция условия будет иметь тип данных Func<Organization, bool>...
1 месяц назад
Изучаем C# - Деревья и рекурсия (часть 2)
В прошлой статье мы изучили, как выглядят деревья в программировании и как обойти дерево. Для задания дерева достаточно в каждом узле дерева хранить либо список дочерних объектов, либо ссылку на родительский. Если есть что-то одно, то можно найти и второе. У нас уже есть класс Organization (организация), и каждая организация содержит в себе список дочерних Childes: Также у организации есть Id родительской - ParentId. Сейчас он не используется и потому горит серым. Из прошлой статьи у нас также остался пример организаций и код для обхода дерева в OrganizationTreeWalker...
1 месяц назад
Изучаем C# - Деревья и рекурсия (часть 1)
В программировании часто возникают древовидные структуры данных, так что нужно уметь с ними работать. Например, организации и подразделения - одна организация может содержать несколько дочерних организаций и подразделений, те в свою очередь могут содержать ещё дочерние организации и так далее: Каждая организация хранит в себе список дочерних организаций или ссылку на родительскую - таким образом, во всех задачах, где объект должен хранить список дочерних объектов или ссылку на родительский объект возникает дерево...
1 месяц назад
Изучаем C# - Пример ООП (часть 4)
Предыдущие статьи: В прошлой статье мы сделали CRUD-сервисы для работы с сущностями Person (человек) и DisabilitySheet (больничный). Теперь надо сделать CRUD-сервисы для AppointmentOrder (приказ о назначении) и HolidayOrder (приказ об отпуске). Поскольку у этих двух сущностей есть общие поля, мы создали для них общий базовый класс BaseOrder (базовый приказ). Поскольку иерархия CRUD-сервисов повторяет иерархию сущностей, то мы должны сначала сделать сервис для BaseOrder и уже потом - для этих двух сущностей...
1 месяц назад
Изучаем C# - Пример ООП (часть 3)
Часть 1: Часть 2: Сейчас будет трудная тема, но зато она активно используется на практике. Итак, мы имеем сервис для людей - PersonService. Нам также надо создать сервисы для каждой нашей сущности: AppointmentOrderService, HolidayOrderService, DisabilitySheetService. Однако, если мы начнём их создавать, то увидим, что они похожи друг на друга. Много кода дублируется. А дублирование кода - это плохо, потому что его надо будет поддерживать: со временем придётся делать какой-то новый функционал, что-то менять, и придётся менять каждый сервис по отдельности, что долго и неудобно...
1 месяц назад
Изучаем C# - Пример ООП (часть 2)
Ранее мы начали делать большой пример объектно-ориентированного программирования: Теперь допишем его. Сделаем в нашем PersonService методы Create / Read / Update / Delete ("Создать / Считать / Обновить / Удалить"). Начнём по порядку с Create(): Поскольку метод Create должен создавать человека, он получает его на вход. Мы сначала проверяем, не существует ли уже этот человек, по Id. Если такого человека нет, то метод Persons.FirstOrDefault() вернёт null и мы зайдём в if, где будет кинуто исключение...
1 месяц назад
Изучаем C# - Пример ООП (часть 1)
Мы завершаем изучение объектно-ориентированного программирования, и теперь нам нужен хороший пример, на котором можно было бы всё это повторить. Пусть мы хотим сделать систему для веб-приложения, работающего с электронными документами. Это большая и сложная задача, но зато она приближена к тому, что делают в реальной жизни. Электронные документы каждого вида можно создавать (Create), читать (Read), обновлять (Update) и удалять (Delete). Подобные системы называются CRUD - по первым буквам действий...
1 месяц назад
Изучаем C# - Универсальные (обобщённые) типы
Пусть у нас есть несколько классов животных: базовое животное BaseAnimal, черепаха Turtle, собака Dog. Если вы не создали их в предыдущих статьях, ничего страшного - просто создайте пустые классы. Черепаха и собака наследуются от базового животного. Пусть мы хотим сделать коробки для животных. Коробка - это такой класс, который должен работать так: То есть, при создании коробки черепаха помещается внутрь, а при вызове метода Get() выдаётся наружу. Реализация коробки проста: Получив черепаху на вход конструктора, коробка запоминает её в приватном поле, чтобы затем выдать наружу...
1 месяц назад
Изучаем C# - Методы расширения
Некоторые классы в C# мы не можем изменить. Например, это классы из разных библиотек. Чтобы изменить их, нужно было бы влезть внутрь библиотеки и отредактировать её, что невозможно. Но бывает, что нам хочется добавить в такие классы новый метод. Решение проблемы есть - написать метод расширения. Метод расширения - это метод, который написан вне класса, но может применяться так же, как обычный метод - объект.Метод() Чтобы сделать метод расширения, нужно соблюсти ряд условий: Пусть даны два списка из строк...
2 месяца назад
Изучаем C# - Ещё про методы (часть 2)
Пусть у нас есть класс Point ("Точка") (оставшийся от предыдущей статьи или новый): В C# любой объект может превращаться в строку. Например, если мы напишем в файле Program.cs печать в консоль точки point1, то в консоли появится За превращение объекта в строку отвечает метод ToString() (его название переводится как "к строке"). Он есть у всех классов, даже когда мы его не пишем, в силу наследования всех классов от object (потом мы изучим, что это такое). Также ToString() вызывается автоматически, нам необязательно писать point1...
2 месяца назад
Изучаем C# - Пишем статические поля и методы. Паттерн Singleton
Мы уже умеем писать методы в классах. Обычные методы вызываются у объектов класса. Например, пусть мы имеем класс Point ("точка"): У него есть два конструктора (для создания точки с 0, 0 и с заданными x, y) и метод PrintMe(), который печатает координаты точки в консоль. Это значит, что если мы создадим объект этого класса, то у объекта внутри будет метод PrintMe(): Также внутри точки будут поля X и Y. Они создаются внутри каждой точки. Статические поля и методы отличаются от обычных тем, что они принадлежат не конкретному объекту класса, а классу как таковому...
2 месяца назад
Изучаем C# - Абстракции в ООП. Интерфейсы
В бытовом смысле, например, автомобильный интерфейс означает руль, педали, спидометр и тахометр, кнопки, то есть, приборы, через которые водитель взаимодействует с автомобилем. Слово "Интерфейс" и переводится как внешний вид для взаимодействия. Благодаря тому, что руль и педали на всех автомобилях работают одинаково, то есть, разные автомобили имеют одинаковый интерфейс, водителю не нужно переучиваться, чтобы взаимодействовать с другим автомобилем. Также и в программировании: интерфейс - набор публичных методов, которые видны тем, кто взаимодействует с классом...
2 месяца назад