Результати пошуку за запитом: принцип открытости*
Новий курс "Python Starter"
Автор: Редакция ITVDN
Всем привет!
На ITVDN появился новый видео курс для начинающих Python разработчиков - “Python Starter”.
Python — невероятно лаконичный и универсальный язык программирования. Он просто незаменим в Data Science из-за своего богатейшего инструментария сбора, анализа, обработки и дальнейшей визуализации данных. DevOps инженеры в несколько строк кода могут с его помощью легко автоматизировать рутинные и/или масштабные процессы. BackEnd разработчики используют все возможности языка, которые им предоставляют веб-фреймворки для создания эффективных веб-приложений. Также, на Python можно создавать десктопные и мобильные приложения, игры (особенно хорош в написании скриптов для игр), совершать автоматизацию процессов тестирования ПО.
Основная цель курса – изучение базовых синтаксических конструкций Python. Вы узнаете о различных типах данных и то, как с ними работать; разберете, что такое циклы и условные конструкции, и научитесь обрабатывать ошибки, которые могут возникать в ходе работы ваших приложений. Курс построен по версии Python 3.8.6.
Автор курса — Бондаренко Кирилл — Data Scientist и Python Developer с опытом программирования более 3-х лет. В записанных видео уроках Дмитрий делится эффективными техниками работы с языком Python, которые актуальны и востребованы на сегодняшний день.
Структура курса:
Введение в Python
Примитивные типы данных и переменные
Условные операторы
Циклы
Списки и срезы
Словари
Множества и кортежи
Функции, часть 1
Функции, часть 2
Исключения и их обработка
Чему вы научитесь на данном курсе:
Понимать основные принципы программирования и применение их в Python.
Понимать и уметь применять примитивные типы данных и переменные.
Работать с условными и циклическими конструкциями.
Использовать списки, срезы и словари.
Работать с различными множествами и кортежами.
Понимать смысл и уметь использовать на практике функции.
Отлавливать и обрабатывать возможные исключения в коде программы.
Создавать скрипты, реализующие несложные задачи по обработке данных.
Предварительные требования
Этот курс рассчитан на начинающих без опыта и знаний в программировании. Вы можете начать обучение прямо сейчас — достаточно умения работать с текстовым редактором.
Если вы уже занимаетесь разработкой на другом языке программирования и хотите изучить Python – эти видео материалы вам идеально подойдут: просто бегло просмотрите первые уроки и сконцентрируйте внимание на особенностях работы Python Starter.
Если вы занимаетесь тестированием ПО, “Python Starter” поможет вам разобраться с синтаксисом языка и станет первым шагом в освоении автоматизации тестирования.
Смотрите первый урок курса в свободном доступе.
Также новичков может заинтересовать видео запись вебинара “Как стать Python разработчиком”, спикер Артем Мураховский.
Видео курс “Python Starter” является первой ступенькой на пути к полноценному освоению языка программирования Python. Если вы желаете не останавливаться на стартовом курсе и хотите дальше ринуться в изучение всех нюансов языка, вам также пригодятся ссылки на другие курсы по этому языку:
Python Essential
Python Advanced
Python Practice
Также, мы работаем над созданием нового видео курса — “Python Базовый”, который будет логическим продолжением “Python Starter” и охватит базовые категории данного языка, параллельно раскрывая нововведения версии Python 3.8.6. Следите за новостями ITVDN!
Lviv IT Outsourcing Forum
Автор: Редакция ITVDN
20 апреля компания Lemberg Tech Business School будет проводить уже одиннадцатый Lviv IT Outsourcing Forum! Наряду с Kyiv IT Outsourcing Forum это уже традиционная конференция для владельцев и C-Level менеджмента украинских IT аутсорсинговых компаний.
Планируется, что в этом году в конференции примут участие около 400 CEO, CTO, COO, CFO директоров из Украины, Германии, Израиля и других стран Европы.
Зарегистрироваться - http://bit.ly/2SbvFxT
Промокод на скидку 15 % - LIOF15ITVDN
Темой следующего LIOF будет "Трансформация IT компании. Quo Vadis?».
Вопросы, которые будут обсуждаться:
Куда развивать собственную IT компанию? Каковы перспективы развития в ближайшие 3-5 лет?
Как перейти в новые технологические ниши? Какие ресурсы и инвестиции это потребует? За какое время они могут окупиться?
Что происходит на мировом рынке IT-сервисов?
Возможна жесткая специализация компании по технологии, домейн, рынка и продукта?
Примеры сервисно - продуктовых компаний которые "взлетели" в 2018 году.
Как построить sales процесс в технологической нише в средней компании?
Возможен ли переход в продукты?
Что делать, чтобы перейти в консалтинговую модель IT бизнеса в выбранной вертикали?
Цели конференции:
изучить опыт передовых компаний к изменению себя в высокопроизводительных игроков глобального рынка
проговорить возможные угрозы внутреннего рынка талантов и существующим легально-налоговым принципам работы
открыть новые возможности наиболее продуктивным владельцам компаний
способствовать обмену опытом среди владельцев ИТ сервисных и полупродуктовых компаний
Ключевые докладчики конференции: эксперты-практики, владельцы и директора IT-аутсорсинговых компаний, представители компаний-заказчиков аутсорсинговых услуг, консалтинговые и продуктовые компании.
Если Вы считаете себя одним из них и хотите подать доклад - https://docs.google.com/forms/d/1b_H_NDS1zz7f2gjulE97XqslbyoGg6mOBSOPLRFW88Q/viewform?edit_requested=true
Конференция традиционно проводится 2 дня.
Программа первого дня - это 4 классических потока:
Outsourcing Business. О стратегических вопросах развития компании, стабильность, возможности рынка в Украине, выход на новые рынки, PDS 2.0.
BDMS (Business development, marketing, sales). Об эффективном маркетинге, организации и реализации процессов продаж, управления финансами и поддержания отношений с клиентами.
Evolution. О новейших рынках и путях развития компании.
Организационная зрелость. Для опытных проектных менеджеров и СЕО аутсорсинговых ИТ компаний об управлении проектами, новинки в области и гибкие методологии. Образование, корпоративная культура, рекрутинг, HR.
"Фишка" Lemberg Tech Business School - частные встречи и консалтинг от опытных и прорывных владельцев IT компаний. Получите консультацию, которая стоит тысячи долларов, почти бесплатно!
Также на события будет постоянно действующая биржа контактов. Частные встречи будут доступны участникам с билетом типа "GOLD".
Второй день конференции только для "GOLD" участников, которые хотят практики и реальных примеров!
Именно для них организовывают:
Тур львовскими офисами крупнейших ИТ аутсорсинговх компаний!
Серию воркшопов от докладчиков-практиков, которые поделятся своими наработками!
Организатор: Lemberg Tech Business School: организация с 10-летней историей проведения успешных конференций: Lviv Mobile Development Day, GameDev Conference, Lviv PM Day, Lviv Freelance Forum и BDMSummit. Также в рамках LemBS действуют следующие школы: jCEO School, PMSchool, IMarketing School, SMM School, Startup School.
Как было на предыдущих конференциях:
Фото с осеннего KIOF 2018 - https://www.facebook.com/media/set/?set=a.1889194937836183&type=1&l=800e5408f9
Фото с весеннего KIOF 2018 - https://www.facebook.com/media/set/?set=a.1658085234280489&type=1&l=2e2fda2139
Фото осеннего LIOF 2017 - https://www.facebook.com/media/set/?set=a.1511898538899160&type=1&l=13e27fa0cb
Презентации докладчиков из прошлых конференций можно найти тут - https://www.slideshare.net/lvivstartup.
Видео - на youtube-канале - https://www.youtube.com/user/StartupLviv/videos
Получите новые знания и нетворк для успешного развития вашей компании на Lviv IT Outsourcing Forum 2019.
CG Weekend 2015
Автор: Редакция ITVDN
5-6 декабря в Киеве в Fedoriv Hub состоится международная конференция “CG Weekend 2015”.
Участники мероприятия смогут:
Посетить мастер-классы от ведущих специалистов по компьютерной графике, 2D и 3D анимации, дизайну, постпродакшн,
Трудоустроиться в крупнейшие медиа- и постпродакшн-компании Украины,
принять участие в розыгрыше ценных призов от спонсоров конференции.
Мастер-класс «Все, что вы хотели, но боялись спросить о работе в VFX» от международной компании «Терминал FX» и школы компьютерной графики «TFX Workshop» — одно из самых ожидаемых событий конференции. Компания специализируется на создании сложных эффектов для художественных фильмов и рекламных роликов. В настоящее время «Терминал FX» работает с мировыми лидерами в киноиндустрии, таких как Universal Studios, Warner Brothers, Katalyst фильмов, MTV, 20th Century Fox, WWE Studios, Rebel Films и др. Уникальность же «TFX Workshop» в том, что это первая школа в Украине, где обучают будущих VFX-специалистов на основе реальных проектов. В контексте мастер-класса будет рассмотрен голливудский проект “Сердце дракона 3: Проклятье чародея”, в работе над которым задействована “Терминал FX”.
Всех, кто интересуется процессом управления CGI-производством, ждет захватывающая презентация Сerebro, — программного решения для управления компаниями в любой аудиовизуальной сфере. Основные возможности продукта - быстрое аудиовизуальное комментирование изображений/видео файлов, а также встроенная система передачи и хранения файлов.
Генеральные партнёры “CG Weekend” — компании Autodesk и Softprom by ERC, подготовили подарок всем участникам конференции. Двукратный номинант VES Awards (“Оскар” в мире спецэффектов), Андрей Богданов проведёт эксклюзивный мастер-класс. В контексте мастер-класса будет рассмотрено создание цифровой локации чернобыльской атомной электростанции для фильма "Мотыльки".
Что можно напечатать на 3D-принтере, как технология изменит будущее и многое другое участники смогут узнать на мастер-классе от 3D-мастерской Volume.
Концепт-художник Tory Polska расскажет о принципах работы художника анимации и ответит на вопрос, почему иногда стоит жертвовать, на первый взгляд, отличными дизайн-решениями. Так же участники конференции смогут узнать, что же такое концепция, и почему она задает направление всему производству.
Создать из идеи готовую структурированную 3D-модель - проще простого! На презентации 3D Coat вы сможете узнать, как с помощью мощного программного обеспечения решить целый спектр важных производственных вопросов.
В контексте конференции состоится эксклюзивное мероприятие — Job-сейшн. Ведущие национальные и международные компании презентуют открытые вакансии для специалистов CG, 2D и 3D анимации, VFX. Участники конференции смогут напрямую пообщаться о трудоустройстве с топ-менеджерами и HR-директорами компаний. На данный момент подтвердили своей участие в Job-сейшн: группа компаний StarLightMedia (телеканалы СТБ, ICTV, Новий канал, М1, М2, QTV), ТВ-канал RTI, постпродакшн компания ENERGY POST Production, постпродакшн компания Coffeepost, студия Panama Grand Prix, студия медицинской анимации Nanobotmodels Medical Animation, компания Front Pictures.
Среди участников конференции будут разыграны призы от спонсоров “CG Weekend 2015” — Cerebro Inc. и Droid Sketchbook.
Регистрация и участие в конференции: http://cinemahall.org/cg-weekend-2015/
При регистрации используйте промокод itvdn или cyberbionic и получите скидку -20% на участие в конференции CG Weekend 2015”.
Организаторы конференции: CinemaHall и Fedoriv Hub
Вивчай тестування безпеки веб-застосунків безкоштовно
Автор: Редакция ITVDN
З 21 по 28 лютого 2023 року на ITVDN проходить акція – ви можете пройти навчання за новим курсом “Тестування безпеки веб-застосунків” безкоштовно!
Для чого потрібне тестування безпеки веб-застосунків?
Веб-сервіси дуже тісно вплетені у наше життя. Разом із цим вони потребують надійного захисту, аби персональна інформація залишалася конфіденційною і не потрапляла в руки зловмисникам.
Грамотне тестування веб-застосунків робить великий внесок у їхню безпеку, тому такі знання є критично важливими для:
тестувальників, QA спеціалістів, які проводять моніторинг програмного забезпечення, шукають недосконалості та вразливості у системі.
веб-розробників, котрі одноосібно створюють веб-застосунки і мають забезпечити збереження конфіденційності даних.
Про курс “Тестування безпеки веб-застосунків”
Цей курс поєднує в собі теорію та практику. Ви ознайомитеся з основами тестування безпеки веб-додатків та деякими найпоширенішими вразливостями, притаманними сучасним веб-застосункам, навчитеся використовувати різні спеціалізовані інструменти для виявлення вразливостей та отримаєте знання для усунення та запобігання таким вразливостям у веб-застосунках.
За підсумками курсу ви зможете самостійно та повноцінно виконувати задачі тестувальника безпеки веб-додатків на проєкті.
Курс складається з 11 відео уроків загальною тривалістю 8 годин 30 хвилин.
Про автора
Автор курсу – Андрій Гриценко, Application Security Engineer. Понад 25 років досвіду роботи в IT – в основному в банківському секторі, – у тому числі 11 років досвіду на керівних посадах, 4 роки досвіду в оцінці безпеки застосунків та тестуванні ПЗ (ручному та автоматизованому) з тісною взаємодією з командами розробників.
У записаних відео уроках автор ділиться ефективними техніками тестування безпеки, які актуальні та затребувані на сьогоднішній день.
Програма курсу:
Теорія безпеки веб-застосунків.
Основи XSS.
SQL ін'єкції.
Аутентифікація та контроль доступу.
Небезпечні прямі вказівники на об'єкти.
Неправильна конфігурація безпеки.
CSFR. Підробка міжсайтових запитів.
Тестування вразливостей у компонентах.
Конфіденційність даних. Тестування витоків.
Неперевірені перенаправлення та пересилання.
Стратегія тестування безпеки.
Попередні вимоги
Матеріал розрахований на тих, хто має знання моделі мережевої взаємодії, розуміння та знання будь-якої мови програмування, загальне розуміння JavaScript, знання SQL. Буде плюсом знання Testing (види тестування, принципи тест-дизайну, тестові артефакти, рівні тестування, вимоги).
Чого ви навчитеся на даному курсі:
Розуміти основи безпеки веб-застосунків
Тестувати та виявляти вразливості міжсайтового виконання скриптів (XSS)
Тестувати та виявляти вразливості SQL-ін'єкцій
Тестувати та виявляти вразливості автентифікації та контролю доступу
Тестувати та виявляти вразливості IDOR (прямі вказівники на об'єкти)
Тестувати та виявляти вразливості конфігурацій веб-застосунків
Тестувати та виявляти вразливості підробки міжсайтових запитів (CSRF)
Тестувати та виявляти вразливості у компонентах та бібліотеках веб-застосунків
Тестувати та виявляти вразливості витоку конфіденційних даних
Виявляти фішингові атаки та налаштовувати політики CORS
Планувати та виконувати діяльність щодо тестування безпеки.
Терміни акції
Акція проходить з 21 по 28 лютого 2023 року включно. Доступ до курсу відкривається на 10 днів.
Тиждень великих знижок на курси Java Developer
Автор: Редакция ITVDN
Друзі, з 29 вересня по 6 жовтня на ITVDN великі знижки на пакет відео курсів за напрямком Java – до мінус 50%! Це чудова можливість як для новачків, так і для тих, хто хоче систематизувати та поглибити свої знання.
Java – це популярна об'єктно-орієнтована мова програмування, якою написані програми для більш ніж 3-х мільярдів пристроїв по всій планеті. Більше того, джава постійно займає перші сходинки різноманітних рейтингів мов програмування (індекс TIOBE, PYPL index, Stack Overflow Developer Survey 2022 тощо).
Сфера її застосування практично не має меж: серверна частина веб-додатків, Enterprise-додатки для бізнесу, мобільні програми під Android, Big Data, настільні програми, ПЗ для банку, комп'ютерні ігри і т. д.
Знаючи цю мову, ви зможете реалізувати себе в будь-якому IT-напрямку, який викликає у вас інтерес.
Акційна ціна Java Developer – 52 USD (замість 104.99) – доступ до 29 відео курсів на 7 місяців!
Пакет підписки “Java розробник”
Мова Java – це головний інструмент будь-якого Java розробника. Залежно від напрямку, в якому ви хочете розвиватися, до нього додаються інші технології для розробки: бібліотеки, фреймворки, системи керування базами даних (СУБД) тощо.
Програма навчання на ITVDN складається з таких обов'язкових для вивчення технологій:
Мова програмування Java з нуля до поглибленого рівня.
SOLID принципи в Java – знання правильної, грамотної побудови архітектури додатків.
Unit тестування у Java с JUnit – корисне для написання коду з мінімальною кількістю помилок та коду, що гарно читається.
Основи СУБД MySQL – підійде для роботи з більш простими операціями і менш масштабними БД.
JDBC & Hibernate – для реалізації взаємодії Java-додатків з різними СУБД, а також для вирішення завдань об'єктно-орієнтованого реляційного відображення таблиць баз даних.
Java EE – промислова технологія, котра використовується, в основному, у високопродуктивних проектах, де необхідна надійність, масштабованість та гнучкість.
Web Services – для розроблення SOAP і RESTful веб-сервісів.
Spring (MVC, Data, Security) – один з найпопулярніших та універсальних фреймворків для створення веб-додатків на Java.
Основи роботи з Git – система керування версіями проектів.
Також вам будуть доступні відео курси з альтернативних технологій, які дозволять поглибити знання за Java-напрямком, а також вивчити мову програмування Scala:
Асинхронне програмування Java – для написання швидких багатофункціональних додатків.
Патерни проектування Java – використовуються для створення грамотних оптимізованих, масштабованих додатків.
Jenkins – для автоматизації процесу розробки програмного забезпечення.
Мова програмування Scala з нуля до поглибленого рівня, використовується у розробці Enterprise додатків для великого бізнесу, штучному інтелекті, Machine Learning, Data Science.
Крім доступу до 29 обов'язкових та необов'язкових відео курсів у пакеті підписки – домашні завдання, курсові проекти, тести та сертифікати з вивчених технологій, інтерактивний практикум навичок, онлайн консультація з тренером, диплом зі спеціальності.
Подробиці
Подарункові сертифікати також беруть участь в акції!
Хочете порадувати друга чи близьку людину, яка бажає стати програмістом? Пропонуємо придбати Подарунковий сертифікат за спеціальністю за акційною ціною. Власник сертифікату може активувати його протягом одного року з моменту придбання.
Терміни акції: з 29 вересня по 6 жовтня 2022 року.
Увага! З 24 лютого 2022 року ми не надаємо послуги громадянам росії та білорусі.
Вивчай верстку сайту на FlexBox безкоштовно
Автор: Редакция ITVDN
С 3 по 10 декабря 2020 года на ITVDN проходит акция — вы можете пройти обучение по курсу “Верстка сайта на FlexBox CSS” бесплатно!
Что такое FlexBox?
FlexBox (читается как “флексбокс”) призван упростить позиционирование элементов на странице. Он позволяет забыть о проблемах с неудобной ручной настройкой размеров и положения блоков, которая отняла бы у вас кучу времени так и не дав желаемого результата. С помощью технологии флексбокс вы можете задать желаемое поведение всем элементам страницы, прописав минимум кода. Это особенно удобно при адаптивной и мобильной верстках, когда размеры вашей интернет-странички не фиксированы и меняют свой размер в зависимости от устройства, с которого пользователь зашел на сайт.
Другими словами, это современный инструмент верстки, позволяющий быстро создавать сложные гибкие макеты и функции, упрощая решение задач, для которых ранее использовали чистый CSS.
Сегодня флексбоксы очень популярны в использовании и поддерживаются почти всеми современными браузерами.
О курсе “Верстка сайта на FlexBox CSS”
Автор видео курса — Виталий Мазяр, сертифицированный FrontEnd разработчик и тренер учебного центра CyberBionic Systematics.
Вы познакомитесь с общими понятиями и принципами логики работы технологии Flexbox, научитесь применять основные свойства, рассмотрите способы взаимодействия между элементами, увидите, как можно комбинировать медиа запросы с флексбоксом и как правильно применять эту технологию для создания адаптивных веб-страниц.
Вы узнаете, как работать с готовым макетом в Photoshop-е, а именно: определение точного расстояния между элементами, выгрузка иконок, картинок, шрифтов, а также цветов, в которые окрашены элементы.
В каждом уроке показано поэтапное создание разметки, которая полностью соответствует макету сайта. Будут подробно разобраны способы размещения блоков по горизонтали и вертикали так, чтобы обеспечить их удобное отображение на любых устройствах.
Программа курса:
Знакомство с курсом Верстка сайта на FlexBox CSS
Введение в FlexBox
Верстка трех секций
Смена потока и медиа запросы
Адаптивная верстка сайта
Для кого этот курс
Курс предназначен прежде всего для начинающих верстальщиков и FrontEnd разработчиков, а также для всех, кого интересует такая технология верстки сайтов, как FlexBox. Чтобы освоить флексбоксы, вам необходимо знать языки HTML и CSS на базовом уровне.
Курс входит в комплексные программы обучения по специальностям FrontEnd Developer, Верстальщик сайтов.
Чему вы научитесь на этом курсе:
Выполнять верстку хедера макета и меню в нем.
Создавать простое меню на сайте с использованием флексбокс технологии.
Уметь использовать свойства flex-grow и flex-shrink для создания «резиновой» верстки.
Выполнять планшетную и мобильную версии простой страницы без использования дополнительных правил медиа запросов.
Понимать функции свойств align-items, flex-wrap, order, а также их нюансы и преимущества использования.
Работать с дополнительным потоком у flexbox, размещая элементы в нужной позиции.
Понимать как, зачем и когда нужно сменить направление основного потока.
Размещать много рядовых блоков, вне зависимости от их количества, работая с флексбоксами.
Сроки акции
Акция проходит с 3 по 10 декабря 2020 года включительно. Доступ к курсу открывается на 10 дней.
Що повинен знати C#/.NET розробник
Автор: Влад Сверчков
На сегодняшний день .NET программист может применять свои навыки в различных сферах разработки программных продуктов:
создание веб-приложений и веб-сервисов
создание настольных приложений;
создание облачных сервисов;
создание игр;
создание мобильных приложений.
Когда говорят о .NET разработчиках, имеют в виду программистов, которые пишут на языке С#. Этот язык программирования, как и вся платформа .NET, был создан, развивается и поддерживается компанией Microsoft, которая стабильно уже несколько десятилетий входит в TOP-10 компаний - мировых лидеров рынка информационных технологий. Все продукты компании Microsoft созданы на платформе .NET. Какие же технологии необходимо изучить, чтобы стать .NET программистом?
Поскольку львиная доля .NET-вакансий приходится именно на веб-сегмент, данная статья будет охватывать как фундамент, которым обязаны владеть все разработчики этой платформы, так и основные технологии серверной стороны веб-решений.
Язык программирования C# (“си шарп”)
Любой .NET разработчик не может называться и быть таковым, если он не умеет хорошо программировать на языке C#.
Это универсальный объектно-ориентированный язык, который является мощным инструментом создания программного обеспечения с широкой областью применения. При столь высокой функциональности он является достаточно несложным в изучении и отлично подойдет тем, кто собирается сделать первый шаг навстречу программированию.
Благодаря широкому спектру применения, С# является очень востребованным языком. Различные ресурсы по поиску работы предлагают большое количество вакансий, причем, как на крупные проекты с четко определенным консервативным стеком технологий, так и в компании, которые создают новый программный продукт с применением самых современных инструментов.
Компания Microsoft активно развивает свое детище - .NET направление, потому C# всегда актуален, идет расширение функционала, добавляются новые возможности. Тенденция последних лет - кроссплатформенность, реализуемая в .NET Core. Огромное количество учебных материалов, качественная официальная документация, видео курсы и образовательные вебинары - все это создает максимально комфортные условия для грамотного поэтапного изучения данного языка.
ООП
Объектно-ориентированное программирование - это методология разработки программного обеспечения, в основе которой лежат четыре главных принципа: абстракция, инкапсуляция, наследование и полиморфизм. Поскольку C# является объектно-ориентированным языком, необходимость изучения и полного понимания ООП парадигм обязательно. Однако, есть и приятная новость: все принципы быстро и легко усваиваются во время изучения C#.
Алгоритмы и структуры данных
Понимание алгоритмов и структур данных - обязательные знания для любого программиста.
Изучив структуры данных, вы сможете управлять сложностью своих программ, делая их более доступными для понимания, а также разрабатывать высокопроизводительные программы, которые будут эффективно работать с памятью.
Знание алгоритмов позволит вам создавать сложные конструкции для эффективного решения широкого спектра задач.
Шаблоны проектирования
Паттерны (они же шаблоны) представляют собой архитектурные конструкции, которые описывают типичные способы решения распространенных задач, возникающих в ходе проектирования программного обеспечения. Всего существует более двух десятков шаблонов, однако знать их все - это обязанность архитектора, а не .NET. разработчика. Обычно в одном проекте используется небольшое количество паттернов, поэтому вам достаточно знать самые популярные из них.
SQL
Structured Query Language - декларативный язык структурированных запросов, который создан для взаимодействия с базами данных. Особенность SQL состоит в том, что он лишь описывает необходимые компоненты и желаемые результаты, не указывая, как именно эти результаты должны быть получены.
Каждый программный продукт подразумевает работу с данными, будь то обыкновенная процедура приема данных от сервера (например, скачивание файлов) или внесение в БД информации о новом зарегистрированном пользователе - умение работать с данными одинаково важно во всех сферах разработки, разве что за исключением FrontEnd.
ASP.NET
Active Server Pages для .NET - платформа, использующая среду выполнения .NET Framework и предоставляющая необходимые службы для создания серверных веб-приложений и веб-сервисов. Является развитием более ранней технологии Microsoft ASP.
ASP.NET базируется на среде выполнения Common Language Runtime (CLR), которая является основой всех приложений Microsoft .NET. Также данная платформа имеет преимущество в скорости по сравнению со скриптовыми технологиями.
ASP.NET MVC является расширением ASP.NET и представляет собой платформу для создания веб-сервисов при помощи паттерна MVC. Данный шаблон предусматривает разделение приложения на три компонента: Модель, Представление, Контроллер, благодаря чему реализуется концепция разделения и закрепления ответственности за каждым компонентом, что упрощает разработку проектов.
ASP.NET Core
Фреймворк от компании Microsoft, который использует среду выполнения .NET Core, предназначен для разработки качественных современных веб-приложений и является продолжением развития платформы ASP.NET. Однако, это не просто обновленная технология. Выход ASP.NET Core фактически обозначил качественное изменение всей платформы. Последняя версия 3.0 была выпущена не так давно - в сентябре 2019 года. Главные особенности ASP.NET Core:
наличие открытого исходного кода на GitHub;
кроссплатформенность;
модульность;
расширяемость;
возможность применения облачных технологий.
Более подробную информацию обо всех нововведениях можно найти на официальном сайте Microsoft.
Таким образом, платформа .NET Core существенно расширила области применения технологии ASP.NET и предоставила разработчикам большое количество возможностей по созданию программного продукта.
Entity Framework 6
Entity Framework - специальная объектно-ориентированная технология на базе фреймворка .NET, которая позволяет разработчикам получать доступ к данным, используя концептуальную объектную модель, а не непосредственно реляционную базу данных. Благодаря такому подходу уменьшается количество кода, необходимое для получения доступа к базе, растет производительность и уменьшается время на поддержку объектов в приложениях, которые работают с данными.
В двух словах, эта технология позволяет программисту абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища.
LINQ
Language Integrated Query (язык интегрированных запросов) - это простая и удобная .NET технология доступа к данным. Особенность данного языка запросов: возможность применения ко всем источникам данных (XML-документы, XML-потоки, наборы данных ADO.NET, базы данных SQL, массивы и коллекции .NET и т. д.) одного и того же самого подхода выборки данных.
Git
Наиболее популярная система контроля версий, которая позволяет вести историю разработки проекта с возможностью доступа к каждой сохраненной версии.
Данные системы позволяют команде программистов работать над одним проектом одновременно, сохраняя внесенные изменения, а также отслеживать выполнение задач каждым членом группы.
Не во всех вакансиях можно встретить среди требований владение системой контроля версий, однако, знание Git или ее аналогов даст вам дополнительное преимущество перед остальными кандидатами.
Английский язык
Традиционное требование для каждого разработчика в IT. Знание языка на уровне чтения технической документации и комментирования кода вполне достаточно.
Подведем итоги
В статье были перечислены основные технологии, которыми должен обладать каждый .NET-программист. Поскольку веб-разработка ныне является очень популярной и востребованной, мы также добавили в список .NET средства, которые используются во время создания соответствующих серверных веб-решений. Однако среди всех пунктов наиболее важным является знание языка С# - каждый “дотнетчик” обязан им владеть на высоком уровне.
В свою очередь, перечень можно дополнить такими технологиями, как: TDD (разработка через тестирование), WCF, Unit тестирование, рефакторинг приложений. Их знание не является обязательным, однако, дает дополнительное преимущество перед другими кандидатами в глазах работодателя.
Также вы можете ознакомиться со списком всех необходимых к изучению технологий на странице специальности .NET Developer. Комплексная программа обучения состоит из 49 видео курсов общей продолжительностью 346 часов. Перейдя на страницу, вы найдете много полезной информации - как для новичка, так и для разработчика, желающего углубить и дополнить свои знания.
Более подробно тему требований IT компаний к .NET разработчику рассматривал на вебинаре Виталий Емец - FullStack Developer, Microsoft Certified Specialist. Почему многие выбирают веб-направление и какими технологиями должен владеть кандидат? Ответы на эти и другие вопросы вы найдете в этом видео - “Как стать C#/.NET разработчиком?”.
ITVDN желает Вам достижения Ваших целей и готов быть надежным помощником в вопросах обучения программированию.
Оставайтесь с ITVDN!
Як не треба використовувати патерн "Repository"
Автор: Редакция ITVDN
Обобщенный паттерн Репозиторий
Чтобы избежать недоразумений, давайте для начала проясним, что здесь имеется ввиду под понятием обобщенного репозитория. Видели ли вы когда-нибудь интерфейс вроде этого:
Или может вы видели его брата-близнеца, который имеет иной вариант метода Get:
Вдохновение для написания первого примера пришло из официальной документации Microsoft для ASP.NET MVC 4. Что же касательно второго примера, в Интернете вы можете найти бесконечное число блогов, описывающих именно этот вариант написания репозитория — иногда лишь с небольшими отличиями в виде возвращения IEnumerable<TEntity> вместо IQueryable<TEntity>. И в последнем случае часто еще и с дополнительным методом для генерации запросов. Что-то вроде этого:
Так что плохого в них, вы можете спросить? Почти ничего, если не считать плохое именование методов из примера Microsoft (здесь лучше было бы использовать Find и FindAll вместо Get и GetAll).
Но «почти ничего» - это далеко не то же самое, что «ничего». Первую проблему, которую я здесь вижу, так это нарушение Принципа Сегрегации Интерфейсов (Interface Segregation Principle). Они выражают полный набор CRUD-операций даже для тех сущностей, для которых операции удаления не имеют никакого смысла (к примеру, когда вы деактивируете пользователей вместо удаления их записей из базы данных). Но эта проблема может быть решена при помощи просто разбиения на три интерфейса — для чтения, обновления и удаления записей.
Реальная проблема, которую мы здесь имеем, заключается в некорректном использовании. Оригинальная идея заключается в том, что интерфейсы должны быть использованы в качестве базовых для ваших пользовательских интерфейсов. Что-то вроде этого:
Ваши обработчики событий и сервисы (клиенты пользовательских репозиториев) должны сами определять нужные методы и помещать их в пользовательские интерфейсы.
Это в теории. К сожалению, за свою карьеру мне довольно часто приходилось видеть несколько иную картину:
Кто-то создал рабочую реализацию IGenericRepository. Что хуже в этой реализации, так это то, что эта имплементация почти всегда регистрируется в IoC-контейнере и может быть внедрена в ваши обработчики команд и сервисы точно так же, как и любая другая зависимость.
Код выглядит достаточно красиво и чисто. На самом деле — нет. Почему именно так — скажу немного позже. Теперь же я бы хотел поговорить об одном из решений неправильной интерпретации GenericRepository<T> многих разработчиков. Само решение выглядит примерно так (диалог на code-review):
Джим Сеньор: вы когда-либо слышали, что NHibernate ISession или DbSet из Entity Framework на самом деле репозитории? А то, что вы только что создали — всего лишь небольшая обертка над ISession или DbSet? Де-факто, мы можем отказаться от этого обобщенного репозитория и просто использовать DbSet — результат будет аналогичным. Единственное, в чем IGenericRepository<T> действительно полезен — так это в том, что он скрывает большую часть ненужных для нас методов, которыми обладает DbSet.
Джонни Джуниор: да, в этом действительно есть смысл. Я полагаю, использование обобщенного репозитория в нашем случае было лишним (счастливо возвращаемся к написанию программы…)
Как по мне, что GenericRepository<T>, что DbSet – в большинстве ситуаций их использование лишнее (ну разве что вы пишите наиболее заCRUDженное приложение в своей жизни). Почему? Вот почему:
Единственный способ убедиться, что все LINQ-запросы будут верно преобразованы в SQL — это протестировать их на том же типе базы данных, что находятся в продакшине. Кроме того, в таком случае задача написания интеграционных тестов становится достаточно затруднительной. К примеру, взглянем на код:
Чтобы выполнить эти запросы, должны быть соблюдены два условия. За счет этого интеграционный тест становится менее читабельным. Теперь же давайте представим, что этот метод помещен в метод репозитория. Теперь в тесте нам нужно просто вызвать метод репозитория и проверить результат — просто, не так ли?
Я уверен, вы согласитесь, что LINQ-предикаты внутри сервисов нельзя использовать повторно и они имеют плохую тенденцию повторяться на протяжении всего кода. Даже если программист желает извлечь запрос в свой собственный метод, обычно это будет приватный метод конкретного сервиса. Инкапсуляция запросов внутри методов репозитория приведет к большей читабельности кода и в значительной мере упростить его использование.
LINQ-предикаты не именуются. Как правило, единственный способ узнать, что же, собственно говоря, делает наш запрос (без углубления в его логику), так это имя переменной-результата. К сожалению, искусство информативного именования переменных постигается с опытом, а поскольку в нашей индустрии полно начинающих программистов, мы имеем дело с переменными вроде result, ordersToProcess или просто — orders. Создавая обертку над запросами в виде метода репозитория, это автоматически обязывает разработчика дать этому самому методу конкретное имя. Даже если это имя не из лучших, в последствии провести небольшой рефакторинг не составит труда!
Порой, по причине скорости, мы вынуждены доставать данные из базы посредством чистого SQL. Подумайте, вы действительно хотите в своей бизнес-логике работать с такими низкоуровневыми сущностями, как DbConnection или SqlException? Подобный код лучше прятать за методами репозиториями.
Никаких обобщений — только конкретные репозитории
Перед тем как начать разработку репозитория, необходимо определить его интерфейс. Интерфейс должен содержать только те методы, которые нужны конечным клиентам. Другими словами, если никому не нужно удалять сущности данного типа, нет никакого смысла в написании функционала для их удаления.
Если вы боитесь закончить среди разных имен для базовых CRUD-операций — таких как Delete в одном репозитории и Remove в другом — вы можете создать полезные интерфейсы типа ICanDeleteEntity<TEntity>, ICanUpdateEntity<TEntity> и так далее. В таком случае конкретный репозиторий будет реализовывать только действительно нужные из них.
Ни один из методов репозитория не должен возвращать IQueryable<T>. Также убедитесь, что репозиторий не возвращает IQueryable<T>, скрытые за IEnumerable<T>. Всегда вызывайте ToList() или ToArray() дабы «материализовать» значения, придав им более конкретный тип данных.
Как только заходит речь о реализации репозитория, вы можете наследовать абстрактный класс GenericRepository<TEntity>. Если угодно — можно также использовать напрямую ISession и DbSet. Не важно, какой подход вы выбираете. Помните: любые «лишние» в данном контексте методы — по типу Delete из базового класса — будут скрыты за интерфейсом репозитория.
Также не забывайте, что ваш репозиторий не несет ответственности за транзакции базы данных. Лучше всего эта концепция реализуется при помощи паттерна Unit Of Work. Этот паттерн уже реализован в рамках ISession и DatabaseContext. Все, что нам нужно — это хороший интерфейс над ними:
Для большинства веб-приложений чтобы начать транзакцию через IUnitOfWork в виде начала запроса и Commit / Rollback в конце запроса — этого функционала вполне достаточно. Так же подобное может быть достигнуто при помощи фильтров действий или декораторов обработчиков / сервисов.
Пример репозитория, созданного при соблюдении всех приведенных рекомендаций:
Сейчас все стало ясно, но давайте еще раз проясним. Каждый метод наших репозиториев должен быть учтен по крайней мере одним интеграционным тестом, который должен использовать тот же тип базы данных, что и продакшн. Всегда используйте интеграционные тесты для проверки своих репозиториев.
Немного о недостатках
Не существует роз без шипов, и представленный выше подход — не исключение. Некоторые из них можно решить, используя отличимую от трехуровневой архитектуру. Наиболее часто с конкретными репозиториями возникали следующие проблемы:
За длительное время репозитории могут набрать большое количество Find-методов. Достаточно часто эти методы похожи друг на друга. Есть два способа это предотвратить. Один из них — это группировка нескольких Find-методов в один общий. Этот метод должен принимать object, что представляет собой критерий запроса. Пример:
Чтобы создать запрос с критерием запроса, мы строим набор критериев шаг за шагом:
Зачастую слишком большие репозитории обрастают целой плеядой различных сервисов. Вы можете избежать этого при помощи чего-то, что я называю CQRS-light. Отличием от полной версии является использование тех же таблиц как для чтения, так и для записи. Используя эту технологию, мы можем использовать ту же самую ORM как для чтения, так и для записи. Обращаться же к CQRS только в тех случаях, когда приложение в этом действительно нуждается (например, при обработке 80+ колонок, с использованием 20+ join). Диаграмма ниже представляет типичную архитектуру CQRS-приложения:
Ключевые принципы CQRS-light следующие:
Деление всех действий пользователя на две категории. Первая категория — действия, изменяющие систему. К примеру, оформление заказа в интернет-магазине. Вторая категория — действия, систему не трогающие. К примеру, просмотр списка товаров. Первая категория пишет — это команды, другая — читает, это запросы.
Обработчики запросов для доступа к данным могут использовать только репозитории. Доступ к данным может осуществяться посредством любой технологии. Обычная конфигурация включает в себя ORM для чтения-записи, ORM для записи и микро-ORM для чтения (вроде Dapper) или же ORM для записи и чистый SQL для чтения.
Обработчики команд для доступа и изменения данных могут использовать только репозитории. Для получения данных из базы обработчики команд не должны использовать обработчики запросов. Если обработчик команд должен выполнить комплексный запрос и этот запрос должен получить ответ от обработчика запроса, вы должны продублировать логику этого обработчика запроса и поместить его как в обработчик запроса, так и в метод репозитория (операции чтения и записи должны быть разделены).
Обработчики запросов тестируются только в интеграционных тестах. Для обработчиков команд существуют юнит и — опционально — также интеграционные тесты.
CQRS даже в своей легкой форме — сама по себе объемная тема и заслуживает отдельного блога.
Теперь же давайте вернемся к теме недостатков паттерна конкретного репозитория. Другой недостаток, о котором я бы хотел упомянуть, заключается в нежелательной миграции бизнес-логики в определение запросов. К примеру, даже такой простой запрос:
содержит часть бизнес-логики, описывающей необходимые параметры, дабы заказ стал активным. Как правило, ORM не позволяет нам инкапсулировать такие части логики в отдельные свойства, как IsActive.
Что нам здесь нужно, так это паттерн спецификации. Теперь наш запрос в форме паттерна спецификации будет выглядеть так:
Автор перевода: Евгений Лукашук
Источник
Гарний код: чому він такий важливий?
Автор: Редакция ITVDN
Красивый код — не просто абстрактное понятие, а вполне реально существующая вещь в среде программистов. Научившись писать красивый код, вы значительно сэкономите своё (и чужое) время, а ваши программы станут работать быстрее и стабильнее. Как научиться писать красивый код и каким нюансам стоит уделить внимание — узнаете в этой статье.
Почему так важно писать красивый код?
Код — штука тонкая, в которой эстетика и полезность тесно связаны, как в архитектуре. Полезный, но не эстетично выглядящий код будет трудночитаемым и в результате менее эффективным, чем мог бы быть. Каким образом?
Трудночитаемый код сложно корректировать и тестировать возможные решения, поэтому он отнимает больше времени на корректировку, чем обычный код.
Чистый код создан для людей, поэтому другие программисты, которые будут читать его, будут вам очень благодарны за красивый код.
Благодаря чистому коду поиски одного бага могут сократиться с нескольких часов до нескольких минут, а программа будет работать стабильнее и не выдавать сюрпризов.
Однако овладеть мастерством написания чистого кода с наскока не получится — до момента написания первого элегантного кода, вызывающего восхищение коллег, вы напишите ещё десяток не самых красивых кодов, от которых будут плеваться.
Впрочем, если вы немного измените мышление и овладеете несколькими навыками, то успехи у вас будут значительно лучше, и к написанию красивого кода вы придёте значительно быстрее. Для начала определимся, как вообще научиться писать красивый код, и какие знания нужны для этого, а затем — с навыками, которые необходимо будет развить.
Как научиться писать чистый код?
Прежде чем приступить к написанию красивого кода, запомните два основных принципа, которые вытекают из прошлой части статьи:
Красивый код должен быть легко читаемым и понятным для других программистов.
Красивый код должен работать, а если он не работает — легко фикситься.
Для того, чтобы соответствовал этим требованиям, он должен быть коротким, а функции — линейными. Таким образом, при написании чистого кода вы должны ориентироваться на эти принципы. И постоянно практиковаться: пишите код каждый день, и каждый раз пытайтесь написать наиболее лучший вариант. Со временем у вас начнёт получаться.
Не забудьте почитать книгу Clean Code под авторством Роберта Мартина. Эта книга — настольная библия для программистов, которые стремятся к совершенному коду. На 900 страницах расписано всё, что следует знать программисту, который стремится к чистому коду.
Во время чтения книги можете также зайти на Хабру или другие сайты с полезными для прогеров статьями. Так вы сможете узнать ещё больше о чистом коде и позже закрепить свои знания практикой.
Также вы можете пройти обучение по видео курсам ITVDN. Авторы видео курсов – сертифицированные разработчики. Они помогут вам научиться писать хороший код.
Нужно ли изучать алгоритмы и паттерны?
Изучение алгоритмов — дело ваше, но запоминание паттернов является обязательным для программистов, как изучение таблицы умножения для детей. Без паттернов найти решение типичной проблемы будет трудно, поскольку не будет готового решения.
Впрочем, это не значит, что вы всегда должны использовать паттерны в каждой непонятной ситуации, иногда они не смогут помочь и вам придётся продумывать самостоятельное нестандартное решение, или обращаться за помощью к старшим коллегам. Но само изучение паттернов существенно упростит вам жизнь.
Для желающих начать изучение паттернов рекомендуем великолепный курс Александра Шевчука.
Изучение алгоритмов — чуть более глубокая сторона программирования. Сам алгоритм — это записанные в определённой последовательности команды, которые должны решить стоящую перед ними задачу. Если вы решили взяться за их изучение, то вам нужно не только знать сами алгоритмы, но и уметь их выводить, иначе от знаний не будет толку.
Если вы решили изучать алгоритмы, то рекомендуем обратиться к школьному курсу информатики и статьям для программистов, где подробно рассказывают об алгоритмах. Если в статье вы встретили упоминания как минимум трёх основных видов алгоритмов (линейный, разветвлённый и циклический) — то вы на верном пути.
Хорошим вариантом для старта будет статья Ворожцова А. В. «Что такое алгоритм?», затем знания можно углубить изучив курс Алгоритмы и структуры данных.
С общими требованиями к красивому коду и необходимыми знаниями определились, теперь перейдём к навыкам.
Какие полезные привычки необходимо завести?
Для написания чистого кода необходимо развить следующие навыки:
1) Уделять внимание форматированию кода и стараться делать его как можно более линейным. Это сделает код более понятным и элегантным. Не стоит гнаться только за производительностью, если не хотите получить знаменитый «индусский код»:
2) Короткие методы и функции. Чем короче — тем понятнее, чем понятнее — тем лучше. Слишком длинные функции запутают любого программиста и он потратит кучу времени, пытаясь разобраться в функциях.
Запомните золотое правило: одна функция — одно действие.
3) Удобные названия для функций. Это кажется нелепым, но придумать действительно хорошее название для функции — та ещё задачка, по сложности сравнимая с придумыванием имени для вашего персонажа в MMORPG. Совет, который может помочь, — при наименовании классов используйте существительные, а для методов используйте глаголы. Это сильно упростит понимание кода. Для примера можете взглянуть на два кода ниже и сказать, какой из них выглядит более понятно: первый (до переделывания) или второй (после).
До
После
Как видно на примере, в первом варианте код не так плох, но из-за непонятных названий труден для понимания. Во втором варианте он разбит на более мелкие блоки, а правильно придуманные названия («sendTOmAILsERVER, Client, Message) помогают понять его с первого взгляда.
4) Грамотная обработка ошибок. Даже если вы по каким-либо причинам не можете написать короткие функции и красивый код, вы всё ещё можете исправить ошибки. Ни одна программа не застрахована от сбоев, поэтому создать идеально работающую прогу не получится. Однако вы можете воспользоваться методом try-catch-finally.
Сущность этого метода заключается в эдакой «страховке» от ошибок. При использовании этого метода, вы должны будете создать 3 блока: try, catch и finally. Затем, при запуске команды, она будет выполняться в блоке Try.
Если что-то пойдёт не так, то она попадёт в блок catch, где вы сможете поймать ошибку и исправить её. Если же ошибки не было, или вы её исправили, то команда продолжит выполнение в блоке Finally, где и будет завершена.
Такой метод является универсальным для поиска и исправления ошибок и его может написать даже джун. Это, кстати, будет лучше и элегантнее, чем грузить код лишними функциями и превращать его в лапшу.
Написание красивого кода — дело непростое и требующее практики, но освоив эту методику, вы станете ещё на один шаг ближе к совершенству и завоюете больше уважения от коллег, а также сможете считаться уже более опытным программистом.
Если вы хотите овладеть искусством написания красивого кода, изучайте программирование на ITVDN. Опытные наставники разложат всё по полочкам и после окончания обучения вы научитесь писать красивый чистый код. При условии конечно, если будете прикладывать и свои усилия.
З# 8 без NullReferenceException
Автор: Christian Nagel
.NET спецификация говорит о том, что приложение никогда не должно генерировать NullReferenceException. Впрочем, риск встречи подобного все равно остается во многих библиотеках и приложениях. Де-факто, NullReferenceException – это наиболее часто встречаемый тип исключений. И здесь на сцену выходит C# 8. В новой версии сего прекрасного языка ссылочные типы больше не могут принимать null по-умолчанию. Это и огромный плюс, и отличное нововведение. Но… Это все, конечно, хорошо, но как будут обстоять дела с поддержкой старых библиотек?
Именно в этой статье мы как раз и разберем этот вопрос.
Зачем нам вообще избегать NullReferenceException?
Когда выбрасывается NullReferenceException, причину ошибки далеко не всегда так уж просто найти. Ошибки обычно возникают далеко от очага реальной проблемы. Именно поэтому возникновение подобных ошибок и является крайне нежелательным. Потому вместо проверки на null-исключения просто выбрасывайте ArgumentNullException. Если где-то мы передаем null в качестве аргумента, мы можем просто на уровне компиляции запретить это делать. Просто выбрасываем ArgumentNullException – и мы сразу увидим первопричину ошибки в системе.
Давайте рассмотрим, как именно C# 8 решает подобные проблемы.
Установка C# 8
На момент написания статьи официального релиза C# 8 еще не было. Впрочем, даже сейчас вы можете его опробовать. Сейчас, на момент написания статьи, для этого нужно иметь Visual Studio 2017 15.5-15.7.
На заметку! Устанавливая эту версию компилятора, вы наверняка встретите множество предупреждений со стороны уже существующих C#-проектов. По-умолчанию используется последняя стабильная версия языка. Чтобы избавиться от предупреждений, просто явно задайте версию компилятора.
Ссылочные типы больше не могут принимать null
Ничего сложного для понимания здесь нет. Синтаксис, подобный обычным значимым типам. Хотите, чтобы ссылочный тип принимал null? Ставим после оглашения типа знак вопроса.
В то же время, хотя внешне синтаксис ссылочных и значимых типов выглядит похоже, сам принцип реализации кардинально другой.
При работе со значимыми типами компилятор использует специальный тип Nullable. Это значимый тип, который помимо прочего также содержит в себе приватное булевское поле, определяющее, является ли значение переменной null.
Со ссылочными типами компилятор просто добавляет атрибут Nullable. Версия 8 распознает этот атрибут и обрабатывает его соответствующим образом. Версия 7 его не понимает и просто игнорирует.
При компиляции программы под C# 7 Book b и Book? b будут распознаны одинаково.
Приведенный выше тип Book определяет не-nullable свойства Title и Publisher, а также nullable Isbn. Плюс, этот тип также содержит конструктор-кортеж. Используя тип Book и получая значение переменной Isbn, мы можем хранить полученные данные только в переменной типа string?.
Присваивание Nullable к не-Nullable
В случае, если нам нужно присвоить nullable-тип, C# 8 анализирует код. В коде ниже, так как isbn сравнивается с null, после условной конструкции isbn больше не сможет вернуть null. И так как сигнатура метода не предусматривает возвращение string?, при возвращении значения типа произойдет конверсия.
Конечно, эту же конструкцию можно написать гораздо проще и элегантнее.
Возвращение и передача значения
Здесь мы можем видеть класс NewAndGlory, построенный с использованием возможностей последней версии С#. Сигнатура метода GetANullString предусматривает возвращение null, так что в нашем случае этот метод просто возвращает null. Метод GetAString не сможет в свою очередь вернуть null. Что же касательно последнего метода PassAString, тут тоже все очень просто. Мы передаем string и возвращаем также string. По этой причине смысла в проверке на null нет.
С другой стороны, предположим, что у нас есть библиотека TheOldLib, использующая 7 компилятор (задается в файле *.csproj). Класс Legacy определяет метод GetANullString, что просто возвращает null. Метод PassAString принимает строку и проверяет ее на null. Также библиотека определяет интерфейс ILegacyInterface, задающий сигнатуру метода, что возвращает строку. С использованием шарпа 7 версии, мы не можем здесь указать, должна ли строка принимать null, или нет.
Приложение на C# 8 могут использовать библиотеки, созданные и при помощи C# 7
Теперь давайте рассмотрим пример консольного приложения, что ссылается на старые и на новые библиотеки. Используя класс NewAndGlory, в качестве ожидаемого результата метода GetNullString мы можем получить только string?. Попытка же передать null в метод PassAString породит ошибку уровня компиляции (невозможно преобразовать null в не-nullable значение).
Обращаясь к классу Legacy, где метод GetANullString, результат может быть записан в тип string. И, так как эта библиотека не создавалась под эгидой C# 8, наш компилятор будет покорно молчать. Претензии он будет предъявлять только в отношении «новых» сборок. Также здесь мы можем вызвать метод PassAString и спокойно передать в нее null. Если бы компилятор ругался на все подобные нюансы более ранних сборок, список возможных ошибок мог формироваться до бесконечности, поэтому здесь и применяется принцип «разностного отношения».
Метод Foo интерфейса ILegacyInterface, определенный в библиотеке, собранной с использованием более ранней версии языка, – и здесь он возвращает string. Но как же нам тогда его использовать в C# 8? Как можно заметь ниже, здесь интерфейс может быть реализован с использованием как string, так и string?.
Интерфейсы, реализуемые в рамках C# 8, требуют прямого указания поведения по отношению null.
Приложения под C# 7 с использованием сборок C# 8
Что же касательно использования более новых версий сборок в ранних версиях языка, тут нет никаких проблем: все происходит, как и с любыми другими .NET-сборками. Приложение не будет видеть никаких string? – все nullable-ссылочные типы будут интерпретироваться как обычные ссылочные типы - в нашем случае просто как string. И, конечно же, проблема NullReferenceException остается.
Передача в метод PassAString null вызовет NullReferenceException. Для отлавливания подобного в рамках C# ранних версий мы можем проводить ручную проверку на null и выбрасывать ArgumentNullException. Возможно, эта ситуация по отношению к более старым версиям языка в миксе с новыми сборками с дальнейшим развитием C# 8 изменится, но это уже другой вопрос.
В заключение
Ссылочные типы, не принимающие null, – это одна из ключевых возможностей С# 8, позволяющая минимизировать риск возникновения ошибок типа NullReferenceException. Подобное стало возможным благодаря изменениям внутренней реализации ссылочных типов языка. Впрочем, несмотря на все нововведения, C# 8 по-прежнему может без каких- либо проблем использовать более ранние библиотеки, как и более ранние версии языка – новые библиотеки. Microsoft осталась верной своим канонам обратной совместимости и технически это стало возможно благодаря использованию специальных атрибутов для nullable-типов.
Автор перевода: Евгений Лукашук
Источник