• Как в sail исправить SET GLOBAL sql_mode?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Hfnas, я вам предлагаю не трогать SQL_MODE и забыть про его существовании. Вернуться к тому что вы хотите выбрать и написать запрос так что бы у вас работало с нормальным sql_mode.

    Обьясняю подробнее. Представим что у нас есть таблица table
    id, city_name, number, country_id
    1,Берлин, 100, 1;
    2,Дортмундт, 200, 1;
    3,Гамбург 300, 1;
    4,Москва, 100, 2;
    4,Самара, 200, 2;

    Теперь представим что мы выполняем запрос с группировкой.
    select sum(number), country_id from table group by country_id;

    здесь mysql все понимает. ему нужно вернуть сумму чисел и country_id - вуаля
    600,1
    300,2

    Теперь мы отправляем ему непонятный запрос.
    select sum(number), city_name, country_id from table group by country_id;

    И мускул начинает ругаться. Потому что если он группирует по country_id, то он не знает какой city_name вам вывести -- в каждой строке может быть несколько вариантов.

    600, (Берлин или Дортмундт или Гамбург), 1
    300, (Москва или Самара), 2

    какой конкретно вам надо вывести? ему неизвестно - он об этому вам говорит . Своим подходом а щас я sql_mode подправлю - вы банально пытаетесь заткнуть MySQL рот что бы он не задавал вам непонятных вопросов. Ну не вопрос - вы это сделаете. Кому от этого станет лучше? Вам? Вряд ли, если вам плевать что вам в city_name вернется - нахрен вы это поле выбираете. Если вам не плевать - тогда напишите запрос так, что бы вам возвращалось нужное
    Ответ написан
    Комментировать
  • Как лучше хранить денежные суммы в Postgres?

    @foterio
    Несколько лет назад, я потратил неделю чтобы гарантировано разобраться и принять правильное решение как хранить деньги в Postrgres.
    3 вариант оказался единственно верным. Хранить деньги нужно в копейках, центах в виде int. Операции сложения вычитания так же необходимо проводить в копейках, центах. И только при выводе денег для конечного пользователя вы приводите его в читабельный вид $10.99
    Ответ написан
    2 комментария
  • Какую БД выбрать для хранения и обработки большого кол-ва сообщений?

    2ord
    @2ord
    пока что около 10тыс сообщений в сутки, но будет больше.

    Можно взять Sphinx Search с адаптером для Postgres, где и хранить все сообщения. Или только Postgres, для простоты и лёгкого старта. Полнотекстовый поиск есть и в нём.
    Или RediSearch (модуль-новинка в Redis) - но насколько я понимаю, всё будет в памяти экземпляра, что может быть дороговато со временем.
    Если сильно вырастите со временем, тогда можете смотреть на ElasticSearch (осознание о необходимости придёт на некотором этапе).
    Ответ написан
    1 комментарий
  • Почему пустой tuple занимает больше памяти, чем tuple с None?

    В случае b у тебя не tuple, а просто None.
    Чтобы получился tuple из одного элемента - нужно добавить запятую
    b = (None,)
    b.__sizeof__() # 32
    Ответ написан
    1 комментарий
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ты добавляешь уже существующего пользователя.
    Прочитай про запрос INSERT ... ON CONFLICT DO ... .
    Тут есть два варианта:
    INSERT ... ON CONFLICT DO UPDATE (он же UPSERT), чтобы обновить данные о пользователе.
    INSERT ... ON CONFLICT DO NOTHING, чтобы молча проигнорировать уже существующего пользователя.
    Ответ написан
    Комментировать
  • Как правильно распределять ответственность между классами?

    Starina_js
    @Starina_js
    full-stack web dev
    Литература. Хороший источник, имхо
    По ddd можно погуглить порядок чтения книг, плюс допом видосы с конференций на ютубе.
    "Clean Architecture" и "Domain-Driven Design" как знакомство с этим всем делом.

    И скажите, в чём разница между Store и Repository?
    Store - хранилище. Обычно это про паттерн состояние. Оно может содержать логику обновления состояния и взаимодействия с другими частями приложения
    Repository - это такая абстракция для доступа к источнику данных, то есть где хранятся данные. Может быть файловое хранилище, может быть база данных , а иногда , если работаешь с cms/фреймами - их интерфейсы для работы с хранилищами. Как пример: репозиторий, отвечающий за получение и сохранение данных пользователей в базе данных
    Ответ написан
    3 комментария
  • UML-модель Yii2-приложения, реализация интерфейса группой классов. Как? Есть ли под это паттерн?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нужен спец по ООП и UML, который работал в своё время с MVC!


    Наблюдаю тут несостыковку. Обычно когда говорят о UML - вот все эти вещи вроде контроллеров и т.д. расписываются на уровне компонентов. В UML обычно описывают только доменную логику, то есть то что важно.

    В любом случае в Yii такие подходы работают очень плохо. Там вы не ООП делаете а базу данных проектируете (это чуть разные вещи), и все остальное уже от этого отталкивается.

    Если вы хотите по UML фигачить (не понятно зачем правда, но это уже ваше дело), то имеет смысл брать какую ORM заточенную под ОО-first (по сути Doctrine2 из ныне существующих) и там уже развлекаться. Там профит будет.

    p.s. забудьте об этой бесполезной для бэкэнда аббревиатуре MVC. Пока вы "проектируете контроллеры" - толку от него нет (ну то есть пока у вас логика работы с данными в контроллере).

    Читаю GOF, Зандстру и т.п.


    Почитайте Applying UML and Patterns - Craig Larman - замечательная книга. Еще дядю боба можете почитать (про SOLID). Если вас интересуют темы проектирования то это будет полезно. Еще раз уж заговорили о проектировании логики предметной области - Эрик Эванса - Предметно ориентированное проектирование.

    Задача 1


    1) композиция всегда лучше наследования
    2) наследование нужно для того что бы организовать подтипы. Если у вас есть сущности которые по своей природе требуют наследование - то можно. А так - лучше его избегать. ООП как бы не про наследование вообще.
    3) интерфейсы нужны для того что бы организовать инверсию зависимости и/или полиморфизм подтипов. У Лармана можете почитать про protected variations для того что бы понять зачем их юзать.

    Задача 2


    В UML отношения между типами очень легко и просто отображаются:

    bell_fig10.gif
    - Base[classname] - wrappers для обеспечения ровного обновления самого Yii в дальнейшем, не обращайте внимания.


    Как это не обращать внимания если вы делаете UML ради UML? Пока я не увидел ничего от ООП на вашей диаграмке. Есть структуры данных с публичными пропертями, есть... контроллеры (внезапно) которые мутируют состояние этих структур.... Это не ООП - это процедурное программирование с классами.

    для такой простой задачи я пилю UML исключительно в целях тренинга


    Пока это выглядит как впустую потраченное время, поскольку вы выбрали не лучший инструмент (yii) что бы тренироваться проектировать ОО решения.

    Я рекомендовал бы вам:

    - Разобраться что такое ООП на самом деле (это не про инкапсуляцию. полиморфизм и уже тем более не про наследование ибо все это было еще до ООП и все это кроме наследования является важными принципами структурного программирования). Это про сокрытие состояния и управление зависимостями (связанность, coupling & coheasion у Лармана)
    - Взять более подходящие для проектирования ОО решений инструменты (какой-нибудь модный нынче Laravel + Doctrine2)
    - если хотите продолжать баловатся с Yii сделайте так, что бы логика предметной области ничегошеньки не знала о Yii, тогда вообще не нужно будет заниматься этими Base* классами. Почитайте про Row Data Gateway (это по сути предшевственник ActiveRecord) а именно как оно использовалось в контексте модели предметной области.

    Есть ли под это паттерн?


    Не уверен что нужно, но добавлю. Паттерны - это словарь. Это названия для типичных вещей. Мол "Вася, зафигачть кеширование каталога декоратором репозитория" и Васе понятно что и как делать. Не нужно на них зацикливаться.

    Оригинальная книга по GoF в этом плане так себе, сейчас лучше смотреть в сторону Head First Design Patterns Ну и помимо паттернов нужно разобраться с общими принципами такими как закон деметры, SOLID, GRASP и т.д. Тогда понимание всего будет более системным.
    Ответ написан
    2 комментария
  • Как не нарушать SOLID?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы путаете инверсию контроля и инверсию зависимости. Давайте по порядку кратенько.

    Зачем нам нужны контроллеры или различные представления данных

    Зачем нам в принципе контроллер? Что он делает? Для упрощения не будет воспринимать контроллер как "один объект" и вместо этого представим себе его как целый слой. Так же заменим слово "модель" словом "приложение".

    Задача контроллера - принять и обработать запрос и выдать ответ. По сути в контексте WEB наш HTTP запрос и ответ это представление, которое хочет получить клиент (браузер, мобильное приложение, SPA, что угодно). HTTP - это интерфейс пользователя (UI) для нашего web-приложения.

    Например что бы независеть от реализации клиента и что бы было удобно мы передаем даты в формате iso 8601 (пример: 2016-07-14T19:40:12Z). Это удобно что бы быть независимым от реализации клиента или сервера. Но это не удобно для нашего приложения. В приложении скорее всего нам удобнее всего работать с объектом типа DateTime. То есть приложение использует абсолютно другое представление.

    Мы могли бы прямо в приложении конвертить DateTime в iso 8601 но тогда мы делаем наше приложение привязанным к одному конкретному представлению, которое хочет получить клиент. К примеру по каким-нибудь причинам известным только темным богам, вам вдруг понадобится быстро прикрутить интеграцию с другим сервисом и те же данные гонять уже в RFC2822. И стало быть уже приложению нужно париться о еще одном представлении.

    Мы могли бы сделать какие-то адаптеры у приложения, и дергать их в зависимости от потребностей, но тогда опять же наше приложение все еще знает о представлении, которое ему собственно не нужно. То есть у нас есть зависимость приложения от его UI что... похоже на "не лучшую идею". И тут на помощь приходит Inversion of Control.

    Что такое Inversion of Control

    Тут название само говорит за себя. Допустим у нас был объект A который дергал объект B, причем объект A по сути и не должен ничего знать об объекте B потому то это не его дело. Принцип инверсии контроля говорит нам о том, что в таких ситуациях именно B должно вызывать A, таким образом меняя направление потока управления. Это позволяет нам уменьшить связанность и повысить зацепление компонентов нашей системы. Так же сделав это у нас может появиться объект C который так же будет дергать объект A. Если говорить о UI - мы просто можем сделать несколько реализаций UI.

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

    Роутер и контроллеры как реализация UI

    Что бы отвязать приложение от логики формирования представления, вынесем это все в отдельный "слой" и назовем этот слой - контроллеры. Точнее это будет как цепочка адаптеров. Один адаптер (фронт-контроллер по сути) получает Request и делает какие-нибудь вещи с ним. Например проверяет можем ли мы вообще делать подобный запрос. Другой адаптер вызывает роутер и выясняет какой дальше адаптер вызвать. Если следующий адаптер не вызван - надо вернуть 404-ую ошибку. Если же все пошло хорошо - мы вызываем еще один адаптер, который уже будет конвертировать HTTP запрос в какое-то действие приложения (вызов метода приложения по сути).

    Так а инверсия зависимости это что?

    Инверсия зависимости - очень похожа на инверсию контроля но действует чуть по другому. Проще всего будет вглянуть на картинку:

    Dependency_inversion.png

    стрелочка зависимости на первой фигуре выходит за пределы нашего "модуля" и залазит в "чужой", тем самым наш модуль становится зависимым от другого модуля. Яркий пример - у нас есть например SwiftMailer для отправки почты. Нашему коду нужен просто способ отправлять сообщения, а SwiftMailer просто конкретная реализация.

    Если мы не хотим завязываться на SwiftMailer, и дать возможность в будущем изменить способ отправки почты, мы можем в рамках нашего модуля объявить интерфейс а в другом модуле уже его реализовать с применением SwiftMailer. Для упрощение под модулями мы можем понимать неймспейсы например.

    Нужно ли соблюдать принцип инверсии зависимости в случае контроллеров?

    Нет. Контроллеру нужна конкретная реализация какой-то части нашего приложения (ибо приложение главнее UI-ки), иначе в них нет особо смысла. И наше приложение вообще не должно париться о том что есть какие-то там контроллеры.

    будет ли правильным передавать зависимости в роутинге

    Это уже вопрос реализации IoC. Конкретно вы хотите получить что-то вроде Dependency Injection. Вы можете забрать зависимости из аргументов метода экшена. или аргументов конструктора контроллера.... или просто использовать контейнер зависимостей внутри контроллера.... это совершенно не важно. Контроллеры это то место где высокая связанность на компоненты фреймворка более чем допустимы.

    С другой стороны у вас теперь роутинг совмещает обязанность маршрутизации и разруливания зависимостей. Сами понимаете что это как-то нарушает прицип единой ответственности. Этим может заниматься Controller Resolver какой-нибудь.
    Ответ написан
    2 комментария
  • Существуют ли НЕ видеоуроки по различным ЯП?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такие штуки, книги называются, раньше говорят было модно.
    Ответ написан
    9 комментариев