Результати пошуку за запитом: курс - практикум по frontend разработке*
Прості події
Автор: Костянтин Чорний
Введение
При разработке компьютерных систем и программ, в том числе таких, в которых функционирует множество оригинальных сущностей и их дублей – экземпляров, возникает проблема отслеживания связей взаимодействия между этими объектами. И чем больше появляется этих объектов , тем сложнее вписать их в структуру приложения. Да, можно сказать что здесь явные проблемы с архитектурой и так не должно быть, но все равно мы наталкиваемся на проблему создания крупной многообъектной системы с гибкими динамическими связями и адаптивным поведением. Лучшее решение – событийно-ориентированное программирование!
Итак, событие – это внезапное происшествие, появление которого нельзя предугадать, а можно только к нему готовиться. В подобном русле работает и человеческих мозг. Он ожидает появления события и, когда оно происходит, как-то на него реагирует.
Давайте рассмотрим небольшой мысленный эксперимент. Представьте дорогу, пешеходный переход и светофор, который регулирует переход в данном месте. Светофор – это объект, который порождает событие. Он по воле своего внутреннего устройства будет включать или отключать зеленый свет, который будет разрешать пешеходам переход через улицу.
В это время на тротуаре начинают собираться люди. Каждый человек – это объект, содержащий специфическое поведение, которое называется обработчиком события. В данном случае этот обработчик будет отвечать за пересечение улицы и будет вызываться во время возникновения события. У каждого человека обработчик разный, ведь все люди переходят через улицу по-разному. Один будет идти быстро, другой медленно, третий - смотреть на машины, которые стоят на перекрестке, а четвертый - следить за таймером, который будет отсчитывать секунды. Но каждый из них не предполагает, когда конкретно произойдет это событие, потому все они ждут на тротуаре.
Когда человек подходит к переходу, он подписывает свой обработчик события перехода дороги на конкретное событие этого светофора. Если человек передумает переходить или, например, отойдет поговорить по телефону, то он не будет выполнять свой обработчик, если событие возникнет.
И, наконец, когда светофор включается на зеленый, все люди начинают переходить дорогу. Возникло событие – выполнился обработчик.
Что-же нам позволяет сделать событийную модель? Она разрешает динамически изменять связи между объектами и не только расторгать или устанавливать их, но и менять характер самого действия.
Давайте рассмотрим пример создания события на языке C#.
namespace TrafficLight
{
// Светофор
public class Light
{
// Событие появления зеленого света
public event EventHandler Green;
// Метод который вызывает событие
public void SwichToGreen()
{
Green.Invoke(this, new EventArgs());
}
}
// Человек
public class Human
{
public string Name { get; private set; }
public Human(string name)
{
Name = name;
}
// Метод обработчик события перехода через дорогу
public void CrossingTheRoad(object sender, EventArgs e)
{
Console.WriteLine(this.Name + " crossing!");
}
}
class Program
{
static void Main(string[] args)
{
// Создание светофора
Light light = new Light();
// Создание людей
Human human1 = new Human("Alex");
Human human2 = new Human("Bob");
Human human3 = new Human("Alice");
// Подписка на событие
light.Green += human1.CrossingTheRoad;
light.Green += human2.CrossingTheRoad;
light.Green += human3.CrossingTheRoad;
// Вызов события
light.SwichToGreen();
Console.ReadKey();
}
}
}
Таким образом, язык C# позволяет быстро и легко создавать приложения, которые используют событийную модель. Более подробно узнать о событиях Вы можете в двенадцатом уроке курса C# Базовый.
Для практики можете создать небольшую игру с игровыми объектами, взаимодействующими посредством событий.
Розробники ігор для смартфонів зберуться у Таллінні!
Автор: Редакція ITVDN
18 февраля, 2016 – Таллинн, Эстония – четвертая ежегодная конференция для разработчиков и издателей игр для смартфонов состоится 8-9 апреля 2016 года в самом сердце легендарного Таллинна.
Традиционно это событие организует и проводит Creative Mobile, крупнейший в Эстонии разработчик и издатель игр для смартфонов. Конференция проводится при поддержке IGDA Estonia, которая является одной из крупнейших мировых некоммерческих организаций и предоставляет свои услуги всем лицам, причастным к созданию игр, в сотрудничестве с игровым акселератором GameFounders.
Формат конференции Game Dev Days в этом году немного изменится. В этом году основной темой конференции станут Indie Heroes. Будут рассмотрены кейсы успешных инди-проектов, разобран весь процесс разработки, начиная от создания концепта до выхода продукта на рынок. Больше внимания будет уделено гейм-дизайну, графическому дизайну и коммьюнити-менеджменту.
Как обычно, два интенсивных дня будут посвящены обсуждению широкого спектра вопросов, связанных с нюансами разработки игр. В их числе вопросы, касающиеся гейм дизайна, развития бизнеса, технологии разработки, а также проблем, с которыми сталкиваются инди-разработчики и, конечно, обмен знаниями и идеями.
Конференция будет разделена на два трека:
Startup track - вдохновляющие истории успеха и советы о том, с чего начать делать свою игру. Этот трек предназначен для студентов и энтузиастов, которые только начинают свой путь в этой сфере.
Expert track - сосредоточение информации последних тенденций отрасли, новых технологий и исследований. Данный раздел конференции будет больше интересен состоявшимся разработчикам; он так же подразумевает огромное количество коммуникации, обмена знаниями и возможности для развития бизнеса.
Ранняя регистрация на конференцию уже открыта и будет радовать низкими ценами до конца февраля. Стоимость участия заметно снизилась по сравнению с прошлым годом. Это было сделано, чтобы приветствовать молодых разработчиков, мечтающих о выходе собственной игры, а также для привлечения профессионалов этой отрасли, заинтересованных в развитии бизнеса и укреплении деловых связей.
Организаторы Game Dev Days сосредоточены на развитии и росте игровой индустрии в Эстонии, которая привлекательна для разработчиков по многим показателям: это и электронное правительство (электронная среда для создания бизнеса), и привлекательная налоговая политика для иностранных и местных издателей, разработчиков и старт-апов.
Выставка игр Game Village пройдет в течение первого дня конференции. Все участники конференции смогут голосовать за понравившийся проект. Победитель будет объявлен и награжден на вечеринке, посвященной окончанию первого дня конференции. Регистрация на Game Village абсолютно бесплатна для всех инди-разработчиков, условия регистрации можно найти на сайте конференции.
Будьте в курсе последних новостей конференции, посетите:
Website: https://goo.gl/jCG64k
Facebook: https://goo.gl/QCtFDU
Twitter: https://goo.gl/c0p3f9
О компании Creative Mobile
Creative Mobile – независимый разработчик и издатель мобильных игр из Таллинна, Эстония. Основана в 2010 году. Компания стремительно развилась из микрокоманды в крупную игровую студию, чьи игры крепко держат позиции в топах рейтинга на Google Play Store и App Store. Наиболее известна серия игр Drag Racing, которая стала родоначальником жанра на мобильных платформах. Количество закачек игр серии Drag Racing уже превысило двести миллионов.
Видением компании является создание оригинальных и интересных игр, которые сочетают в себе частые игровые сессии, длительный прогресс и богатый социальный опыт. Акцент команда делает на бесплатные игры на кросс-платформах, что позволит пользователям наслаждаться любимым занятием на любом устройстве абсолютно бесплатно.
Также компания Creative Mobile занимается издательской деятельностью под брендом Fun Factory. Целю является предоставление различных сервисов публикации, включая: минимум гарантии, четкие и понятные маркетинговые планы, а также обработку игр третьей стороны таким же способом, как игры собственного производства. Благодаря независимости и вовлеченности в самый прогрессивный игровой сектор Европы, наша компания отлично знает, чего ожидают инди-разработчики от издателя и какие угрозы и возможности присутствуют на игровом рынке.
Press Contact
Creative Mobile
Maria Tõshkovskaja
maria.toshkovskaja@creative-mobile.com
T.: +372 55911379
www.creative-mobile.com
Розробка під Android - поради початківцям
Автор: Армен Маїлян
Овладейте языком
Хорошие навыки работы со средой разработки и другими правильными инструментами разработки
Знание компонентов приложения
Понимание фрагментации, Android-приложений, потоков, загрузчиков и задач
Правильный выбор необходимых инструментов разработки и последние советы
Вывод
Разработка приложений под различные мобильные платформы (Android, iOs) – это то, на что ориентируются многие опытные и начинающие разработчики программного обеспечения. Ведь именно приложения делают телефоны «умными» смартфонами. Благодаря своим преимуществам приложения кардинально изменили возможности и функции вчерашних «звонилок». Выбирая разработку под Android как целевую платформу, у нас есть выбор между Java и Kotlin - основными языками программирования для этой платформы. Сейчас мы не будем вдаваться в детали их различий, и отвечать на вопрос «на чем писать приложения для Android?». Мы уже затрагивали этот вопрос недавно в соответствующей статье «Kotlin vs Java: что лучше для Android-разработки?». Сегодня мы остановимся на Java. Попробуем сформулировать основные советы в разработке приложений под андроид для начинающих.
Овладейте языком
На сегодняшний день Java и XML являются двумя основными языками, используемыми при разработке приложений под Android. Поэтому знание и владение этими языками программирования и разметки является необходимым условием для разработки приложения под Android. Задав себе вопрос «с чего начать программирование под андроид?», вы получите достаточно простой ответ – изучите основной язык разработки и основы ООП.
Знания основ языка программирования Java должны включать в себя:
• Понимание и применение пакетов (Packages) в Java;
• Общее понимание ООП, понятия объектов и классов;
• Понимание механизмов наследования, понимание и умение работать с интерфейсами;
• Работа со строками и числовыми значениями, работа с дженериками;
• Понимание функционирования коллекций и работы с ними;
• Параллелизм.
Правильное понимание Java и XML поможет вам создать/разработать более надежное и элегантное приложение для Android.
Хорошие навыки работы со средой разработки и другими правильными инструментами разработки
Очень важно, чтобы, прежде чем приступить к полноценной разработке своего приложения, вы были хорошо знакомы с инструментами автоматизации сборки, а также с таким инструментом, как IDE - интегрированной средой разработки. В основном рекомендуется использовать Android App Studio IDE или Eclipse в качестве среды разработки. Применение их поможет вам изучить основы разработки и поможет вам улучшить качество вашего кода. Также советуем вам изучить такие механизмы как Apache Maven, Apache Ant и Gradle, поскольку они предоставляют собой мощный набор инструментов, помогающих управлять вашими сборками.
В процессе разработки важно, чтобы вы умели использовать инструменты и концепции контроля версий. Изучите git, а затем создайте репозиторий git-source (создав учетную запись в Bitbucket или GitHub). Чтобы получить представление об основных понятиях и условиях работы платформы, вы можете воспользоваться Git Pocket Guide.
Знание компонентов приложения
Компоненты приложения — при разработке андроид-приложений выступают в роли основных строительных блоков. В свою очередь каждый из таких блоков представляет из себя отдельную точку, с помощью которой в ваше приложение может войти система. Хотя каждый из компонентов существует как отдельная сущность и играет свою отдельную роль, есть ряд компонентов, которые зависят друг от друга. При этом не все из них окажутся фактическими точками входа.
Среди компонентов приложения выделяют пять разных типов, каждый из которых выполняет определенную роль и имеет свой собственный жизненный цикл, согласно которому он будет создаваться и уничтожаться. Они включают:
Операции (Activity): это компонент андроид, представляющий один экран с пользовательским интерфейсом (к примеру, приложение для работы с электронной почтой может иметь одну Activity, отображающую список входящих писем, другую Activity - составляющую e-mail, и третью - читающую эти письма). Операции работают вместе, чтобы сформировать единый пользовательский опыт в андроид-приложении. Несмотря на это, каждая из Activity является независимой.
Службы: компонент приложения в андроид, работающий в фоновом режиме и обеспечивающий выполнение длительных Activity и удаленных процессов. Этот компонент пользовательский интерфейс не предоставляет (например, пока пользователь обращается к интерфейсу другого приложения, он может проигрывать музыку в фоне).
Поставщики содержимого или Content providers: компонент андроид-приложения, управляющий общим перечнем данных приложения. Используя этот компонент данные, хранимые в базе данных SQLite, в Интернете или файловой системе, могут быть запрошены или изменены (если допускает поставщик содержимого). Этот компонент также применим как для записи, так и чтения тех данных, что являются частными, а не общими для вашего приложения.
Широковещательные приёмники или Broadcast receivers: компонент андроид-приложения, отвечающий на широковещательные сообщения, общие для системы. Большая часть таких сообщений происходят от системы. Broadcast receivers могут создавать в строке состояния уведомления, которые предупреждают пользователя, когда происходит широковещательное событие, хотя и не имеют пользовательского интерфейса. Как правило такой приёмник выполняет только минимальный объем работы, выступая для других андроид-компонентов в роли шлюза.
Активация компонентов: асинхронное сообщение, также имеющее название - намерение (Intent). Активирует 3 из 4 компонентов (то есть сервисы, Broadcast receivers и Activity). Intents также связывают отдельные компоненты друг с другом во время выполнения, вне зависимости от того, принадлежит ли вашему приложению данный компонент или нет.
Понимание фрагментации, Android-приложений, потоков, загрузчиков и задач
Android — это фрагментированный рынок с множеством видов устройств и различных версий операционной системы. Обратите внимание, что, чем больше ваше устройство поддерживает различных устройств и/или версий, тем больше оно требует обслуживания и тестирования и, соответственно, больше будет сопутствующих расходов. Вам также потребуются соответствующие шрифты, ресурсы и макеты, которые помогут обеспечить наилучшее взаимодействие с различными характеристиками экрана. Вы придется держать во внимании всё множество поддерживаемых Android датчиков и средств пользовательского интерфейса.
Распределение версий Android по данным statista.com
Иногда, для выполнения фоновых задач, вам приходится использовать службы, которые должны выполняться непрерывно. Но, в ряде случаев, применение их может оказаться невозможным. Если вы хотите создать отличный и удобный пользовательский интерфейс, всегда следите за тем, чтобы поток никогда не блокировался. Поэтому длинные операции (вычисления, ввод-вывод, сеть и т. д.) должны выполняться асинхронно в фоновом режиме (в основном в другом потоке выполнения). Вот почему важно изучить средства параллелизма языка Java.
Правильный выбор необходимых инструментов разработки и последние советы
Что нужно для создания приложения на андроид? Чтобы начать программировать под Android, вам подойдут весьма простые инструменты — это персональный компьютер с Mac или OS Windows, Linux. Сами же инструменты разработки ( IDE Eclipse, плагин ADT и Android SDK) – распространяются бесплатно.
Android имеет некоторые уникальные параметры, которые вам следует учитывать при написании приложений под Android. Среди них:
Производительность и скорость отклика: вы всегда должны реагировать на ввод пользователя в течение пяти секунд, в противном случае приложение выдаст ошибку ANR (ANR: application not responding - приложение не отвечает). Единственный доступный вариант - принудительно закрыть приложение.
Пользователи заметят лаги более 100 мс: как уже упоминалось выше, поток пользовательского интерфейса никогда не должен блокироваться, потому что он только один.
Ограниченные ресурсы: Wake-Lock (механизм, который заставляет устройство выполнять определенные действия, несмотря на рекомендацию менеджера батареи перевести устройство в спящий режим), следует использовать с осторожностью. Не обращайтесь лишний раз к элементам оборудования (например, GPS или акселерометру), потому что такие действия быстро разряжает аккумулятор.
Вывод
Мы с вами рассмотрели ряд простых советов для тех, кто начинает программировать под андроид. Надеемся, что данные рекомендации помогут вам создавать новые высококачественные приложения.
Если вы только раздумываете над направлением, в котором вам следует развиваться – рекомендуем посмотреть видео «Как стать Android разработчиком». В этом видео вы также сможете получить подходящие для вас ответы на вопрос «как начать программировать под Android?». Если вы уже определились с направлением развития и желаете получать знания в сфере разработки под Android - рекомендуем вам ознакомиться с нашим курсом подготовки Android Developer. Если вы уже имеете определенные навыки в разработке и ищете дополнительных знаний по отдельным технологиям - вам наверняка будет полезен курс «Автоматизация сборки проектов с помощью Apache Maven».
В свой очередь портал ITVDN.com желает вам успехов в обучении, интересных проектов и высокой зарплаты.
По материалам статьи от Эшна Верна.
Створюємо Telegram-бота на Python. Частина 2
Автор: Армен Маїлян
Чат боты — это новый инструмент взаимодействия разработчика с пользователем. Их все чаще внедряют для совершенно различных целей. Новостные ленты, обработка налоговых деклараций, сохранение файлов – боты становятся удобным интерфейсом взаимодействия c различными сервисами.
В прошлой статье мы рассмотрели, как написать простейшего чат-бота на Python и запустить его на своем компьютере. Сегодня мы рассмотрим, как того, написанного нами бота, разместить на внешнем сервере в сети Интернет.
В качестве места размещения мы будем использовать бесплатный сервис Heroku.
Установка и настройка Git
Для дальнейшей работы нам понадобится установить Git, зарегистрироваться на GitHub и создать репозиторий с именем нашего приложения. В нашем случае это MyFirstTestBot.
Скачать версии Git, соответствующие вашей операционной системе, можно по следующим ссылкам для macOS и для Windows. На Linux Git можно установить, выполнив такую команду:
sudo apt-get install git-all
Далее, желательно использовать виртуальную среду. Если она не установлена, при установке Python вы можете ее установить, выполнив команду:
pip install virtualenv
Создадим новую папку для нашего приложения и связи его с GitHub. В нашем случае это папка PythonApplication1 в корне диска C.
Выполним клонирование репозитория. Для этого находясь в нашей папке в консоли выполним команду, введя ссылку на ваш репозиторий:
git clone https://github.com/your_github_account/your_repository_name
После выполнения этой команды в нашей папке с именем PythonApplication1 мы получили еще одну папку – MyFirstTestBot.
В консоли перейдем в корень диска C и выполним команду:
virtualenv PythonApplication1
Если команда не выполняется, и вы на экране консоли видите «"virtualenv" не является внутренней или внешней командой…» - вам следует настроить системную переменную PATH и добавить в нее адреса расположения вашей папки с Python и подпапки со скриптами (в моем случае C:\Users\B\AppData\Local\Programs\Python\Python37-32\Scripts).
Будем в дальнейшем пользоваться консолью Git, которую мы установили ранее:
После выполнения этого скрипта в нашей папке будет такое содержимое:
Поместим скрипт в папку, полученную в результате выполнения команды git clone (папка MyFirstTestBot). Имя файла с нашим скриптом - mftb.py
Теперь запустим наше виртуальное окружение. Перейдем в консоли в папку C:\PythonApplication1 и выполним команду:
source C:\PythonApplication1\Scripts\activate
Если все сработало нормально – в консоли приглашение командной строки будет начинаться с имени нашей папки (PythonApplication1):
Перейдём в нашу папку репозитория и выполним команду:
pip install requests
Создадим список зависимостей для Heroku, введя команду:
pip freeze > requirements.txt
Обратите внимание – в файле requirements.txt указываются требования к серверу Huroku. Там должно быть приблизительно такое содержимое:
Если вы не продолжаете проект из предыдущей статьи, а создали новый – не забудьте указать все зависимости.
В папке MyFirstTestBot создадим файл с именем Procfile без расширения. В теле этого файла пропишем:
web: python mftb.py
В папке MyFirstTestBot создадим также файл с именем __init__.py без содержимого.
Содержимое нашей папки MyFirstTestBot теперь такое:
Отправим в GitHub репозиторий наш набор изменений. Для этого выполним следующую серию команд, с указанием ссылки на ваш репозиторий:
git init
git add .
git commit -m “first commit – ваше сообщение комментарий к коммиту”
git push -u https://github.com/your_github_account/your_repository_name
Код нашего бота теперь загружен на GitHub и нам остается загрузить его на Heroku, где будет хоститься наш бот.
Рекомендуется ознакомиться с основами работы с Heroku по ссылке. По той же ссылке следует скачать установщик интерфейса командной строки (CLI) от Heroku и запустить его.
После установки CLI зарегистрируемся на Heroku через веб браузер.
Далее подключимся к Heroku через консоль используя команду:
heroku login
Нас попросят подключиться через браузер к сайту Heroku и залогиниться там. Нужно будет ввести ваши данные.
Выполним команду для создания приложения в Heroku:
heroku create
Дальнейшие наши команды отправят наш проект на сервер Heroku и укажут необходимую настройку:
git push heroku master
heroku ps:scale web=1
Последняя команда запустит наше приложение на сервере:
heroku open
Теперь наше предложение установлено и запущено на сервере. Мы можем проверить это, пообщавшись с нашим ботом в Telegram:
Как мы видим – все работает. Если по каким-то причинам бот не запустился, нужно ввести в консоли команду:
heroku logs –tail
И смотреть на коды ошибок на сайте.
Резюме.
В прошлой статье мы с вами посмотрели, как можно создать простого Telegram бота. Теперь мы опубликовали его на удаленном сервере. Наш чатбот работает, и мы можем к нему обращаться, используя привычный мессенджер. Конечно, этот вариант бота далек от идеала, но для учебных целей, как первый проект бота, он подойдет.
Попробуйте создать своего бота с другим набором предопределенных ответов. В дальнейшем вы сможете создавать более продвинутых чатботов, работающих с нейросетями и другими элементам искусственного интеллекта.
Чаще всего востребованные библиотеки для работы ботов сейчас пишут на Python. Именно поэтому мы рассмотрели этот простой пример. Для дальнейшего развития вас как квалифицированного Python разработчика мы рекомендуем ознакомиться с курсом подготовки Python-разработчика на портале ITVDN.
Як правильно скласти ТЗ англійською
Автор: Віктор Осадчий
Составляем ТЗ на английском
О важности правильно составленного и правильно понятого технического задания в работе любой IT-команды говорить не стоит. Вопрос в том, как правильно написать его на английском. А если вы работаете в международной команде, это потребуется обязательно. Без паники! EnglishDom расскажет, как написать ТЗ на английском и не наделать ошибок. Итак, обо всех важных моментах - по порядку.
SRS structure. Структура ТЗ
В техзадании обязательно присутствуют следующие разделы:
introduction - вступление,
overall description - общее описание,
specific requirements - специфические требования, а также возможны и appendices - приложения.
Поговорим о каждом разделе отдельно.
В introduction, помимо purpose - цели, может быть включен еще и scope - объем работ, definitions - термины, специфичные и принятые для этого ТЗ, и раздел overview, который дает общее представление о наполнении и структуре будущего проекта - identify the product, describe the content and the structure.
Overall description - это раздел, который включает многое:
product perspective - функционал будущего продукта, который описывает все внешние интерфейсы - describes all external interfaces,
functions - главные функции продукта (summary of major functions),
constraints, or anything that limits our options - возможные ограничения,
use cases - сценарии использования.
specific requirements - все, что можно назвать требованиями, идет в этот раздел. Собственно, это и есть его основной частью - body of the document.
Итак, структура ТЗ в общем виде должна выглядеть так:
Introduction: purpose / scope / definitions
Overall description: product perspective / functions / constraints / use cases
Specific requirements: all the possible requirements = body of the document
Useful phrases: identify / limit options, content, structure, product, external interfaces
Overview is a section that identifies the product and describes the content and the structure. - Общее представление - это раздел, который определяет проект и описывает наполнение и структуру.
Anything that limits our options is described in the constraints. - Все, что как-либо лимитирует варианты действий, указано в разделе “ограничения”.
All the possible requirements usually identify the body of the document. - Все возможные требования определяют главную часть документа.
Характеристики ТЗ
Есть несколько ключевых характеристик ТЗ.
Первое - оно должно быть correct - правильным, то есть up to the required standards for the quality, database integrity and so on - соответствовать требуемым стандартам по качеству, целостности базы данных и т.д.
Второе - unambiguous and complete - недвусмысленным и полным, чтобы четко описать проект и его функционал - describe what is the future project created for.
Третье - consistent and detailed - последовательным и детальным, подробно описывающее, каким будет взаимодействие с людьми, оборудованием и другими внешними интерфейсами - how it interacts with people, hardware and other external interfaces.
Четвертое - modifiable and traceable - поддающееся изменениям и их отслеживанию, то есть the one you can edit and control.
Ряд фраз, которые вам пригодятся:
imposed on an implementation - обязательный к внедрению,
main considerations - ключевые факторы,
operation environment - рабочая среда.
Итак, ТЗ должно быть:
Correct: up to the required standards for the quality / database integrity
Unambiguous and complete: describe what is the future project created for
Consistent and detailed: how it interacts with people, hardware and other external interfaces
Modifiable and traceable: the one you can edit and control
Полезные фразы: imposed on an implementation / main considerations / operation environment.
SRS typical mistakes. Как не испортить ТЗ
Столько деталей и нюансов, подпунктов, что сложно не ошибиться. Мы расскажем, чего стоит избегать.
Первое: ambiguity - неясность. don’t give too much or too little information that may not be verified - не стоит давать чересчур много или мало информации, которую, к тому же, еще и проверить нельзя.
Второе: requirements on users - требования к пользователям. Запомните, you can only assume what user will do - нельзя заставить пользователя, можно только предположить, что он будет делать.
Третье: unnecessary or invented terms - термины, которые не нужны или выдуманы. Avoid any extra terms if you can say it simple - избегайте лишней терминологии, если все можно сказать проще.
Бесполезные и ненужные в ТЗ вещи: forward reference - ссылка наперед, contradiction - противоречие, noise - лишняя информация, silence - недостаточное описание.
В общем, придерживайтесь структуры, избегайте лишней информации, используйте ключевые фразы - и ваше ТЗ будет идеальным!
Если же вы сомневаетесь в своем знании английского - в EnglishDom есть специальный курс “Английский для IT”, где вы сможете подтянуть все важные для it-шника темы. Научитесь писать резюме и CV, проходимть собеседования, обсуждать проекты и проводить переговоры, переписываться в чате, писать ТЗ и деловые письма, понимать носителей языка и читать зарубежные блоги.
Застосування мультикласів у CSS
Автор: Олександр Марченко
Введение в мультиклассы.
В данной статье мы познакомимся с так называемыми сложными селекторами, особенностями их применения. Для более простого восприятия материала рекомендуем просмотреть пятый видео урок из курса HTML & CSS.
Для начала вспомним, что таблицы стилей собираются из наборов правил, которые содержат один или несколько селекторов и конечно же содержат блок определений. Блок определений ограничен фигурными скобками и содержит в себе перечень свойств и выбранных для них значений.
Селектором может быть любой элемент или HTML-тег, для которого возможно задание неких правил форматирования. Принцип определения селекторов довольно простой и имеет следующий синтаксис: Name {Style_rules}.
Здесь Name – это имя любого элемента на вашей странице, а Style_rules – описание правил стиля, которые вы собираетесь применить к элементу.
Отдельно обратим ваше внимание на универсальный селектор, который используют, когда требуется установить стиль абсолютно для всех элементов, присутствующих в веб-документе. Он имеет следующий синтаксис:
<head>
<title>CSS title>
<style>
/*Используем универсальный селектор, который обозначается "*" */
* {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо одновременно задать один стиль для двух и более элементов, их перечисляют через запятую:
<head>
<title>CSStitle>
<style>
/*Используем перечисление селекторов p, div */
p, div {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо задать уникальное имя для элемента и по нему изменить его стили или обратиться через JavaScript, целесообразно использовать идентификатор, изредка называемый «ID селектором».
Поскольку при создании html-документа невозможно отказаться от определенной иерархии вложенности, важно задуматься о том, чтобы стили для вложенных элементов применялись корректно. Целесообразно воспользоваться конструкцией из вложенных селекторов. В самом простом случае получим следующую конструкцию: name1 name2 {Style_rules}, где name1 – родительский элемент, name2 – дочерний (вложенный) тег. При этом подразумевается следующая разметка <name1><name2>...name2>name1>.
<head>
<title>CSStitle>
<style>
div p {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
head>
<body>
<p>Параграф 1 p>
<div>
<p>Параграф 2 p>
div>
body>
Стоит помнить, что стили, предопределенные для тега div, также возымели бы свое действие на содержимое тега p, также допускается произвольный уровень вложенности тегов.
Данная конструкция имеет следующий синтаксис: #Name { Style rules }. Стоит помнить, что имена идентификаторов должны быть уникальными, дабы не вызывать коллизий при обращениях, начинаться с латинских символов, в них разрешено включать символы дефиса и нижнего подчеркивания «-», «_». Когда необходимо применить стили из идентификатора определенному тегу, используется атрибут id, которому передается значение – имя идентификатора без решетки.
<head>
<title>CSStitle>
<style>
#id1 {
background-color: #ffd800;
color: #ff0000;
font-size: 40px;
}
style>
head>
<body>
<p id="id1">Параграф 2 p>
body>
Порой при определении идентификатора используется конструкция name#id_name {Style rules}, где name может обозначать любой тег. Подобная конструкция ограничивает возможность применения стилей, определенных в идентификаторе только к тегам, одноименным указанному в определении.
Что касается применения классов, они актуальны тогда, когда необходимо задать правила форматирования для определенного селектора или же для нескольких элементов. Существуют следующие варианты использования классов:
.class_name {Style rules}
Класс, определенный таким образом, можно связать с любым тегом, достаточно воспользоваться атрибутом class и передать в его значении имя нашего класса.
Name.class_name {Style rules}
Таким образом накладываются ограничения на применение правил из класса лишь в одноименных тегах Name.
<head>
<title>CSStitle>
<style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
div.mySecondClass {
background-color: darkcyan;
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p class="myFirstClass">Параграф 1 p>
<p class="mySecondClass">Параграф 1p>
<div class="mySecondClass">Параграф 1 div>
body>
Работая с классами, стоит помнить о том, что любому элементу можно добавить сразу несколько классов, просто перечисляя их в атрибуте class без каких-либо знаков пунктуации, через пробел. При этом к текущему элементу будут применятся стили, описанные в каждом из классов в блоке правил.
<head>
<title>CSStitle>
<style>
.myFirstClass {
background-color: darkcyan;
}
.mySecondClass {
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p class="myFirstClass mySecondClass">Параграф 1 p>
body>
Прибегая к мультиклассам, стоит помнить об особенности их работы с повторяющимися правилами, т.е. одноименными свойствами, которые описаны в разных классах и имеют различные значения.
Укажем несколько одинаковых свойств с разными значениями и посмотрим, какие из них будут применены к элементу:
<style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
Как видим, значения спорных свойств были взяты из того класса, который был описан в коде ниже. Если сменим их очередность, получим следующий результат:
<style>
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
--style>
Что касается порядка обьявления используемых классов в атрибуте class непосредвенно в самом теге, он не имеет значения:
<p class="myFirstClass mySecondClass">Параграф 1p>
<p class="mySecondClass myFirstClass">Параграф 1p>
Эти две строки возымеют одинаковое воздействие на форматирование параграфа.
STOP WAR IN UKRAINE
Автор: Редакция ITVDN
10 дней идет война. 10 дней назад, 24 февраля, в 5 часов утра все сотрудники ITVDN проснулись от звуков бомбардировки и воздушной тревоги. Сейчас вся наша команда – авторы курсов, администраторы, разработчики, дизайнеры – прекратили работу и защищают свой родной дом. За эти 10 дней мы привыкли и к звукам падения крылатых ракет и к тому, как трясется стекло в окнах, заклеенных скотчем.
Обращаемся к россиянам и белорусам, чья власть отправляет к нам свои войска – мы вас не звали, нас не нужно спасать. Украина – свободная страна, в которой мы сами выбираем и меняем власть. Забирайте своих мужей и сыновей обратно домой и остановите агрессора немедленно. Ни вам, ни нам эта война не нужна.
Уважаемые граждане Украины – мы победим в этой войне, нет сомнений! Мы уже победили силой духа и единством. Мы гордимся тем, как вся наша страна объединилась в это трудное время.
Люди мира и доброй воли – Украина просит поддержки в борьбе с захватчиком. Давайте как можно быстрее остановим кровавую войну, которая отнимает ежедневно сотни жизней, разрушает древние украинские города и села. Помогите нам освободить нашу землю от захватчиков и наказать агрессора.
10 днів триває війна. 10 днів тому, 24 лютого о 5-й годині ранку всі співробітники ITVDN прокинулись від звуків бомбардування та повітряної тривоги. Зараз вся наша команда – автори курсів, адміністратори, розробники, дизайнери – припинили роботу і захищають свій рідний дім. За ці 10 днів ми звикли і до звуків падіння крилатих ракет і до того, як труситься скло у вікнах, заклеєних скотчем.
Звертаємося до росіян і білорусів, чия влада відправляє до нас свої війська - ми вас не кликали, нас не треба рятувати. Україна – вільна країна в якій ми самі обираємо і змінюємо владу. Забирайте своїх чоловіків і синів назад додому, і зупиніть агресора негайно. Ні вам, ні нам ця війна не потрібна.
Шановні громадяни України – ми переможемо у цій війні, немає жодного сумніву! Ми вже перемогли силою духу та єдністю. Ми пишаємося тим, як вся наша країна об'єдналась у цю важку годину.
Люди світу і доброї волі – Україна просить підтримки у боротьбі із загарбником. Давайте якнайшвидше зупинимо цю криваву війну, яка відбирає щоденно сотні життів, руйнує стародавні українські міста і села. Допоможіть нам звільнити нашу землю від загарбників і покарати агресора.
The war has been going on for 10 days. 10 days ago, on February 24, at 5:00 a.m., all ITVDN employees were awakened by the sounds of bombardment and air raids. Now our entire team – course authors, administrators, developers, designers – have stopped working and are protecting their home. During these 10 days, we got used to the sounds of falling cruise missiles and how glass shakes in windows sealed with adhesive tape.
We appeal to the russians and belarusians, whose authorities send their troops to us – we didn't call you, we don't need to be “liberated”. Ukraine is a free country in which we ourselves choose and change the government. Take your husbands and sons back home and stop the aggressor immediately. Neither you nor we need this war.
Dear citizens of Ukraine – we will win this war, there is no doubt! We have already won by strength of spirit and unity. We are proud of how our entire country has come together during this difficult time.
People of peace and goodwill – Ukraine asks for support in the fight against the invader. Let's stop the bloody war, which takes hundreds of lives every day, destroys ancient Ukrainian cities and villages, as soon as possible. Help us liberate our land from invaders and stop the aggressor.
Як розробнику знайти першу роботу в IT
Автор: Ірина Титенко
<p bis_size="{"x":20,"y":20,"w":1019,"h":60,"abs_x":434,"abs_y":734}">Многие начинающие разработчики, которые ищут первую работу, сталкиваются с одной и той же проблемой: есть хорошая теоретическая база (вуз/курсы/самообучение), хорошее портфолио, глаза горят жаждой разрабатывать качественное ПО, но нет одной важной вещи — хотя бы минимального опыта работы по специальности. И это становится большим препятствием на пути к желанной должности для новичков.</p>
<p bis_size="{"x":20,"y":93,"w":1019,"h":60,"abs_x":434,"abs_y":807}">Как попасть в IT-компанию тем, кто обладает требуемыми знаниями, однако не имеет опыта работы и соответствующих рекомендаций? Каковы реалии IT-рынка труда, с чего начать поиск вакансий, как грамотно составить CV и заявить о себе работодателю - ответы на эти, а также другие вопросы в нашем вебинаре с Ириной Тытенко.</p>
<p bis_size="{"x":20,"y":166,"w":1019,"h":40,"abs_x":434,"abs_y":880}"><em bis_size="{"x":20,"y":168,"w":299,"h":15,"abs_x":434,"abs_y":882}">Вебинар будет проходить в рамках программы </em><a bis_size="{"x":319,"y":168,"w":123,"h":15,"abs_x":733,"abs_y":882}" href="https://edu.cbsystematics.com/ru/employment-assistance"><em bis_size="{"x":319,"y":168,"w":123,"h":15,"abs_x":733,"abs_y":882}">Карьерного сервиса</em></a><em bis_size="{"x":20,"y":168,"w":1007,"h":35,"abs_x":434,"abs_y":882}"> для студентов CyberBionic Systematics, но принять участие в нем могут все желающие. Для получения ссылки на трансляцию обязательно зарегистрируйтесь.</em></p>
<p bis_size="{"x":20,"y":219,"w":1019,"h":20,"abs_x":434,"abs_y":933}"><strong bis_size="{"x":20,"y":221,"w":131,"h":15,"abs_x":434,"abs_y":935}">Программа встречи:</strong></p>
<ul bis_size="{"x":20,"y":252,"w":1019,"h":160,"abs_x":434,"abs_y":966}">
<li bis_size="{"x":60,"y":252,"w":939,"h":20,"abs_x":474,"abs_y":966}">Как понять, что вы уже готовы к поиску работы?</li>
<li bis_size="{"x":60,"y":272,"w":939,"h":20,"abs_x":474,"abs_y":986}">Какие требования в украинском IТ для джуниоров?</li>
<li bis_size="{"x":60,"y":292,"w":939,"h":20,"abs_x":474,"abs_y":1006}">Что нужно для эффективного поиска первой работы?</li>
<li bis_size="{"x":60,"y":312,"w":939,"h":20,"abs_x":474,"abs_y":1026}">Где размещать и кому присылать свое резюме?</li>
<li bis_size="{"x":60,"y":332,"w":939,"h":20,"abs_x":474,"abs_y":1046}">Какие есть дополнительные точки входа в украинское IТ?</li>
<li bis_size="{"x":60,"y":352,"w":939,"h":20,"abs_x":474,"abs_y":1066}">Тестовые задания. За или против?</li>
<li bis_size="{"x":60,"y":372,"w":939,"h":20,"abs_x":474,"abs_y":1086}">Общие рекомендации для подготовки к собеседованиям.</li>
<li bis_size="{"x":60,"y":392,"w":939,"h":20,"abs_x":474,"abs_y":1106}">Что делать, когда вам постоянно отказывают рекрутеры?</li>
</ul>
Що таке патерни проєктування у програмуванні
Автор: Влад Сверчков
Що таке патерн (шаблон) проєктування.
Коли використовують шаблони.
Якими бувають патерни проєктування.
Породжуючі.
Структурні.
Патерни поведінки.
Як обрати шаблон?
Висновки.
Програмісти-початківці завжди приходять до точки, коли їхній код перетворюється на “спагеті”. Його важко читати, він містить масу самоповторень, зайвих функцій, а додавання нового функціоналу перетворюється на десяте коло пекла.
Один із найкращих засобів запобігання цьому – використовувати патерни проєктування (Design Patterns). Чи є це срібною кулею, які переваги та недоліки патернів існують, і які з них необхідно знати розробникам? Відповіді розбираємо нижче.
Що таке патерн (шаблон) проєктування?
Патерни – це типові архітектурні рішення проблем, котрі часто зустрічаються під час розроблення ПЗ. Їхня інша назва – шаблони, і що цікаво – людство дуже часто оточує себе шаблонами у повсякденному житті:
однакові гнізда розетки та форми вилок у приміщеннях – універсальне рішення для електроживлення;
виделки та ложки – інструменти споживання майже будь-якої їжі;
чашки – ємності для розміщення будь-якої рідини і так далі.
Людина завжди прагне спростити традиційну діяльність, і це не могло обійти стороною програмування.
Ідеї створення універсальних правил для якісної розробки існували ще до 90-х років минулого століття, але дійсно проривною стала праця "Design Patterns: Elements of Reusable Object-Oriented Software" (1994) авторства Еріха Ґамма, Річарда Гелма, Ральфа Джонсона та Джона Вліссідеса, які іменують себе як "Банда чотирьох" (Gang of Four, GoF).
У книзі описано 23 патерна та їхнє застосування в об'єктно-орієнтованому дизайні. Ця праця стала фундаментальною і тепер патерни gof складають кістяк багатьох обговорень якісного коду.
Коли використовують патерни
В розробці шаблони використовують при необхідності приведення коду до наступних критеріїв:
Читабельність – інші розробники мають без складнощів розуміти написане.
Масштабованість – легкість у створенні нового функціоналу.
Підтримуваність – оновлення кодової бази має проходити якомога плавніше.
Також вони здатні підвищити швидкість і продуктивність розробника – патерни це дійсно дозволяють. Вони гарно справляються і з наступними задачами:
зменшення кількості потенційних помилок та вузьких місць;
спрощення рефакторингу;
зменшення технічного боргу;
покращення комунікації девелоперів з іншими програмістами, проєктними менеджерами, власниками тощо.
Необхідність використати шаблони проектування зростає разом зі збільшенням кодової бази, особливо при комерційному розробленні – коли створюване ПЗ має приносити прибуток.
Важливо пам’ятати, що використання патернів інколи є геть недоречним. Подекуди воно може значно ускладнити читабельність, громіздкість і масштабованість коду. Наприклад, нескладний функціонал, який нечасто використовується і займає мало місця в коді, не потребує pattern-втручання. А от репетативний код, що вирішує класичні задачі (сортування, перебір даних тощо) – ідеальний претендент на застосування шаблону.
Аби не помилитися спершу з’ясуйте контекст вашої проблеми, а вже потім обирайте патерни програмування, які найкраще задовольняють вимогам.
Якими бувають патерни проєктування
У своїй книзі GoF виділяють три великі сімейства:
Сімейство
Короткий опис
Породжуючі патерни або Creational Patterns
Надають найкращі способи створення об'єктів. Вони абстрагуються від процесу конкретизації і роблять вашу систему незалежною від створення, компонування та представлення її об'єктів.
Популярні приклади: “Абстрактна фабрика” (Abstract Factory), “Одинак” / “Одиночка” (Singleton), “Прототип” (Prototype), “Фабричний метод” (Factory Method).
Структурні патерни або Structural Patterns
Фокусуються на композиції об’єкту. Допомагають переконатися в тому, що зміна частини системи не потягне за собою необхідність змін в інших її складових.
Популярні приклади: “Проксі” (Proxy), “Адаптер” (Adapter), “Компонувальник” (Composite), “Фасад” (Facade).
Патерни поведінки або Behavioral Patterns
Зона відповідальності – алгоритми та обмін інформацією між об’єктами.
Популярні приклади: “Відвідувач” (Visitor), “Ітератор” (Iterator), “Ланцюжок обов’язків” (Chain of Responsibility), “Стратегія” (Strategy).
Розглянемо більш детально деякі з них.
Породжуючі
Породжуючі патерни – це надійні помічники у створенні об’єктів таким чином, аби в майбутньому з ними було максимально легко працювати.
Дамо короткий опис деяких шаблонів:
Патерн Одинак / Сінглтон забезпечує наявність лише одного екземпляру класу з глобальною точкою доступу. Singleton поширений в задачах конфігурацій або логування в застосунках, де потрібен єдиний контрольований доступ.
Шаблон Прототип дозволяє створювати нові об'єкти шляхом копіювання існуючих екземплярів. Використовується Prototype в ситуаціях, коли створення об'єкта надто дороге, наприклад, при клонуванні складних або ресурсоємних об'єктів.
Фабричний метод визначає інтерфейс для створення об'єктів, але дозволяє підкласам самостійно визначати тип створюваних об'єктів. Fabric Method корисний у багатофункціональних застосунках, де класи повинні мати можливість вибирати тип об'єктів, наприклад, при роботі з різними форматами документів, системами онлайн платежів тощо.
Абстрактна фабрика визначає інтерфейс для створення сімейств пов'язаних об'єктів без вказівки їх конкретних класів. Використовують Abstract Factory для створення різних компонентів інтерфейсу користувача, які повинні працювати разом і забезпечувати єдиний стиль (світла / темна тема вебсайту тощо).
Розглянемо приклад на патерні Singleton. Уявіть собі просту програму – музичний плеєр. Він дозволяє користувачам відтворювати музичні файли. Однак водночас має працювати лише один екземпляр плеєра – можливість відкриття декількох одночасно повинна бути недоступна. Цього можна досягти за допомогою шаблону Singleton.
Простий приклад коду мовою C#:
public class MusicPlayer
{
private static MusicPlayer _instance;
private MusicPlayer()
{
// Ініціалізуємо музичний плеєр (наприклад, завантажуємо плейлисти)
}
public static MusicPlayer Instance
{
get
{
if (_instance == null)
{
_instance = new MusicPlayer();
}
return _instance;
}
}
public void PlaySong(string songPath)
{
// Запустити пісню
}
public void PauseSong()
{
// Поставити на паузу
}
public void StopSong()
{
// Зупинити відтворення пісні
}
}
// Отримуємо екземпляр MusicPlayer
MusicPlayer player = MusicPlayer.Instance;
// Використовуємо функціонал MusicPlayer
player.PlaySong("C:\\Users\\yourUsername\\Music\\mySong.mp3");
player.PauseSong();
player.StopSong();
Щоразу як в різних ділянках проєкту вам треба буде створювати екземпляр плеєру для відповідної взаємодії, ви завжди працюватимете лише з одним і тим самим екземпляром, уникаючи дублікації.
Якщо ви програмуєте мовою сі шарп, детально розібрати популярні патерни проєктування C# з прикладами ви можете за посиланням.
Структурні
З короткого опису в таблиці легко дійти висновку, що структурні патерни дозволяють сформувати надійну, масштабовану та підтримувану архітектуру проєкту. Коротке знайомство:
Проксі забезпечує об'єкт-посередник для контролю доступу до іншого об'єкта. Зазвичай шаблон Proxy використовують для реалізації “лінивого” завантаження, коли об'єкт створюється або ініціалізується лише при зверненні до нього (наприклад, завантаження картинок з високою роздільною здатністю).
Адаптер дозволяє об'єктам з несумісними інтерфейсами працювати разом. Застосовується патерн Adapter для інтеграції нових компонентів в існуючу систему без зміни її коду. Підходить для використання нової бібліотеки у старому застосунку.
Компонувальник використовується для ієрархічного компонування об'єктів для подальшої роботи з ними як з єдиним об'єктом. Використовується для створення деревоподібних структур, як-от файлові системи або GUI, де кожен вузол може бути як простим, так і Composite об'єктом.
Фасад (Facade) надає спрощений інтерфейс для взаємодії зі складною системою або набором класів. Він зменшує складність роботи з підсистемами і надає користувачам єдиний вхідний інтерфейс для виконання рутинних операцій.
Вивчити саме структурні патерни проєктування C# (з прикладами) ви можете за посиланням.
Поведінкові
Патерни поведінки в першу чергу визначають зв’язки між об’єктами і те, як вони здійснюють обмін інформацією. Наприклад:
Патерн Відвідувач (Visitor) дозволяє додавати нові операції до об'єктів без зміни їхніх оригінальних класів. Використовується для взаємодії з об’єктами зі складною структурою, коли внесення додаткової логіки в оригінальні класи невиправдано ускладнює код.
Ітератор / Iterator надає зручний механізм послідовного та простого доступу до елементів колекції, незважаючи на складність її побудови. Даний патерн поведінки популярний при обході елементів контейнерів, як-от списки або масиви – він надає універсальний інтерфейс для різних типів колекцій.
Ланцюжок обов’язків або ж патерн Chain of Responsibility дозволяє передавати запит ланцюжком обробників, поки один з них не обробить запит. Незамінний при обробці запитів на сервері, де кожен обробник може передати запит наступному обробнику в ланцюжку: перевірка при авторизації на сайті, оброблення подій у GUI тощо.
Для входу в патерни проєктування книга від Gang of Four буде гарною точкою відліку. Ви познайомитеся з класикою та академічним розкриттям теми, використовуючи патерни gof. Якщо ж ви хочете збагатити свої знання шаблонів, але віддаєте перевагу мові Java, рекомендуємо відео курс “Патерни проектування Java”.
Як обрати патерн?
Спочатку ви маєте проаналізувати задачу – для більшої зрозумілості виконайте її декомпозицію, розбивши на декілька складових. При цьому використовуйте системний підхід: прорахуйте, як ваше рішення вплине на весь проєкт, які елементи воно зачепить зараз, і який вплив воно матиме на додавання нового коду.
Якщо ви вже працюєте в ІТ-компанії, ваші колеги, тімлід або архітектор можуть підказати вам доцільність використання того чи іншого патерну, розкрити нюанси вже існуючої архітектури, кодового стилю та багато іншого.
Лише після ретельного аналізу можна переходити до підбору шаблону, зважаючи на усі переваги та недоліки. До речі, в цих задачах гарними помічниками будуть безкоштовні AI-асистенти на кшталт ChatGPT, Gemini та ін.
Також не забувайте про використання інших методик покращення кодової читабельності, масштабування й чистоти:
SOLID принципи – вони регламентують 5 основних засад створення структурованого, якісного коду. Нещодавно ми проводили вебінар, на якому розбирали кожен принцип в деталях, запрошуємо до перегляду! А якщо вас цікавить прикладний характер SOLID принципів на Java, можете пройти даний відео курс.
GRASP (General Responsibility Assignment Software Patterns) – патерни для об’єктно-орієнтованого проєктування. Вони не мають вираженої структури і носять більш абстрактний характер, аніж патерни gof.
DRY (Don’t Repeat Yourself) – головна ідея даного принципу полягає у створенні коду, який не матиме дублікацій в проєкті.
KISS (Keep It Simple, Stupid) – регламентує написання якомога простішого коду, аби його можна було легко читати і розуміти.
Рефакторинг – повернення до вже написаного коду з метою його покращення без зміни функціональності.
Інші техніки, що залежать від проєктів.
Висновки
Патерни грають ключову роль в сучасному розробленні. Вони акумулюють в собі найкращі практики створення кодової бази таким чином, аби досягнути максимальної легкості та ефективності розроблення, особливо на великих проєктах.
Звісно, не завжди їхнє використання є доречним – потрібно аналізувати задачі і продумувати наслідки застосування того чи іншого шаблону, аби не отримати величезну валізу без ручки.
Розвивайте вашу експертизу в області патернів – це win-win стратегія. З одного боку перед працедавцями ви постанете як досвідчений та висококваліфікований спеціаліст, а з іншого – ваші програмні рішення матимуть елегантний характер і відзначатимуться легкістю в читанні, підтримці та масштабуванні.
Чи використовуєте ви патерни в своїй розробницькій діяльності? Можливо, тільки вивчаєте? Залишайте в коментарях ваші відповіді!
Kotlin vs Java: що краще для Android-розробки?
Автор: Виджай Катри
Kotlin – это статически типизированный язык программирования, разработанный компанией JetBrains. Подобно языку Java, Kotlin стал отличным выбором для разработки приложений на Android. Это можно увидеть даже из того факта, что Android Studio поставляется со встроенной поддержкой Kotlin, как и с поддержкой Java.
Kotlin против Java
Итак, вопрос состоит в том, стоит ли разработчику переходить на Kotlin с Java или нет? Конечно это зависит от предпочтений разработчика. Однако, прежде чем переключаться, важно понять разницу между двумя языками программирования.
Проверяемые исключения
Одно из основных различий между Java и Kotlin заключается в том, что в последнем нет условий для проверяемых исключений (checked exception). Следовательно, нет необходимости отлавливать или объявлять какие-либо исключения.
Если разработчик, работающий на Java, считает, что использование кода try / catch в коде раздражает, то упущение, сделанное Kotlin, можно считать желанным изменением. Однако противоположностью будет, если разработчик считает, что проверяемые исключения нужны, способствуя восстановлению после ошибок и созданию надежного кода. В этом случае это можно считать для Kotlin плюсом и минусом, в зависимости от подхода к разработке.
Краткость кода
Сравнение класса Java с эквивалентным классом Kotlin демонстрирует лаконичность кода Kotlin. Для той же операции, что выполняется в классе Java, класс Kotlin требует меньше кода.
Например, конкретный сегмент, где Kotlin может значительно сократить общий объем стандартного кода, - это findViewByIds.
Расширения Kotlin в Android позволяют импортировать ссылку на View в файл Activity. Это дает возможность работать с этим представлением, как если бы оно было частью Activity.
Это явно можно отнести к плюсам Котлин.
Сопрограммы
Процессы, интенсивно загружающие процессор и сетевой ввод-вывод, обычно используют длительные операции. Вызывающий поток блокируется до завершения всей операции. Поскольку Android является однопоточным по умолчанию, пользовательский интерфейс приложения полностью блокируется, как только блокируется основной поток.
Традиционное решение этой проблемы в Java - создать фоновый поток для длительной или интенсивной работы. Однако управление несколькими потоками приводит к увеличению сложности, а также к ошибкам в коде.
Kotlin также позволяет создавать дополнительные потоки. Тем не менее, есть лучший способ управления интенсивными операциями в Kotlin, известный как сопрограммы или корутины (coroutines). Корутины в Kotlin реализованы без стека, что означает, что они требуют меньшего использования памяти по сравнению с обычными потоками.
Корутины могут выполнять длительные и интенсивные задачи, приостанавливая выполнение, не блокируя поток, а затем возобновляя выполнение через некоторое время. Это позволяет создавать неблокирующий асинхронный код, который выглядит в работе как синхронный.
Код с использованием корутин не только понятен, но и лаконичен. Более того, корутины позволяют создавать элегантные дополнительные стили асинхронной неблокирующей разработки, такие как async / await.
Все это также явно относится к плюсам Котлина.
Классы данных
В полноразмерных проектах обычно есть несколько классов, предназначенных исключительно для хранения данных. Хотя эти классы практически не имеют функциональности, разработчику необходимо написать много стандартного кода на Java.
Обычно разработчик должен определить конструктор и несколько полей для хранения данных, функции геттеры и сеттеры для каждого из полей, а также функции equals(), hashCode() и toString().
У Kotlin есть очень простой способ создания таких классов. Разработчику достаточно включить только ключевое слово data в определение класса, и все - компилятор сам позаботится обо всем.
Такое удобство создания классов, в вопросах для Kotlin «за и против», явно свидетельствует в его пользу.
Функции расширения
Kotlin позволяет разработчикам расширять класс новыми функциями с помощью функций расширения. Эти функции, хотя и доступны в других языках программирования, таких как C#, не доступны в Java.
Создать функцию расширения легко в Kotlin. Это делается путем добавления префикса к имени класса, который должен быть расширен до имени создаваемой функции. Чтобы вызвать функцию в экземплярах расширенного класса, нужно использовать нотацию «.»
Функции высшего порядка и лямбды
Функция высшего порядка - это функция, которая принимает другие функции в качестве параметров или возвращает функцию. Кроме того, функции Kotlin являются функциями первого класса. Это означает, что они могут храниться в структурах данных и переменных, которые могут передаваться в качестве аргументов и возвращаться из других функций более высокого порядка.
Все это просто означает, что функции могут работать всеми возможными способами во взаимодействии с другими нефункциональным значениям.
Как статически типизированный язык программирования, Kotlin использует ряд функциональных типов для представления функций. Более того, он поставляется с набором специализированных языковых конструкций, таких как лямбда-выражения.
Анонимные функции и лямбда-выражения также известны как функциональные литералы. Это функции, которые не объявлены, но передаются как выражения.
Неявные расширяющие преобразования
В Котлине нет поддержки неявных расширяющих преобразований для данных. Таким образом, меньшие типы не могут быть преобразованы в большие типы. В то время как Java поддерживает неявные преобразования, Kotlin требует выполнить именно явное преобразование.
Ряд разработчиков воспринимает это как минус Котлин.
Встроенные функции
Переменные, к которым осуществляется доступ в теле функции, называются замыканиями. Использование функций высшего порядка может существенно увеличить время выполнения вычислений. Каждая функция в Kotlin является объектом, и он захватывает замыкание.
И классы, и функторы требуют выделения памяти. Они, наряду с виртуальными вызовами, требуют определенных затрат на время выполнения. Таких дополнительных издержек можно избежать, вставив лямбда-выражения в Kotlin. Одним из таких примеров является функция lock().
В отличие от Kotlin, Java не обеспечивает поддержку встроенных функций. Тем не менее, компилятор Java способен выполнять встраивание с использованием метода final. Это так, потому что методы final не могут быть переопределены подклассами. Кроме того, вызов метода final разрешается во время компиляции.
Такие нововведения также воспринимаются как плюсы Котлина.
Встроенная поддержка делегирования
В терминологии программирования, Делегирование представляет собой процесс, в котором принимающий объект делегирует свои операции второму объекту делегата. Kotlin поддерживает шаблон проектирования композиция поверх наследования посредством делегирования первого класса, также известный как неявное делегирование.
Делегирование в Kotlin является альтернативой наследования. Этот механизм позволяет использовать множественное наследование. Кроме того, делегированные свойства Kotlin предотвращают дублирование кода.
Не-private поля
Инкапсуляция необходима в любой программе для достижения желаемого уровня управляемости.
Посредством инкапсуляции, представление объекта может быть установлено исходя из того, как вызывающие стороны взаимодействуют с ним. Кроме того, можно изменить представление без необходимости изменения вызывающих абонентов, если публичный API остается неизменным.
Неприватные поля или public поля в Java полезны в сценариях, где вызывающие объекты должны меняться в соответствии с их представлением. Это означает, что такие поля предоставляют представление объекта вызывающим объектам. У Kotlin нет не-private полей.
Это достаточно интересное отличие при сравнении Kotlin и Java.
Нулевая безопасность
Одной из самых заметных проблем для разработчиков, связанных с Java, является NullPointerExceptions. Java позволяет разработчикам присвоить значение null любой переменной. Однако, если они пытаются использовать ссылку на объект с значением null, возникает исключение NullPointerException!
В отличие от Java, в Kotlin все типы по умолчанию являются не-nullable. Если разработчики попытаются присвоить или вернуть значение null в коде Kotlin, во время компиляции произойдет сбой. Тем не менее, есть способ обойти этот момент. Чтобы присвоить значение null переменной в Kotlin, необходимо явно пометить эту переменную как nullable. Это делается путем добавления знака вопроса после типа, например:
val number: Int? = null
Таким образом, в Kotlin нет исключений NullPointerException. Если вы встречаете такое исключение в Kotlin, то, скорее всего, вы либо явно присвоили значение null, либо это связано с каким-то внешним Java-кодом.
Примитивные типы
Существует 8 примитивных типов данных, включая char, double, float и int. В отличие от Kotlin, переменные примитивного типа не являются объектами в Java. Это означает, что они не являются объектами, созданными из класса или структуры.
Умные приведения
Прежде чем объект может быть приведен в Java, обязательно нужно проверить тип. Это также верно в сценариях, где очевидно нужно приводить объект.
В отличие от Java, Kotlin имеет функцию умного приведения, которая автоматически обрабатывает такие избыточные приведения. Вам не нужно выполнять приведение внутри оператора, если он уже проверен оператором is в Kotlin.
Статические Члены
В Kotlin нет статических элементов. Однако в языке программирования Java ключевое слово static отражает то, что конкретный член, с которым используется это ключевое слово, принадлежит самому типу, а не экземпляру этого типа.
Это просто означает, что один и только один экземпляр этого статического члена создается и используется всеми экземплярами класса.
Поддержка Конструкторов
Классы Kotlin, в отличие от классов Java, могут иметь один или несколько вторичных конструкторов, в дополнение к первичному конструктору. Это делается путем включения этих вторичных конструкторов в объявление класса.
Троичный оператор
В отличие от Kotlin, Java имеет тернарный оператор. Тернарный оператор в Java работает как базовый оператор if. Он состоит из условия, которое оценивается как истинное или ложное.
Кроме того, тернарный оператор в Java имеет два значения. Только одно из них возвращается в зависимости от того, является ли условие истинным или ложным. Синтаксис для тернарного оператора Java:
(состояние) ? (значение 1) : (значение 2)
Типы подстановочных знаков
В общем коде, ' ?' представляет неизвестный тип. Этот символ известен как подстановочный знак. Существует несколько вариантов использования подстановочного знака, в том числе в качестве типа поля, локальной переменной или параметра.
В то время как система типов Java предлагает использовать подстановочные знаки, в Kotlin их нет. Тем не менее, у него есть два других механизма - вариативность на уровне объявления и проекции типов как альтернатива.
Этого будет полезно учитывать при переходе с Java на Kotlin.
Библиотеки обработки аннотаций с Kotlin
Помимо предоставления поддержки существующим Java-фреймворкам и библиотекам, Kotlin также предлагает расширенные Java-фреймворки, основанные на обработке аннотаций.
Однако применение в Kotlin библиотеки Java, которая использует обработку аннотаций, требует добавления ее в проект Kotlin немного другим способом, чем требуется для библиотеки Java, которая не использует обработку аннотаций.
Требуется указать зависимость с помощью плагина kotlin-kapt. После этого необходимо использовать инструмент обработки аннотаций Kotlin вместо annotation Processor.
Все еще в замешательстве? Вот решение - взаимозаменяемость!
Очевидно, что некоторые моменты лучше реализованы в Kotlin, в то время как для других - выгодно использовать Java. Для тех, кто не хочет отказываться от любого из двух ведущих языков программирования для разработки под Android, к счастью, есть и другой путь.
Независимо от всех различий между двумя языками программирования, они полностью совместимы. И Java, и Kotlin компилируются в байт-код. Это означает, что в вопросах «Kotlin vs Java» не будет однозначного ответа, ведь можно вызывать код Java из Kotlin и наоборот.
Эта гибкость имеет два преимущества. Во-первых, это облегчает начало работы с Kotlin, постепенно добавляя код Kotlin в проект Java. Во-вторых, оба языка могут использоваться одновременно в любом проекте разработки приложений для Android.
Подводя итоги
Несмотря на значительные плюсы Kotlin, в вопросах разработки общего назначения Java одерживает верх. С другой стороны, все больше разработчиков и организаций внедряют Kotlin для быстрой разработки Android приложений.
И Java, и Kotlin имеют свои преимущества друг перед другом. Дискуссия о том, какой из них подходит для разработки лучше, только началась, и вряд ли она закончится в ближайшее время. Вопросы выбора: «почему Java?», «почему Kotlin?» все еще остаются. В любом случае переход с Java на Kotlin не будет болезненным.
С нашей стороны, мы хотели бы предложить комплексную программу подготовки Java разработчика, которая включает в себя видео курсы по Java и сопутствующим технологиям. Тем же, кто хочет познакомиться с основами языка Kotlin – ITVDN.com предлагает ознакомиться с курсом Kotlin.
Источник