Теперь предположим, что мы хотим создать другую программу, в которой можно конвертировать единицы измерения угла (из радиан в градусы). В примере ниже мы создадим программу, которая берет два угла треугольника (допустим, они измеряются в радианах) и выдает третий угол в градусах. В уже знакомый нам исходный файл PROJECT мы можем добавить вторую программу, чтобы исходный файл выглядел следующим образом:
// описания программы
THIRDANG();
ANG();
// THIRDANG(a, b)
// Берет два угла a и b треугольника (в радианах) и
// выдает третий угол (в градусах)
EXPORT THIRDANG(a, b)
BEGIN
LOCAL angle1 , angle2 ;
angle1 := ANG(a);
angle2 := ANG(b);
RETURN(180-angle1-angle2);
END;
// ANG(a)
// Берет угол a (в радианах) и выдает тот же самый угол в градусах
EXPORT ANG(a)
BEGIN
a := a/PI*180;
RETURN(a);
END;
Давайте подробнее рассмотрим исходный код, прописанный выше:
Организм ЧЕЛОВЕКА. Что у тебя внутри?
- Внутри одного исходного файла с именем PROJECT мы создали две программы: THIRDANG и ANG. Они становятся новыми «командами», которые мы можем использовать в командной строке в Главном представлении (Home view).
- Вверху файла находятся описания программы. Они нужны только на тот случай, если мы планируем использовать программы, перечисленные как подпрограммы. В данном примере ANG() вызывается как подпрограмма из THIRDANG() и, таким образом, должна быть описана «перед» (то есть сверху, выражаясь на языке программирования) исходным кодом программы THIRDANG(). Также сверху мы добавили и описание самой программы THIRDANG(). Однако так как она не вызывается ни одной другой программой, ее описание необязательно. (Мы включили ее описание, потому что THIRDANG() нам может понадобиться в качестве подпрограммы позже, а также потому что так удобней отслеживать все программы, созданные внутри данного исходного файла). В целом, подпрограммы нужно описывать до того, как они вызываются внутри программы. При желании мы могли бы поместить исходный код ANG() над исходным кодом THIRDANG(), чтобы избежать необходимости описания любых подпрограмм (так как определение программы эквивалентно ее описанию с целью использования). Однако это не очень хороший способ программирования, потому что будут случаи, когда две программы могут вызывать выполнение программы туда и обратно, и, таким образом, выражение описания должно быть сделано как минимум для одной из них. Лично я предлагаю помещать все такие описания вверху исходного фала, чтобы не приходилось иметь дело с упорядочиванием существующего исходного кода для каждой программы.
- Описание подпрограмм требует постановки скобок после имени программы. Если скобки не поставить, то имена будут интерпретированы как глобальные переменные! (Мы об этом поговорим чуть позже). Однако аргументы этих программ исключаются. То есть мы описали ANG() как подпрограмму, но не указываем ее аргументы, пока фактически не определим программу в исходном коде.
- Значение, выданное ANG(), можно сохранить в программе, вызывающей его. Например, angle1 := ANG(angle1);.
- Для большинства типов переменных автореферентность не проблема. То есть в таком выражении как angle1 := angle1-1; правая сторона вычисляется первой до замены значения, сохраненного в angle1, новым значением.
- В программе THIRDANG() написано выражение выдачи, потому что оно позволяет избежать необходимости использования другой внутренней переменной.
- При выборе пункта из Каталога программ (Program Catalog)пользователям предоставляется выбор — запустить либо THIRDANG, либо ANG.
Чтобы использовать программу THIRDANG, просто введите THIRDANG(PI/3, PI/2);, и результат будет 30.
Путешествие по вашему телу
Источник: calculators-online.ru
Блог Программиста
В этой статье я разъясню основы программирования под мобильную платформу Android.
Сначала вам придется выполнить несложный квест — скачать и установить JDK, Eclipse, SDK и ADT-плагин. Не буду это объяснять, можете найти workflow, например, здесь: http://blog.dnttm.ru/content/338
Структура android — проекта
Сначала я опишу общую структуру android — приложения. Внимательно прочитайте это, прежде чем создавать что-то самим, иначе вы рискуете потратить много времени на решение простейших вещей. Создадим проект, нажав на кнопку на скриншоте сверху.
Теперь выберем версию SDK, с помощью которой мы будем создавать наш проект. Я выберу 1.6, она годится для создания обычных неигровых приложений. Создадим проект Test и выберем имя пакета. Запомните: имя пакета должно быть уникальным для каждого приложения, загружаемого на маркет, а также не должно быть сочетаниями: com.android, com.examples, com.google и им подобным. Поэтому выберите себе ник и называйте пакеты так: com Я, например, назову это com.dimiter.for_blog:
После нажатия на кнопку Finish мы увидим справа вот такое меню:
- hdpi — для экранов с большим разрешением
- ldpi — для экранов с маленьким разрешением
- mdpi — для экранов со средним разрешением
Activity — специальный java — класс, который упрощенно можно представить собой как страницу в приложении. На самом деле, здесь есть ошибка, но ее суть я объясню позже, пока хватит и этого. Странице нужен интерфейс, поэтому она, как правило, при создании загружает из ресурсов layout, и инициализирует виджеты (енопки, текстовые поля и др.). Также она обрабатывает различные события пользователя.
При этом она создает объекты, в которых должна создаваться логика приложения, и при действиях пользователя вызываются эти методы. Сама Activity служит лишь оболочкой, неправильно помещать в нее мощную логику, она должны хранится в отдельных java — файлах («это мозг приложения»). Этот момент я более подробно разберу позже. Activity часто обращается к ресурсам — отображает картинки. проигрывает музыку и видео, внедряет шрифты.
Источник: dmiter.blogspot.com
Как большинство Java проектов выглядят изнутри
Меня зовут Аксёнов Вячеслав, я бэкенд разработчик и в последние годы пишу веб приложения на java/kotlin. За всю свою практику я встречался с различными системами как в продакшене, так и в пет проектах. Некоторые системы имели свои “велосипеды”, но большинство базировались на очень похожих технических решениях.
Основная идея этой статьи описать основные технические задачи, которые ставятся перед современными веб приложениями. А также перечислить те фреймворки и библиотеки, которые чаще всего используются для решения этих задач. Бонусом захватим немного инфраструктуры.
Таким образом новички, которые не знают, чего им ждать от корпоративной разработке или в каком фреймворке подтягивать свои навыки, смогут увидеть картину мира чуть шире и сделать правильный выбор.
Какие технические задачи бывают?
Для начала давайте разберем, какие самые распространенные проблемы и задачи ставятся перед современными веб приложениями. Ниже я привожу список самых популярных задач, с которыми приходится работать разработчику.
- Маршрутизация запросов, построение слоя контроллера.
- Написание сложной и ветвистой бизнес логики.
- Работа с базами данных.
- Работа с транспортом для сообщений.
- Тестирование.
- Статический анализ кода.
- CI/CD.
Маршрутизация запросов / слой контроллера
Задачи, которые входят в этот слой — это направлять каждый http запрос на тот метод, который займется его обработкой. В это также входит описание модели данных, которая передается на вход, а также сериализация запроса и десериализация ответа.
На данный момент самым популярным фреймворком для построения web сервисов является Spring, а именно Spring Boot, который сразу имеет встроенный контейнер сервлетов tomcat , либо netty — в зависимости от того, какой набор конфигурации выбран.
Раз практически везде используется Spring Boot, то де факто стандартом индустрии для сериализации и десериализации http запросов и ответов является библиотека Jackson . Она также входит в зависимости Spring Boot и активно используется внутри.
Чтобы ее использовать, потребуется создать экземпляр ObjectMapper и сконфигурировать его, если будет нужно. Имейте в виду, что в Spring Context уже будет инициализированный экземпляр, настроенный, как нужно Spring, так что используйте его осторожно.
Также иногда используют библиотеку от Google — GSON, принципиально она не отличается от Jackson .
Написание сложной и ветвистой бизнес логики.
Выше мы уже выяснили, что стандартом индустрии по разработке web приложений на java является Spring. Это не значит, что вы не сможете встретить условный Javalin или Ktor, так что рассмотрим основную вещь, которую очень любят в Spring и так или иначе реализовывают в любом другом фреймворке. Этим подходом является паттерн dependency injection.
Если коротко, то dependency injection это про то, что вы написали отдельный кирпичик кода — класс и используете его в тех местах, где требуется логика этого кирпичика вместо написания новой.
Так что в любом проекте, в котором вы окажетесь, будет некий контекст, в котором будут храниться эти кирпичики кода, и наличие этого контекста никак не зависит от фреймворка, выбранного для разработки. Скажу по-секрету, что даже когда один из самых прогрессивных Европейских банков отказывается от Spring и разрабатывает веб сервисы на чистой Java, у них все равно есть контекст, в который закладываются все “сервисы”.
Работа с базой данных.
Никакое веб приложение не обходится без использования хранилища данных. Таким хранилищем может быть все что угодно — текстовый файл, кэш redis. Но чаще всего, конечно, используется база данных, опять же стандартом индустрии сейчас являются:
- Postgresql (удобная, производительная, бесплатная).
- Oracle (чуть менее удобная, производительная, имеет вендорный формат.
- MongoDB (очень удобная для стартовой разработки ввиду нереляционности, крайне распространена в облачных решениях).
Для доступа к базе данных нужно иметь возможность открывать соединения, следить за открытыми потоками, выполнять sql запросы, заниматься конвертацией и тд.
В настоящее время большое распространение имеет подход ORM — Object-Relational Mapping. Чтобы покрыть весь спектр задач для хранения информации бд, нужно решать 4 вида операций (тот самый CRUD) — create, read, update, delete.
Самые популярные реализации этого подхода заключает в себе фреймворк — Hibernate . Он способен генерировать sql запросы в зависимости от кода и сущностей, однако делает это не всегда оптимально.
Также мы не забыли, что стандартом индустрии является Spring Boot, для него также существует реализация ORM работы с бд — Spring Data JPA . Она представляет собой обертку над Hibernate , с которой можно работать на более высоком уровне абстракций. Она удобно конфигурится и даже позволяет писать запросы без sql вообще. Но если есть потребность написать raw sql и выполнить его, это также можно сделать.
И наконец, самый мощный инструмент, который предоставляет самое лучшее быстродействие, но фактически не реализует ORM идеологию — jdbcTemplate . Его суть в выполнении сырых sql запросов. Но если написать поверх него свою логику конвертации и применять его для хранения сущностей в бд по логике ORM, то получится очень быстрый и кастомизируемый инструмент.
Работа с транспортом
В качестве транспорта для сообщений используют такие синхронные способы, как http запросы GET/POST. Для них используется либо RestTemplate , который входит в список зависимостей Spring Boot, либо более новый и WebClient .
Для асинхронных взаимодействий используются брокеры сообщений, самые популярные из которых — rabbitmq и kafka. В этой статье я не буду погружаться в их отличие друг от друга. Остановлюсь на способе интеграции с ними из кода — для этого используются модули Spring Boot, либо самописный “велосипед”, если речь идет про большую компанию. Самые популярные расширения для Spring Boot проекта — это spring-kafka и spring-boot-starter-amqp.
Тестирование
Тестирование — это неотъемлемая часть любой уважающей себя разработки. В наших реалиях если разработка ведется не сразу в TDD парадигме (Test Driven Development), то внутри команды устанавливается порог кода, который должен быть покрыт тестами.
Тесты пишутся в следующих форматах:
- unit тесты — для тестирования берется отдельный класс или даже его метод.
- интеграционные тесты — тестируется отдельный участок системы вместе с интеграцией с другими элементами. Например интеграционное тестирование процесса в сервисе и его работа с базой данных.
Сторонние библиотеки в тестах нужны для решения задач непосредственно тестирования, а также мокирования (эмуляция ответа какого-то сервиса или интеграции).
Для тестирования чаще всего используют junit 5 , TestNG , kotest (kotlin). Для мокирования стандартом java разработки является mockito, для kotlin — mockk . Для тестирования Spring Boot приложений используется стартер spring-boot-starter-test , который уже включает в себя все необходимые зависимости и умеет строить Spring Context для каждого теста.
Крайне редко бывают настолько сложные и витиеватые процессы, что для тестирования одного сценария нужно вызывать много эндпоинтов одного сервиса. В таком случае нужно быть готовым к тому, что вы столкнетесь с самописными “велосипедами”, такими как отдельное Spring Boot приложение, которое занимается вызовом эндпоинтов и тестированием основного тестируемого приложения.
Статический анализ
Суть статического анализа кода — это проверка кода на соответствие условиям — отсутствие дублирующего кода, покрытия тестами, соответствие код стайлу и тд.
Как правило для проверок соответствия код стайлу используются такие штуки, как “Линтеры”. По своей природе это те же самые плагины для gradle , maven . Обычно они запускаются автоматически в ходе настроенного пайплайна. Иногда нужно быть готовым, что нужно вызвать команду, которая отформатирует ваш код по настроенным в линтере правилам.
Для Java самыми популярными линтерами являются — Checkstyle и SonarLint . Для kotlin — ktlint
Для статического анализа, с подсказками и прочими полезными штуками в подавляющем большинстве проектов используется настроенный sonarqube. Для маленьких проектов — codacy или codeclimate. Я бы рекомендовал их использовать даже для пет проектов.
Однако не все проекты имеют выстроенные процессы по поддержанию чистоты кода. Это может происходить в силу различных причин — быстро изменяющийся проект, недостаточное количество времени у команды для выстраивания процессов.
CI/CD — Continuous Integration и Continuous Deployment — это процессы, без которых невозможно представить современную разработку. Можно запаковывать jar файлы руками и руками разворачивать их на серверах, но это увеличивает вероятность ошибок, вызванных человеческим фактором. Чтобы базовые инфраструктурные действия не вызывали большой головной боли, обычно используются скрипты для сборки и деплоя.
Как правило рядовым разработчикам приходится заниматься этим довольно редко, обычно это находится в зоне devops инженеров. Как правило скрипты выполняются в окружении Jenkins, либо Gitlab CI.
Сами скрипты представляют собой набор действий, которые должны быть выполнены для достижения той или иной цели. Самое сложное может быть в том чтобы понять, как связывается код внутри приложения и с деплоем. Для этого используются системы сборки.
На данный момент для бэкенда существуют две самые популярные — maven и gradle . В 9 случаях из 10 это maven , он довольно грубый, но функциональный и имеет большое количество плагинов. Также изредка встречается gradle , он в свою очередь более свежий, но менее широко распространенный. По функционалу ничем не уступает maven в большинстве моментов.
Вывод.
В этой статье мы рассмотрели основные технические моменты, которые приходится решать бэкенд разработчику в настоящее время. А также основные способы решения задач для каждого из этих технических направлений. Буду рад информации в комментариях о том — с помощью какого инструмента в своем проекте вы решаете задачу и полностью ли вы довольны этим инструментом.
- java
- kotlin
- карьера программиста
- карьера ит-специалиста
- карьера в it-индустрии
- джун
- что нужно знать
Источник: habr.com