Pull to refresh
2
0
malvina8 @malvina8

User

Send message

Почему тяжело писать про хороший код?

Reading time12 min
Views18K

Всем привет. Меня зовут Гриша Дядиченко, и я технический продюсер. Почему так сложно писать про хороший код? Меня периодически спрашивают, почему я так мало пишу про архитектуру. В то же время я даже среди заказчиков встречаю мнение что “в Unity пишется только плохой код”. Чтож, давайте один раз попробуем, а точнее я попробую показать, почему это очень сложно. Разработаем вместе такую “простую вещь” как инвентарь.

Читать далее
Total votes 20: ↑16 and ↓4+12
Comments21

Кейс OZON.ru: Как сделать тарификацию доставки прозрачной и управляемой

Reading time5 min
Views8.7K
image
Инфографика в посте сделана на R по реальным данным из Тарификатора.

Вы сталкиваетесь с тарификацией доставки, когда делаете заказ в интернет-магазине. Тарификатор — IT-система, которая говорит каким способом товар доставят, на какие посылки разобьется корзина, сколько стоит доставка и когда привезут заказ. Тарификатор собирает информацию со склада и служб доставки, перерабатывает и выдает результаты покупателям интернет-магазина на сайте.

Цена за доставку товара для покупателя интернет-магазина редко совпадает с ценой, которую транспортная компания возьмет с самого магазина. Захотели вы привезти книги с помощью DHL в Новосибирск. OZON.ru выставит вам конкурентную цену за доставку — 500 руб. При этом DHL за эту доставку выставит OZON.ru счет на 1000 руб. Это кажется странным, но такова реальность, которую диктует рынок.
Читать дальше →
Total votes 20: ↑18 and ↓2+16
Comments18

«Запах» проектирования: конструктор по умолчанию

Reading time3 min
Views10K
Это пятый пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Конструкторы по умолчанию являются «запахом» в коде. Именно так. Это может звучать возмутительно
Читать дальше →
Total votes 26: ↑17 and ↓9+8
Comments19

На границах, приложения не являются объектно-ориентированными

Reading time5 min
Views11K
Я получил множество отзывов на мою недавнюю серию постов по Poka-yoke проектированию (я был бы расстроены, если было бы иначе). Множество из этих отзывов касаются различных технологий сериализации или трансляции, используемых обычно на границах приложения: сериализация, XML (де)гидратация (прим. переводчика: тоже самое, что и сериализация), UI-валидация и т.д. Заметьте, что такая трансляция происходит не только по периметру приложения, но также и на уровне сохраняемости (persistence). ORM-ы также являются трасляционными механизмами.
Общим для многих комментариев является утверждение о том, что большая часть технологий сериализации требует наличия конструктора по умолчанию. Например, класс XmlSerializer требует наличия конструктора по умолчанию и публичных, доступных для записи свойств. Большая часть объектно-реляционных преобразователей, которые я изучал, похоже, имеют те же требования. Контролы Windows Forms и WPF (UI – также граница приложения) почти обязаны иметь конструктор по умолчанию. Не нарушает ли это инкапсуляцию? И да и нет.
Читать дальше →
Total votes 24: ↑15 and ↓9+6
Comments5

«Запах» проектирования: излишний атрибут Required

Reading time2 min
Views8.4K
Это четвёртый пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Недавно, я прочитал из какого-то технологического события Microsoft пост, написанный с энтузиазмом:
Атрибут [Required] в коде автоматически создаёт запись в БД, которая не может принимать null, а также создаёт валидацию на веб-странице – симпотично […]

Читать дальше →
Total votes 26: ↑17 and ↓9+8
Comments23

«Запах» кода: автоматические свойства

Reading time4 min
Views18K
Это третий пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Автоматические свойства – одна из наиболее излишних возможностей в C#. Я знаю, что многие люди очень их любят, но они решают проблему, с которой вы и сталкиваться не должны.
Читать дальше →
Total votes 19: ↑11 and ↓8+3
Comments2

«Запах» проектирования: временная связность

Reading time4 min
Views9.2K
Это первый пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Известной проблемой в проектировании API является временная связность, которая получается в том случае, если в классе присутствуют скрытые отношения между двумя или более членами, требующие от клиента правильной последовательности вызовов. Это жёстко связывает члены класса во временном разрезе.
Читать дальше →
Total votes 21: ↑14 and ↓7+7
Comments5

POKA-YOKE проектирование: от «запаха» к благоуханию

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

Ещё немного от переводчика. POKA-YOKE можно перевести как «дуракоустойчивый» или отказоустойчивый.

Инкапсуляция является одной из самых недопонимаемых концепций в объектно-ориентированном программировании (ООП). Похоже на то, что большая часть людей думает, что, имеющая отношение к инкапсуляции, концепция «сокрытия информации», просто означает, что закрытые поля должны быть раскрыты через публичные свойства (или getter\setter-методы в языках, которые не обладают поддержкой свойств).
Читать дальше →
Total votes 36: ↑27 and ↓9+18
Comments16

«Запах» проектирования: одержимость примитивами

Reading time2 min
Views9.6K
Это второй пост из серии о Poka-yoke проектировании – также известном, как инкапсуляция.

Множество классов имеют тенденцию к потреблению или раскрытию примитивных значений, таких как int, или string. В то время как такие примитивы существуют на любой платформе, их использование может приводить к процедурному коду. Более того, они обычно нарушают инкапсуляцию, допуская присвоение некорректных значений.
Читать дальше →
Total votes 23: ↑16 and ↓7+9
Comments24

Money как Value Object

Reading time4 min
Views13K
Описываемая проблема в статье давно и хорошо известна, поэтому она по большей части для новичков, которые не знакомы с темой.

В ПО, которое разрабатывает наша команда используются денежные значения в рублях и копейках. Мы изначально знали, что использование примитивов для выражения денежных значений — это антипаттерн. Однако по мере разработки приложения мы всё никак не могли наткнуться на проблемы связанные с использованием примитивов, нам, видимо, везло и всё было нормально. До поры до времени.
Мы совсем забыли про эту проблему и использование примитивов типа int и decimal расползлось по всей системе. И теперь, когда мы написали первый метод, в котором прочувствовали проблему, пришлось вспомнить про это технический долг и переписать всё на использование денежной абстракции вместо примитивов.
Читать дальше →
Total votes 24: ↑14 and ↓10+4
Comments50

Entity vs Value Object: полный список отличий

Reading time6 min
Views59K
Тема отличий таких понятий как Entity (Сущность) и Value Object (Объект-Значение) из Domain-Driven Design не нова. Тем не менее, я не смог найти статью с полным списком их отличий, так что решил написать свою.
Читать дальше →
Total votes 25: ↑15 and ↓10+5
Comments20

Снова о разработке на основе предметной области (Domain-Driven Design, DDD)

Reading time7 min
Views55K

Введение


Слишком много раз я встречал приложения, о которых говорили, что у них есть модель предметной области и приложение было спроектировано на основе это предметной области. Однако в действительности всё, что я видел, было коллекцией сущностей (я бы даже сказал DTO), имеющих кучу свойств без какой бы то ни было реальной логики, связанной с сущностью. Кроме того, я могу найти много сервисов всех видов, которые содержат красочную смесь бизнес-логики и/или инфраструктуры. Если приложение вдобавок использует шину сообщений (как NServiceBus, Mass Transit Bus или Azure Bus), то конечно же заметно, что некие сообщения передаются от одного модуля к другому или нескольким модулям. К сожалению, сообщения часто имеют очень обобщённые названия, содержащие слова “обновить”, “изменить”, “добавить” или “удалить”, и несут большое количество полезной нагрузки — десятки разнообразных свойств. Часто из названия сообщения совершенно не очевидно, является ли оно командой или событием, и чтобы определить это, приходится глубоко зарыться в реализацию.

Я искренне хотел бы, чтобы все написанное выше было бы преувеличением или же имело смысл только для «старых» приложений, которые разрослись и вышли из-под контроля. Но печальная истина в том, что это относится ко многим новым проектам, даже тем, которым всего несколько месяцев от роду. Почему так происходит? Конечно, есть много разных причин: отсутствие знаний является одной из наиболее важных.
Читать дальше →
Total votes 16: ↑14 and ↓2+12
Comments4

Учимся проектировать на основе предметной области (DDD: Domain Driven Design)

Reading time8 min
Views217K

1. Введение



В данной статье я хотел бы рассказать об этих трёх буквах, постоянно находящихся на слуху, но для многих являющихся тайной за семью печатями, а так же привести ряд ресурсов, с которыми неплохо было бы познакомиться при желании продолжить развитие в проектировании на основе предметной области (DDD: Domain Driven Design).


Читать дальше →
Total votes 66: ↑54 and ↓12+42
Comments25

Active Record против Data Mapper-а для сохранения данных

Reading time4 min
Views80K
Эти 2 шаблона проектирования описаны в книге Мартина Фаулера «Шаблоны корпоративных приложений» и представляют собой способы работы с сохранением данных в объектно-ориентированном программировании.

Пример шаблона Active Record


class Foo
{
    protected $db;
    public $id;
    public $bar;
     
    public function __construct(PDO $db)
    {
        $this->db = $db;
    }
 
    public function do_something()
    {
        $this->bar .= uniqid();
    }
 
    public function save()
    {
        if ($this->id) {
            $sql = "UPDATE foo SET bar = :bar WHERE id = :id";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $this->bar);
            $statement->bindParam("id", $this->id);
            $statement->execute();
        }
        else {
            $sql = "INSERT INTO foo (bar) VALUES (:bar)";
            $statement = $this->db->prepare($sql);
            $statement->bindParam("bar", $this->bar);
            $statement->execute();
            $this->id = $this->db->lastInsertId();
        }
    }
}
 
//Insert
$foo = new Foo($db);
$foo->bar = 'baz';
$foo->save();

В этом упрощенном примере, дескриптор базы данных вводится в конструкторе Foo (Использование инъекции зависимостей здесь позволяет тестировать объект без использования реальной базы данных), и Foo использует его, чтобы сохранять свои данные. Do_something — просто метод-заглушка, заменяющий бизнес логику.
Читать дальше →
Total votes 41: ↑36 and ↓5+31
Comments62

Интерфейсы vs. классы

Reading time4 min
Views284K
Обсуждая с различными людьми — в большинстве своём опытными разработчиками — классический труд «Приёмы объектно-ориентированного проектирования. Паттерны проектирования» Гаммы, Хелма и др., я с изумлением встретил полное непонимание одного из базовых подходов ООП — различия классов и интерфейсов.

Читать дальше →
Total votes 4: ↑4 and ↓0+4
Comments161

Эволюция понимания ООП

Reading time5 min
Views16K
Почти все программисты считают, что знают ООП. Я тоже так считал. Оглядевшись немного, я понял, что эволюция моего понимания ООП была немалой. Начиналось все с простого, что есть классы, у них есть методы. И если один класс представляет какое-то понятие реального мира, то вот оно — ООП. Фактически, это не статья, а просто мысли, представление того, как менялось мое понимание ООП и отношение к нему. Кстати, я не уверен, что через пару месяцев оно вновь не претерпит некоторых изменений.

Читать дальше →
Total votes 90: ↑62 and ↓28+34
Comments106

ООП — Организация Освобождения Палестины

Reading time5 min
Views16K
Эта статья является изложением в письменном виде моего личного восприятия программирования и Объектно-ориентированного программирования в частности. Здесь собраны и душевные негодования, и переживания за программистов всего мира. Всё, конечно же, подкреплено исходным кодом.


Читать дальше →
Total votes 113: ↑76 and ↓37+39
Comments64

быстрое создание веб-приложений на Perl: вводная

Reading time16 min
Views4.4K
Сейчас сложилась такая ситуация, что язык Perl незаслуженно забыт. Хочу немного поднять авторитет этого чудесного языка своими заметками.
Эта макро-заметка ориентирована на изучающих Perl, знатоков этого языка, а так же на тех, которые только хотят побольше узнать о Perl. В заметке хочу поделиться просто своим опытом.
Читать дальше →
Total votes 8: ↑8 and ↓0+8
Comments31

Звуковая карта как последовательный порт

Reading time6 min
Views17K
В современных ПК есть проблема отсутствия простых в использовании интерфейсов. Для использования USB требуется большой объем непростого кода, а для UART нужен переходник USB-COM. Если внешнее устройство несложное, то разработка интерфейса может занять больше времени, чем разработка самого устройства. В то же время во многих устройствах есть аналоговый интерфейс для аудиоустройств, который можно использовать для ввода или вывода данных без какой бы то ни было доработки. Здесь пример ввода данных с платы STM32VLDISCOVERY в ПК с ОС Windows ХР через микрофонный вход. Интерфейс не чисто цифровой, а цифро-аналоговый. Данные с платы передаются пачками из 4-х прямоугольных импульсов разной амплитуды, через ЦАП контроллера. Частота следования импульсов соответствует верхней частоте входного усилителя большинства звуковых карт – 20 кГц. Начало пачки отмечается импульсом удвоенной ширины. Следующие 3 импульса несут информацию, которая заложена в амплитуде импульса. Скорость передачи данных при 4-х разрядном кодировании амплитуды составляет примерно 45 кбит/с.

Код для прошивки STM32VLDISCOVERY:
Читать дальше →
Total votes 38: ↑36 and ↓2+34
Comments15
1

Information

Rating
Does not participate
Registered
Activity