вторник, 29 августа 2017 г.

Прекратите проверять на NULL

Рано или поздно в программах на C/C++ приходится использовать передачу аргументов в функцию по указателю. Примером может служить хотя бы тот же const char* при использовании библиотек доступа к базам данных:

void Execute(const char* sql_statement);

Бывают и случаи передачи объектов и примитивных типов по указателю.

Проверка параметров на NULL

Мне хотелось бы рассказать про то, что наверняка делают многие программисты на C и C++: проверяют входной параметр-указатель на NULL (nullptr):

void Execute(const char* sql_statement) {
    if (sql_statement == nullptr) {
      throw std::invalid_argument("Null SQL Statement");
    }

Кроме варианта с исключением есть так же вариант с assert(sql_statement).

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

Причина здесь проста: указатель может содержать множество «невалидных» значений. Если вы считаете, что указатель невалиден только когда его значение NULL (nullptr), то вы ошибаетесь.

Mediator

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

понедельник, 28 августа 2017 г.

Корни, ссылки, достижимость в Java

Как сборщик мусора в Java определяет, что объект пора уничтожить? В общем случае, объект должен оказаться "недостижим" из "корневых" объектов, но всегда ли это так? Если мы говорим о жестких ссылках, то да. Однако в Java существует 4 вида ссылок:

  • жесткие;
  • мягкие (SoftReference);
  • слабые (WeakReference);
  • фантомные (PhantomReference).

Что-то много непонятного, давайте разберемся чем они отличаются, что значит "недостижим" и кто такие эти "корневые" объекты.

пятница, 25 августа 2017 г.

Facade

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

К примеру, чтобы пойти в кино нам надо:

  1. Посмотреть расписание фильмов, выбрать фильм, посмотреть когда есть сеансы, посмотреть когда у нас есть время.
  2. Необходимо купить билет, для этого ввести номер карточки, секретный код, дождаться снятия денег, распечатать билет.
  3. Приехать в кинотеатр, припарковать машину, купить попкорн, найти места, смотреть.

И все это для того, чтобы просто посмотреть фильм, который нам, очень вероятно, не понравится.

Или же возьмем пример Amazon – покупка с одного клика – как много систем задействовано в операции покупки? И проверка Вашей карточки, и проверка Вашего адреса, проверка товара на складе, проверка или возможна доставка даного товара в даную точку мира... В результате очень много действий которые происходят всего по одному клику.

Для таких вот процесов был изобретен паттерн – Фасад (Facade) который предоставляет унифицированный интерфейса к большому количеству интерфейсов системы, в следствии чего систему стает гораздо проще в использовании.

Bridge

Представьте себе, что у нас есть что-то однотипное, к примеру у нас есть телефон и куча наушников. Если бы у каждого телефона был свой разъем, то мы могли бы пользоваться только одним типом наушников. Но Бог миловал! Собственно таже штука и с наушникам. Они могут выдавать различный звук, иметь различные дополнительные функции, но основная их цель – просто звучание:) И хорошо, что во многих случаях штекер у них одинаковый (я не говорю про различные студийные наушники:) ).

Собственно, Мост (Bridge) позволяет разделить абстракцию от реализации, так чтобы реализация в любой момент могла быть поменяна, не меняя при этом абстракции.

вторник, 22 августа 2017 г.

Adapter

Тяжело найти более красочно описание паттерна Адаптер, чем пример из жизни каждого, кто покупал технику из США. Розетка! Вот почему не сделать одинаковую розетку всюду? Но нет, в США розетка с квадратными дырками, в Европе с круглыми, а в некоторых странах вообще треугольные. Следовательно – потому вилки на зарядный устройствах, и других устройствах питания тоже различные.

Представьте, что Вы едете в коммандировку в США. У Вас есть, допустим, ноутбук купленный в Европе – следовательно вилка на проводе от блока питания имеет круглые окончания. Что делать? Покупать зарядку для американского типа розетки? А когда вы вернетесь домой – она будет лежать у Вас мертвым грузом?

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

Так и с Адаптером – он конвертит интерфейс класса – на такой, который ожидается.

суббота, 5 августа 2017 г.

Kotlin. Часть 5. Пишем DSL

Вот и пришла пора для заключительной статьи в основном цикле о Kotlin. Что это значит? Пользуясь знаниями из предыдущих статей (Введение, Незнакомые конструкции, Мигрируем из Java, Неловкие моменты) ниже мы с вами напишем собственный DSL (domain-specific language), обсудим что это такое и чем Kotlin, как язык, способствует написанию предметно-ориентированных языков, а также как это упрощает разработчикам жизнь, я расскажу о собственном опыте в разработке DSL и о проблемах, которые возникают. Статья может показаться довольно большой, так и есть, я постарался уместить в неё основной концентрат собственных знаний о построении DSL в Kotlin.

HyperComments for Blogger

comments powered by HyperComments