Точка входа в программирование
21.2K subscribers
975 photos
176 videos
1 file
2.51K links
Фундаментальные знания по основам программирования

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/zrgj
Download Telegram
Простыми словами: Какие стили программирования существуют

Кроме объектно-ориентированного программирования (ООП), существует несколько других видов программирования, каждое из которых применяется в различных областях и имеет свои особенности.

1. Процедурное программирование

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

Плюсы:
— простота и понятность, особенно для небольших программ;
— широкая база знаний и большое количество примеров.

Минусы:
— сложность управления большими проектами;
— меньшая гибкость и повторное использование кода по сравнению с ООП.

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

2. Функциональное программирование

Оно используется для работы с вычислениями, которые можно описать как набор математических функций. В таком стиле часто пишут на Haskell, Lisp, Erlang, Scala, и даже JavaScript.

Плюсы:
— выраженная математическая чистота и вероятностное отсутствие побочных эффектов;
— лёгкость тестирования и отладки.

Минусы:
— меньшая распространённость и сложность освоения для новичков;
— ограниченность инструментов и библиотек в сравнении с ООП.

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

3. Логическое программирование

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

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

Минусы:
— сложность понимания и отладки;
— ограниченные области практического применения.

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

4. Декларативное программирование

Используется для описания желаемого результата, а не шага к его достижению. Используется в SQL (для запросов к базам данных), HTML (для веб-разметки), XSLT (для трансформации XML).

Плюсы:
— ясность и простота синтаксиса;
— фокус на описании задачи, а не способе её решения.

Минусы:
— ограниченность в универсальности решения задач;
— зависимость от конкретных исполнительных сред.

Применение: Встроенные системы управления данными, веб-разработка, трансформация данных.

5. Мультипарадигменное программирование

Этот стиль предполагает объединение нескольких парадигм программирования (например, ООП и функционального программирования) в одном языке или приложении. Может быть реализовано на многих языках, включая Python, JavaScript, Kotlin, Scala, Swift и т.д.

Плюсы:
— гибкость и способность адаптироваться к различным задачам;
— возможность использовать лучшие стороны разных парадигм.

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

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

Какая парадигма сейчас более популярна?

Сегодня сложилось так, что объектно-ориентированное программирование остаётся одной из самых популярных парадигм, особенно в разработке крупных и сложных систем. Однако функциональное программирование набирает обороты, особенно в области обработки данных и параллельных вычислений. Мультипарадигменные языки, такие как Python и JavaScript, также стали очень популярны благодаря своей гибкости и широким возможностям.

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

🤯 — не знал, что их так много
🤔 — а можно теперь подробнее про каждую?
❤️ — зачем что-то придумывать, если есть ООП?


#простымисловами
Простыми словами: Процедурное программирование

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

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

#простымисловами #парадигмыпрограммирования
Точка входа в программирование
Простыми словами: Процедурное программирование В прошлом посте рубрики я вкратце рассказал про разные парадигмы программирования. Пришло время углубится в одну из них Процедурное программирование остаётся важной парадигмой, особенно в областях, где требуется…
Простыми словами: Функциональное программирование

Про процедурное программирование мы уже рассказали. Теперь поговорим о функциональном.

Функциональное программирование — мощный и полезный инструмент, особенно для задач, где важны надёжность и предсказуемость. Несмотря на сложность овладения, оно предлагает значительные преимущества в поддержке и разработке устойчивых и масштабируемых систем, особенно при работе с большими объёмами данных и сложными вычислениями.

#простымисловами
Forwarded from Zen of Python
Простыми словами: Паттерн «Одиночка»

Про «Фасад» поговорили. Теперь расскажу про другой популярный паттерн.

«Одиночка» (Singleton) полезен, когда необходимо гарантировать существование единственного экземпляра объекта в системе. Но использовать его следует с осторожностью. Хотя он полезен для управления ресурсами и обеспечения согласованности данных, это может привести к сложностям при тестировании и многопоточности. Каждое использование Singleton должно быть тщательно обосновано, чтобы избежать потенциальных проблем и антипаттернов.

#простымисловами #паттерны
Точка входа в программирование
Простыми словами: Функциональное программирование Про процедурное программирование мы уже рассказали. Теперь поговорим о функциональном. Функциональное программирование — мощный и полезный инструмент, особенно для задач, где важны надёжность и предсказуемость.…
Простыми словами: Логическое программирование

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

Логическое программирование — мощный инструмент для задач, требующих логического вывода и анализа. Оно предоставляет декларативный подход к решению задач, работая с фактами и правилами. Несмотря на ограничения, оно незаменимо в областях, где требуется высокая степень абстракции и интеллектуальный анализ.

🤯 — никогда не слышал про такое
❤️ — хочу писать на Prolog


#простымисловами
Точка входа в программирование
Простыми словами: Логическое программирование Продолжаем тему парадигм программирования. В прошлый раз говорили про известное многим функциональное программирование. Теперь же поговорим про то, о чем многие не слышали. Логическое программирование — мощный…
Простыми словами: Декларативное программирование

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

❤️ — если использовал декларативное программирование

#простымисловами
Точка входа в программирование
Простыми словами: Декларативное программирование Декларативное программирование — это подход, ориентированный на результат, который позволяет сосредотачиваться на целях, а не на способах их достижения. Оно упрощает разработку и поддержку кода, однако может…
Простыми словами: Мультипарадигменное программирование

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

#простымисловами #парадигмы
Точка входа в программирование
Простыми словами: Паттерн «Одиночка» Про «Фасад» поговорили. Теперь расскажу про другой популярный паттерн. «Одиночка» (Singleton) полезен, когда необходимо гарантировать существование единственного экземпляра объекта в системе. Но использовать его следует…
Простыми словами Паттерн «Factory Method»

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

Подробнее о нём можно узнать в карточках.

#простымисловами #паттерны
#простымисловами: ​​Различия между MVC, MVP, MVVM, MVVM-C, и VIPER

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

MVC (Model-View-Controller) — один из самых широко используемых архитектурных шаблонов. Он разделяет приложение на три основных компонента: модель (представляет данные и бизнес-логику), представление (отвечает за отображение интерфейса) и контроллер (действует как посредник между моделью и представлением).

MVP (Model-View-Presenter) отчасти похож на MVC, но имеет немного другой подход. В MVP посредником между моделью и представлением является презентер , а не контроллер. Презентер отвечает за обновление представления данными из модели и обработку пользовательского ввода и событий.

MVVM (Model-View-ViewModel) — архитектурный шаблон, набирающий популярность и используемый в приложениях со сложными пользовательскими интерфейсами. Он похож на MVP, но с добавлением модели представления (view model), которая отвечает за управление состоянием представления и за предоставление данных из модели в представление.

MVVM-C (Model-View-ViewModel-Coordinator) — это вариация MVVM, с добавлением координатора, который отвечает за управление навигацией между различными экранами или представлениями в приложении. Этот шаблон полезен для приложений, в которых есть несколько управляемых экранов или представлений.

VIPER (View-Interactor-Presenter-Entity-Router) — относительно новая архитектурный шаблон, который похож на MVC, но с добавлением нескольких новых компонентов, включая интерактор (отвечает за обработку бизнес-логики), сущность (представляет данные) и маршрутизатор (обрабатывает навигацию между различными экранами и представлениями).

#паттерны
#простымисловами: Паттерн Observer (Наблюдатель)

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

Подробнее в карточках.
Что такое стек и куча?

Стек — это область памяти, где хранятся временные данные, например, локальные переменные и параметры функций. Он работает по принципу «последним пришёл — первым ушёл". Когда функция завершается, её данные автоматически удаляются. Стек быстрый, но его размер ограничен.

Куча — это область памяти для данных, которые живут долго, например, объекты или массивы. Данные в куче выделяются вручную или автоматически (например, с помощью сборщика мусора). Она гибче стека, но доступ к ней медленнее.

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

def add(a, b):
result = a + b # Локальные переменные хранятся в стеке
return result



Пример использования кучи:

class User:
def __init__(self, name):
self.name = name # Объект "User" хранится в куче

user = User("Alex")
print(user.name)


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

#простымисловами #основы
Как работают хэш-функции

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

1. Для одного и того же ввода всегда возвращается одинаковый хэш.
2. Невозможно восстановить исходные данные по хэшу (обратное преобразование).

Давайте рассмотрим пример

Возьмём строку "password123" и пропустим её через хэш-функцию (например, SHA-256). Она вернёт хэш-значение:
password123 → ef92b778bae11c00c8cc0d9525c7f90631ad9e11cdec095c9c3af7b06ecf90fc


Хэш будет одинаковым для "password123", сколько бы раз вы его ни рассчитывали. Но если изменить хотя бы один символ, хэш станет совершенно другим.

Пример кода на Python

import hashlib

# Пример строки
text = "password123"

# Использование SHA-256 для получения хэша
hash_object = hashlib.sha256(text.encode())
hash_value = hash_object.hexdigest()

print("Хэш:", hash_value)


Результат: ef92b778bae11c00c8cc0d9525c7f90631ad9e11cdec095c9c3af7b06ecf90fc

Где используется:

1. Для хранения паролей: Вместо хранения пароля "password123" его хэш сохраняют в базе данных. Когда пользователь вводит пароль, хэш снова рассчитывается и сравнивается с сохранённым хэшем.

2. Для ускорения поиска данных: Например, в хэш-таблицах (словарях Python). При добавлении ключа "text" его хэш помогает найти место для хранения значения.

3. В хэш-таблицах: Структура данных для хранения пар «ключ-значение». Хэш-функция вычисляет индекс, где хранится значение, что ускоряет доступ к данным.

#простымисловами
Зачем нужны контейнеры в программировании

Контейнеры, такие как Docker, нужны, чтобы создавать лёгкие и изолированные окружения для запуска приложений. Проще говоря, это как коробка, в которую вы кладёте ваше приложение вместе со всем, что ему нужно для работы (например, библиотеки, зависимости, настройки), а потом можете запустить эту коробку где угодно.

Зачем это нужно?

1. «Работает у меня». У вас есть приложение, которое отлично работает на вашей машине. Но на сервере оно не запускается из-за разных версий библиотек или зависимостей. С контейнером такие проблемы исчезают, потому что всё, что нужно приложению, идёт с ним в одном «пакете».

2. Универсальная упаковка. Контейнеры работают одинаково на любом компьютере или сервере, будь то ваш ноутбук, облако или чужая инфраструктура. Это экономит время и нервы.

3. Изоляция. Каждый контейнер полностью изолирован. Если в одном контейнере что-то сломалось или идёт нагрузка, это не повлияет на другие.

Пример из реальной жизни

Представьте, что вы повар и вам нужно приготовить блюдо в чужой кухне. Но в чужой кухне может не быть нужных продуктов, посуды и приборов. Контейнер — это коробка, в которой вы привозите всё, что вам нужно: продукты, кастрюли, специи. Теперь вы можете готовить это блюдо в любой кухне, не беспокоясь о том, что чего-то будет не хватать.

Где это используется?

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

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

В продакшене: легко развернуть приложение на реальном сервере без сюрпризов.

#простымисловами
Что такое асинхронность

Сперва немного терминологии. Асинхронность — это способность программы выполнять несколько задач одновременно, не дожидаясь завершения каждого шага. Это особенно полезно, когда программа выполняет долгие операции (например, загрузку данных из сети), но при этом не блокирует выполнение других задач.

Если код работает синхронно, каждая операция выполняется строго по порядку. Это может привести к задержкам:

import time

print("Загрузка данных...")
time.sleep(5) # Программа засыпает на 5 секунд
print("Данные загружены!")


В примере выше всё остальное в программе «заморожено», пока выполняется sleep(). Если бы это была веб-страница, она зависла бы на несколько секунд.

Как работают async/await

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

Пример на Python с asyncio:

import asyncio

async def загрузка_данных():
print("Загрузка данных...")
await asyncio.sleep(5) # Не блокирует программу
print("Данные загружены!")

async def main():
await загрузка_данных()

asyncio.run(main())


Давайте разберёмся, что здесь происходит:

1. async делает функцию асинхронной.
2. await говорит «подожди, но не блокируй остальную программу».
3. asyncio.run(main()) запускает асинхронную операцию.

Асинхронность делает код быстрее и эффективнее, особенно при работе с долго выполняющимися операциями!

#простымисловами #основы
Forwarded from Веб-страница
Как правильно работать с DOM в JavaScript в 2025 году?

Работа с DOM (Document Object Model) — это основа веб-разработки. С каждым годом появляются новые, более эффективные способы манипуляции элементами страницы. Давайте разберём, как сегодня правильно работать с DOM в JavaScript, чтобы код был быстрым, удобным и безопасным.

1. Получение элементов

Вместо старых getElementById и getElementsByClassName сегодня лучше использовать querySelector и querySelectorAll. Они более универсальные и понятные.

const title = document.querySelector("#title"); // Получает 1 элемент (по id)
const buttons = document.querySelectorAll(".btn"); // Получает список всех кнопок с классом .btn


querySelector и querySelectorAll позволяют находить элементы так же, как в CSS (.класс, #id, input[type="text"] и т. д.). А также querySelectorAll возвращает не «живую» коллекцию, а обычный статичный список (NodeList), что логичнее при итерации.

2. Изменение текста и HTML

Всё зависит от того, что именно нужно поменять.

textContent — если надо изменить только текст (без HTML).

title.textContent = "Привет, мир!";


Не используйте innerHTML, если вставляете данные от пользователя — это дыра в безопасности (XSS-атаки). Если всё же используется innerHTML, убедитесь, что данные проверены.

title.innerHTML = "<strong>Важное сообщение!</strong>";


insertAdjacentHTML — отличная альтернатива innerHTML, если нужно добавить HTML в определённое место, не перезаписывая весь элемент.

title.insertAdjacentHTML("beforeend", "<span> 👋</span>");


3. Изменение классов

Правильный способ через classList, потому что `className`заменяет все классы сразу, из-за чего можно случайно удалить важные стили.

title.classList.add("highlight"); // Добавит класс
title.classList.remove("hidden"); // Удалит класс
title.classList.toggle("active"); // Переключит класс (если был — уберёт, если не было — добавит)


4. Изменение стилей

Не стоит вручную писать style.cssText, потому что он затирает всё, что было до этого. Используйте style для отдельных свойств.

title.style.color = "red";
title.style.fontSize = "24px";


Если нужно много стилей — лучше добавьте или измените класс. Так проще, централизованно и удобнее управлять дизайном.

title.classList.add("error"); // В CSS заранее определите .error { color: red; }


5. Создание и добавление новых элементов

Лучший способ — использовать createElement, а не innerHTML.

const newDiv = document.createElement("div"); // Создаём элемент <div>
newDiv.textContent = "Новый блок!";
newDiv.classList.add("box");
document.body.appendChild(newDiv); // Добавляем в конец <body>


Если нужно добавлять элементы в разные места:

appendChild() — добавляет в конец родителя.

prepend() — добавляет в начало.

before() и after() — добавляют перед или после элемента.

title.after(newDiv); // Вставит newDiv сразу после title

// С помощью append() можно сразу добавлять текст и несколько элементов
const container = document.querySelector(".container");
container.append("Просто текст", document.createElement("span"));


6. Удаление элементов

Самый актуальный способ — remove().

newDiv.remove(); // Удалит элемент из DOM


Раньше приходилось делать так (и это было неудобно):

newDiv.parentNode.removeChild(newDiv); // Старый подход


7. Обработчики событий (современный подход)

Раньше часто использовали`onclick`, но перезаписывает предыдущие обработчики и плохо управляется. Лучше используйте addEventListener.

const button = document.querySelector("#myButton");

button.addEventListener("click", () => {
alert("Кнопка нажата!");
});


Мы рассказали только часть советов. Если знаете что-то ещё важное, о чем мы не рассказали тут, поделитесь в комментариях.

#простымисловами #фронтенд