Backend
3.95K subscribers
36 photos
710 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
🤔 Какой пакет используется для работы с базой данных Cassandra в Java?
Anonymous Quiz
15%
DataStax Java Driver
14%
Hector
15%
Kundera
56%
All of the above
📌 Что такое инкапсуляция?

💬 Спрашивают в 19 % собеседований

Инкапсуляция — это один из основных принципов объектно-ориентированного программирования (ООП), который подразумевает скрытие внутренней реализации объекта и предоставление доступа к ней только через строго определенные методы или интерфейсы. Это помогает защитить данные от некорректного использования и обеспечивает контроль над изменением состояния объекта.

🤔 Основные аспекты инкапсуляции

1️⃣ Скрытие данных:

Внутреннее состояние объекта (переменные и данные) скрыто от внешнего мира и доступно только через методы класса.

2️⃣ Методы доступа:

Класс предоставляет публичные методы для взаимодействия с его внутренним состоянием. Эти методы часто называют геттерами (для получения значений) и сеттерами (для установки значений).

3️⃣ Контроль над данными:

Инкапсуляция позволяет контролировать как данные изменяются и обеспечивать их корректное состояние. Например, можно добавить проверки или ограничения в сеттеры.

🤔 Пример

Рассмотрим пример инкапсуляции на языке Python:
class Person:
def __init__(self, name, age):
self._name = name # Внутреннее состояние
self._age = age

# Геттер для имени
def get_name(self):
return self._name

# Сеттер для имени
def set_name(self, name):
if isinstance(name, str) and name:
self._name = name

# Геттер для возраста
def get_age(self):
return self._age

# Сеттер для возраста
def set_age(self, age):
if isinstance(age, int) and 0 <= age <= 120:
self._age = age

# Использование класса
person = Person("Alice", 30)
print(person.get_name()) # Вывод: Alice
print(person.get_age()) # Вывод: 30

person.set_name("Bob")
person.set_age(35)
print(person.get_name()) # Вывод: Bob
print(person.get_age()) # Вывод: 35

# Попытка установить некорректное значение
person.set_age(-5) # Значение не изменится из-за проверки в сеттере
print(person.get_age()) # Вывод: 35


🤔 Преимущества инкапсуляции

1️⃣ Защита данных: Скрытие внутреннего состояния объекта предотвращает его некорректное использование и изменение.

2️⃣ Упрощение поддержки: Инкапсуляция облегчает модификацию и поддержку кода, поскольку внутренние изменения объекта не влияют на внешний код, взаимодействующий с объектом.

3️⃣ Повышение гибкости: Возможность изменения внутренней реализации объекта без изменения его интерфейса.

4️⃣ Контроль доступа: Возможность добавления логики проверки и валидации данных при их установке или изменении.

🤔 Краткий ответ

Инкапсуляция — это принцип ООП, который скрывает внутреннюю реализацию объекта и предоставляет доступ к данным только через определенные методы, защищая и контролируя состояние объекта.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет в Go используется для работы с JSON?
Anonymous Quiz
38%
encoding/json
7%
json-iterator
21%
go-simplejson
34%
All of the above
🤯1
📌 Что такое итератор?

💬 Спрашивают в 19 % собеседований

Итератор — это объект, который позволяет поочередно проходить через элементы коллекции (например, списка или множества) без необходимости знать внутреннее представление этой коллекции. Итераторы предоставляют стандартный интерфейс для доступа к элементам, что делает их важной частью объектно-ориентированного программирования и функционального программирования.

🤔 Основные аспекты итераторов

1️⃣ Итерабельные объекты (Iterable):

Объекты, которые поддерживают протокол итерации, называются итерабельными. Примеры включают списки, кортежи, множества и словари.

2️⃣ Протокол итерации:

В Python, чтобы объект был итерабельным, он должен реализовать метод __iter__(), который возвращает итератор.

3️⃣ Итератор:

Итератор — это объект, который реализует методы __iter__() и __next__(). Метод __next__() возвращает следующий элемент последовательности, а когда элементы заканчиваются, возбуждает исключение StopIteration.

🤔 Пример использования итератора в Python

Рассмотрим пример создания итератора для простого списка:

Пример с использованием встроенного итератора
numbers = [1, 2, 3, 4, 5]
iterator = iter(numbers) # Получение итератора из списка

print(next(iterator)) # Вывод: 1
print(next(iterator)) # Вывод: 2
print(next(iterator)) # Вывод: 3
print(next(iterator)) # Вывод: 4
print(next(iterator)) # Вывод: 5
# print(next(iterator)) # Вызывается StopIteration


Пример создания собственного итератора
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end

def __iter__(self):
return self

def __next__(self):
if self.current >= self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1

# Использование собственного итератора
my_iter = MyIterator(1, 5)

for num in my_iter:
print(num) # Вывод: 1 2 3 4


🤔 Преимущества итераторов

1️⃣ Унифицированный интерфейс:

Итераторы предоставляют единый интерфейс для прохода по элементам коллекции, независимо от их типа.

2️⃣ Ленивая загрузка:

Итераторы генерируют элементы по одному, что экономит память при работе с большими наборами данных.

3️⃣ Инкапсуляция логики прохода:

Итераторы инкапсулируют логику обхода элементов, упрощая код и делая его более читаемым.

🤔 Краткий ответ

Итератор — это объект, который позволяет поочередно проходить через элементы коллекции, предоставляя стандартный интерфейс для доступа к элементам. Итераторы реализуют методы __iter__() и __next__(), что позволяет использовать их в циклах для последовательного доступа к элементам.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с базой данных SQLite в Python?
Anonymous Quiz
68%
sqlite3
13%
sqlite
14%
pysqlite
4%
sqlite-python
👍1
📌 Что такое идемпотентность?

💬 Спрашивают в 18 % собеседований

Идемпотентность — это свойство операции, при котором повторное выполнение этой операции приводит к тому же результату, что и однократное выполнение. Это понятие часто используется в контексте HTTP методов, API запросов и транзакций в системах с распределенной архитектурой.

🤔 Основные аспекты идемпотентности

1️⃣ Идемпотентные операции:

GET: Получение ресурса. Повторный запрос не изменяет состояние ресурса.

PUT: Обновление или создание ресурса. Повторный запрос с одинаковыми данными приводит к одному и тому же состоянию ресурса.

DELETE: Удаление ресурса. Повторный запрос удаляет ресурс, если он существует, или не изменяет состояние, если ресурс уже удален.

2️⃣ Неидемпотентные операции:

POST: Создание нового ресурса. Повторный запрос приводит к созданию нового ресурса с новым идентификатором, что изменяет состояние системы.

🤔 Примеры идемпотентности

Пример 1: HTTP методы

GET запрос:
  GET /user/123

Повторный запрос возвращает информацию о пользователе с ID 123 и не изменяет его состояние.

PUT запрос:
  PUT /user/123
{
"name": "John Doe",
"age": 30
}

Повторный запрос обновляет данные пользователя с ID 123, но состояние пользователя остается тем же, если данные запроса не изменяются.

Пример 2: База данных

Идемпотентная операция:
  UPDATE users SET name = 'John Doe' WHERE id = 123;

Повторный запрос обновит имя пользователя с ID 123 на 'John Doe', не изменяя его состояние при повторном выполнении.

Неидемпотентная операция:
  INSERT INTO users (name, age) VALUES ('John Doe', 30);

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

🤔 Зачем нужна идемпотентность

1️⃣ Повышение надежности:

Идемпотентные операции помогают в обеспечении надежности и устойчивости систем, особенно в условиях повторных запросов из-за сетевых сбоев или таймаутов.

2️⃣ Упрощение обработки ошибок:

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

3️⃣ Удобство разработки:

Идемпотентность упрощает разработку и тестирование, так как позволяет предсказуемо управлять состоянием системы при повторных запросах.

🤔 Краткий ответ

Идемпотентность — это свойство операции, при котором повторное выполнение приводит к тому же результату, что и однократное выполнение. Примеры идемпотентных операций включают HTTP методы GET, PUT и DELETE. Идемпотентность повышает надежность системы и упрощает обработку ошибок.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какой пакет используется для работы с REST API в Java?
Anonymous Quiz
8%
Retrofit
6%
Jersey
41%
RestTemplate
46%
All of the above
📌 Из чего состоит ответ на сервере?

💬 Спрашивают в 18 % собеседований

Ответ на сервере, особенно в контексте HTTP, состоит из нескольких ключевых компонентов. Эти компоненты обеспечивают клиенту информацию о результате запроса, статусе обработки, а также предоставляют сами данные, если это необходимо. Основные части ответа включают:

1️⃣ Стартовая линия (Status Line)

Стартовая линия содержит информацию о статусе ответа и состоит из следующих частей:

Версия протокола HTTP: Например, HTTP/1.1.

Код состояния (Status Code): Числовой код, который указывает результат обработки запроса. Примеры включают 200 (OK), 404 (Not Found), 500 (Internal Server Error).

Причинная фраза (Reason Phrase): Человеко-читаемое описание статуса. Например, OK, Not Found, Internal Server Error.

Пример:
HTTP/1.1 200 OK


2️⃣ Заголовки (Headers)

Заголовки предоставляют метаданные о ответе. Они состоят из пар "ключ-значение" и могут включать:

Date: Дата и время отправки ответа.

Content-Type: Тип содержимого ответа (например, text/html, application/json).

Content-Length: Размер тела ответа в байтах.

Server: Информация о сервере, отправившем ответ.

Set-Cookie: Установка cookies.

Пример:
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly


3️⃣ Тело ответа (Body)

Тело ответа содержит данные, которые сервер отправляет клиенту. Формат и содержание тела зависят от типа ответа и могут включать:

HTML-страницы

JSON-объекты

XML-данные

Файлы (например, изображения, документы)

Пример (JSON):
{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}


🤔 Пример полного HTTP-ответа
HTTP/1.1 200 OK
Date: Tue, 27 Jul 2024 12:28:53 GMT
Content-Type: application/json
Content-Length: 85
Server: Apache/2.4.1 (Unix)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly

{
"id": 123,
"name": "John Doe",
"email": "[email protected]"
}


🤔 Краткий ответ

Ответ на сервере состоит из стартовой линии (статус запроса), заголовков (метаданные) и тела ответа (данные). Например, в HTTP ответ включает код состояния, заголовки, такие как Content-Type и Content-Length, и само содержимое ответа (например, JSON).

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с графовыми базами данных в Python?
Anonymous Quiz
19%
py2neo
7%
networkx
33%
igraph
41%
graphtools
📌 Какие http методы могут быть?

💬 Спрашивают в 18 % собеседований

HTTP (HyperText Transfer Protocol) методы представляют собой набор стандартных операций, которые используются для взаимодействия между клиентом и сервером в сети. Каждый метод определяет конкретное действие, которое должен выполнить сервер. Вот основные HTTP методы и их предназначение:

🤔 GET

Метод GET используется для получения данных с сервера. Он запрашивает представление ресурса, не изменяя его состояния. GET запросы часто используются для запросов веб-страниц и получения данных из API.

🤔 POST

Метод POST используется для отправки данных на сервер с целью создания или обновления ресурса. Это может включать отправку формы на веб-сайте или загрузку файла. POST запросы обычно содержат данные в теле запроса.

🤔 PUT

Метод PUT используется для обновления существующего ресурса или создания нового ресурса на сервере. Если ресурс уже существует, он будет обновлен, если нет — будет создан.

🤔 DELETE

Метод DELETE используется для удаления ресурса с сервера. Запросы DELETE могут быть небезопасными, так как они изменяют состояние сервера, удаляя данные.

🤔 PATCH

Метод PATCH используется для частичного обновления ресурса. В отличие от PUT, который заменяет весь ресурс, PATCH изменяет только указанные части ресурса.

🤔 HEAD

Метод HEAD аналогичен GET, но без тела ответа. Используется для получения метаданных о ресурсе, таких как заголовки, без загрузки самого ресурса.

🤔 OPTIONS

Метод OPTIONS используется для запроса информации о поддерживаемых методах на сервере или на конкретном ресурсе. Это может быть полезно для определения доступных операций перед отправкой основного запроса.

🤔 CONNECT

Метод CONNECT используется для установления туннеля к серверу через прокси. Обычно используется для HTTPS через прокси.

🤔 TRACE

Метод TRACE выполняет тестовый запрос по маршруту до ресурса. Он возвращает запрос, полученный сервером, что может помочь в диагностике сетевых проблем или выявлении изменений в маршруте запроса.

🤔 Краткий ответ:

Основные HTTP методы включают GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, CONNECT и TRACE. Они используются для различных операций с ресурсами на сервере, таких как получение данных, отправка данных, обновление, удаление и диагностика сетевых маршрутов.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет в Ruby используется для работы с очередями сообщений?
Anonymous Quiz
6%
Sidekiq
22%
Resque
16%
Delayed::Job
56%
All of the above
📌 Расскажи об отличиях MVC от MVP?

💬 Спрашивают в 18 % собеседований

MVC (Model-View-Controller) и MVP (Model-View-Presenter) – это архитектурные шаблоны, используемые в разработке программного обеспечения для разделения логики приложения на отдельные компоненты. Хотя обе архитектуры помогают улучшить структуру и поддерживаемость кода, между ними существуют важные различия.

🤔 MVC (Model-View-Controller)

Компоненты:

1️⃣ Model (Модель): Отвечает за управление данными и бизнес-логикой приложения. Она не знает о существовании View и Controller.

2️⃣ View (Представление): Отображает данные, полученные от Model, и отправляет пользовательский ввод в Controller.

3️⃣ Controller (Контроллер): Получает ввод от View, обновляет Model и выбирает, какое View должно быть обновлено.

Как работает:

View отправляет пользовательский ввод в Controller.

Controller обрабатывает ввод, обновляет Model.

Model обновляет данные и уведомляет View об изменениях.

View обновляется и отображает актуальные данные.

Преимущества:

Четкое разделение обязанностей.

Простота в тестировании отдельных компонентов.

Недостатки:

Controller может стать перегруженным.

Взаимодействие между компонентами может быть сложным для больших приложений.

🤔 MVP (Model-View-Presenter)

Компоненты:

1️⃣ Model (Модель): Отвечает за управление данными и бизнес-логикой приложения.

2️⃣ View (Представление): Отображает данные и передает пользовательский ввод Presenter'у.

3️⃣ Presenter (Презентер): Получает ввод от View, обновляет Model и передает данные обратно в View для отображения.

Как работает:

View передает пользовательский ввод Presenter'у.

Presenter обрабатывает ввод, обновляет Model.

Model обновляет данные.

Presenter получает обновленные данные из Model и обновляет View.

Преимущества:

Легкость в тестировании, особенно View и Presenter.

Presenter более тонко контролирует View, что упрощает управление пользовательским интерфейсом.

Недостатки:

Presenter может стать перегруженным логикой.

Увеличение сложности кода из-за множества взаимодействий между компонентами.

🤔 Основные отличия:

1️⃣ Взаимодействие View и других компонентов:

В MVC View взаимодействует напрямую с Model.

В MVP View взаимодействует только с Presenter, а Presenter уже работает с Model.

2️⃣ Уведомления об изменениях:

В MVC Model уведомляет View об изменениях напрямую.

В MVP Model уведомляет Presenter, а Presenter обновляет View.

3️⃣ Роль Controller и Presenter:

В MVC Controller отвечает за определение, какое View отображать.

В MVP Presenter отвечает за всю логику взаимодействия между Model и View, а также за обновление View.

🤔 Краткий ответ:

MVC и MVP – это архитектурные шаблоны, используемые для разделения логики приложения. В MVC View взаимодействует напрямую с Model, а в MVP View взаимодействует только с Presenter. В MVC Controller управляет отображением View, а в MVP Presenter управляет всей логикой взаимодействия между Model и View.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой пакет используется для работы с базой данных Cassandra в Python?
Anonymous Quiz
28%
cassandra-driver
58%
pycassa
8%
cqlengine
7%
pylibmc
📌 Что такое cherrypick?

💬 Спрашивают в 18 % собеседований

Cherry-pick — это команда в системе управления версиями Git, которая позволяет выбрать один или несколько конкретных коммитов из одной ветки и применить их в другую ветку. Это полезно, когда нужно перенести отдельные изменения без необходимости слияния целых веток.

🤔 Основные аспекты cherry-pick

1️⃣ Избирательное применение коммитов:

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

2️⃣ Избежание полного слияния:

В отличие от обычного слияния (merge), cherry-pick переносит только выбранные коммиты, а не всю историю изменений.

🤔 Как использовать cherry-pick

Основной синтаксис
git cherry-pick <commit_hash>


Пример использования

1️⃣ Переход на целевую ветку:

Переключитесь на ветку, в которую нужно перенести изменения.
   git checkout target-branch


2️⃣ Применение коммита:

Используйте команду cherry-pick, чтобы применить нужный коммит.
   git cherry-pick a1b2c3d4 


3️⃣ Решение конфликтов (если они возникли):

Если во время cherry-pick возникают конфликты, Git предложит их решить.

Разрешите конфликты, затем завершите процесс:
   git add <resolved_files>
git cherry-pick --continue


🤔 Пример

Предположим, у вас есть коммит с хешем a1b2c3d4 в ветке feature-branch, который вы хотите перенести в main-branch.
git checkout main-branch
git cherry-pick a1b2c3d4


Если коммит успешно применен, изменения из коммита a1b2c3d4 будут добавлены в main-branch.

🤔 Когда использовать cherry-pick

1️⃣ Перенос исправлений:

Когда нужно быстро перенести исправление из одной ветки в другую (например, багфикс из develop в release).

2️⃣ Избирательное применение новых функций:

Когда нужно перенести конкретную функцию или изменение без переноса всей ветки.

🤔 Ограничения и риски

1️⃣ Конфликты:

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

2️⃣ Историческая чистота:

Частое использование cherry-pick может запутать историю изменений, так как один и тот же коммит будет существовать в нескольких ветках с разными хешами.

🤔 Краткий ответ

Cherry-pick в Git — это команда, позволяющая выбрать один или несколько коммитов из одной ветки и применить их в другую ветку. Она используется для избирательного переноса изменений без полного слияния веток.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой пакет в Java используется для работы с Redis?
Anonymous Quiz
37%
jedis
8%
lettuce
16%
redisson
39%
All of the above
📌 Чем отличается rebase от merge?

💬 Спрашивают в 18 % собеседований

В Git команды rebase и merge используются для объединения изменений из разных веток, но делают это по-разному. Основное различие между ними заключается в том, как они сохраняют историю коммитов и как они влияют на структуру репозитория.

🤔 Основные отличия

1️⃣ Merge (Слияние):

Описание: Объединяет две ветки, создавая новый коммит слияния (merge commit), который имеет две родительских ветки.

История: Сохраняет всю историю коммитов обеих веток без изменений. История ветвления и слияния сохраняется.

Конфликты: Если есть конфликты, Git предложит их разрешить перед созданием коммита слияния.

Команда: git merge <branch>

Пример
   git checkout main
git merge feature-branch

Результат: Создается новый коммит слияния, который объединяет изменения из feature-branch в main.

2️⃣ Rebase (Перебазирование):

Описание: Переносит все коммиты текущей ветки на вершину целевой ветки. Это делает историю линейной, как если бы изменения были сделаны последовательно.

История: Изменяет историю коммитов, создавая новые коммиты для каждого коммита из текущей ветки. История ветвления исчезает.

Конфликты: Если есть конфликты, Git предложит их разрешить по мере переноса каждого коммита.

Команда: git rebase <branch>

Пример
   git checkout feature-branch
git rebase main

Результат: Коммиты из feature-branch переносятся на вершину main, создавая линейную историю.

🤔 Преимущества и недостатки

Merge

Преимущества:

Простота: Процесс слияния прост и понятен.

Сохранение истории: Вся история коммитов сохраняется, включая информацию о ветвлении и слиянии.

Недостатки:

Коммиты слияния: Создаются дополнительные коммиты слияния, что может усложнить историю.

Rebase

Преимущества:

Чистая история: История линейная и более читабельная.

Упрощение навигации: Проще следить за последовательностью изменений.

Недостатки:

Изменение истории: Изменение коммитов может привести к проблемам, если кто-то уже основывается на этих коммитах.

Конфликты: Может потребоваться больше усилий для разрешения конфликтов, особенно если коммитов много.

🤔 Когда использовать

Merge

Когда важно сохранить полную историю изменений, включая ветвление и слияние.

В крупных командных проектах, где история изменений важна для отслеживания.

Rebase

Когда важно иметь чистую и линейную историю изменений.

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

🤔 Краткий ответ

Merge объединяет две ветки, создавая новый коммит слияния, сохраняя всю историю коммитов и структуру ветвления. Rebase переносит коммиты текущей ветки на вершину целевой ветки, создавая линейную историю коммитов, что делает историю чище, но изменяет исходные коммиты.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Что означает принцип open closed?

💬 Спрашивают в 18 % собеседований

Принцип "открытости/закрытости" (Open/Closed Principle, OCP) — это один из пяти принципов SOLID, разработанных для создания устойчивого и легко поддерживаемого кода в объектно-ориентированном программировании. Принцип был предложен Бертраном Мейером в 1988 году и заключается в следующем:

🤔 Суть принципа

Классы должны быть открыты для расширения, но закрыты для модификации.

🤔 Что это означает:

1️⃣ Открыты для расширения:

Поведение класса можно расширить, добавив новый код.

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

2️⃣ Закрыты для модификации:

Существующий код класса не должен изменяться.

Это помогает избежать ошибок, которые могут возникнуть при изменении уже протестированного и проверенного кода.

🤔 Пример

Рассмотрим пример на языке программирования Java.

Без соблюдения принципа OCP
public class Shape {
public void drawCircle() {
// рисуем круг
}

public void drawSquare() {
// рисуем квадрат
}
}

public class GraphicEditor {
private Shape shape;

public GraphicEditor(Shape shape) {
this.shape = shape;
}

public void draw(String shapeType) {
if (shapeType.equals("circle")) {
shape.drawCircle();
} else if (shapeType.equals("square")) {
shape.drawSquare();
}
}
}

Если нужно добавить новый тип фигуры, например, треугольник, придется изменить класс Shape и метод draw в классе GraphicEditor, что нарушает принцип OCP.

С соблюдением принципа OCP
public interface Shape {
void draw();
}

public class Circle implements Shape {
@Override
public void draw() {
// рисуем круг
}
}

public class Square implements Shape {
@Override
public void draw() {
// рисуем квадрат
}
}

public class GraphicEditor {
private Shape shape;

public GraphicEditor(Shape shape) {
this.shape = shape;
}

public void draw() {
shape.draw();
}
}

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

🤔 Преимущества принципа OCP

1️⃣ Повышение гибкости:

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

2️⃣ Уменьшение количества ошибок:

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

3️⃣ Упрощение тестирования:

Легче тестировать новые компоненты отдельно, не затрагивая и не изменяя существующие.

🤔 Краткий ответ

Принцип "открытости/закрытости" (Open/Closed Principle) означает, что классы должны быть открыты для расширения, но закрыты для модификации. Это позволяет добавлять новые функции без изменения существующего кода, что повышает гибкость, снижает количество ошибок и упрощает тестирование.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 С какими объектами можно писать однострочники (comprehensions)?
Anonymous Quiz
13%
Списки
4%
Словари
4%
Множества
79%
Все вышеперечисленные
📌 Какие принципы программирования бывают?

💬 Спрашивают в 18 % собеседований

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

🤔 Принципы SOLID

1️⃣ Single Responsibility Principle (SRP):

Каждый класс должен иметь одну единственную ответственность.

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

2️⃣ Open/Closed Principle (OCP):

Классы должны быть открыты для расширения, но закрыты для модификации.

Пример: Добавление нового типа фигуры без изменения существующего кода классов фигур.

3️⃣ Liskov Substitution Principle (LSP):

Объекты базового класса должны быть заменяемыми объектами подклассов без изменения правильности программы.

Пример: Если класс Bird имеет метод fly, то подкласс Penguin не должен его нарушать.

4️⃣ Interface Segregation Principle (ISP):

Клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют.

Пример: Разделение крупного интерфейса на несколько специфичных интерфейсов.

5️⃣ Dependency Inversion Principle (DIP):

Модули верхнего уровня не должны зависеть от модулей нижнего уровня; оба должны зависеть от абстракций.

Пример: Использование интерфейсов для взаимодействия между классами вместо конкретных реализаций.

🤔 Другие важные принципы

1️⃣ DRY (Don't Repeat Yourself):

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

Пример: Использование функций для повторяющихся блоков кода.

2️⃣ KISS (Keep It Simple, Stupid):

- Держите код простым и избегайте сложных решений, когда более простое решение будет работать.

- Пример: Не используйте сложные алгоритмы там, где достаточно простого цикла.

3️⃣ YAGNI (You Ain't Gonna Need It):

Не реализовывайте функциональность, которая не нужна прямо сейчас.

Пример: Добавляйте новые функции только тогда, когда в них есть необходимость.

4️⃣ Separation of Concerns:

Разделяйте разные аспекты программы, чтобы каждый модуль решал отдельную задачу.

Пример: Отдельные модули для бизнес-логики, пользовательского интерфейса и доступа к данным.

5️⃣ Law of Demeter (LoD):

Объект должен общаться только с непосредственными "друзьями" и не тянуть цепочку вызовов.

Пример: Использование методов класса без вызова методов через несколько объектов.

6️⃣ Fail Fast:

Ошибки должны быть выявлены как можно раньше.

Пример: Проверка входных данных на валидность в начале функции.

7️⃣ Composition over Inheritance:

Предпочтение композиции перед наследованием для достижения гибкости.

Пример: Использование объектов других классов для расширения функциональности вместо создания подклассов.

🤔 Принципы в Agile

1️⃣ Customer Collaboration over Contract Negotiation:

Сотрудничество с заказчиком важнее согласования условий контракта.

Пример: Регулярные встречи с заказчиком для обсуждения прогресса и изменений.

2️⃣ Responding to Change over Following a Plan:

Готовность к изменениям важнее следования плану.

Пример: Внедрение новых требований, даже если они появились на поздних стадиях разработки.

🤔 Принципы в DevOps

1️⃣ Infrastructure as Code:

Управление инфраструктурой с помощью кода и автоматизации.

Пример: Использование Terraform или Ansible для развертывания серверов.

2️⃣ Continuous Integration/Continuous Deployment (CI/CD):

Автоматизация сборки, тестирования и развертывания приложений.

Пример: Использование Jenkins или GitHub Actions для автоматизации процессов разработки.

🤔 Краткий ответ

Принципы программирования включают SOLID (SRP, OCP, LSP, ISP, DIP), а также DRY, KISS, YAGNI, Separation of Concerns, Law of Demeter, Fail Fast и Composition over Inheritance. Эти принципы помогают создавать более гибкий, поддерживаемый и качественный код.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 На основе какой структуры данных реализованы словари в Python?
Anonymous Quiz
11%
Списки
87%
Хеш-таблицы
1%
Деревья
1%
Очереди