Size: a a a

2020 August 14

AO

Aleksandr Osipov in ☄️ effector
🚀🔬 🚀🔬🚀🔬
goodmind слегка перегорел и вызвал недовольство менеджмента, я попросил месяц на работу над ошибками под мою ответственность и мы справились в этот срок, после чего узнали, что его уволили сразу же а этот месяц ни на что не влиял. поэтому я немедленно ушёл в знак протеста. остальное вы знаете)
Остальное это появление эффектора :)?
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
ага, я целенаправленно ушёл делать эффектор
источник

AO

Aleksandr Osipov in ☄️ effector
Счастливая история с грустным началом правда
источник

AO

Aleksandr Osipov in ☄️ effector
Обычно наоборот
источник

AO

Aleksandr Osipov in ☄️ effector
В конце концов если бы не эти события то мы бы не увидели эффектор
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
ну пожалуй это было одним из лучших моих решений за всю жизнь, не  смотря на то, что я знал, что уходить в никуда довольно страшно
источник

NF

Nikita Fedorov in ☄️ effector
я кстати с ts заметил важную вещь, то что надо всегда писать типы от кода, и наверху их комбинировать, а не как в других языках обычно пишут toplevel, а потом делают разделение интерфейсов
источник

AO

Aleksandr Osipov in ☄️ effector
Nikita Fedorov
я кстати с ts заметил важную вещь, то что надо всегда писать типы от кода, и наверху их комбинировать, а не как в других языках обычно пишут toplevel, а потом делают разделение интерфейсов
Можешь развернуть мысль?
источник

AO

Aleksandr Osipov in ☄️ effector
Что значит от кода и как в других языках
источник

NF

Nikita Fedorov in ☄️ effector
Aleksandr Osipov
Можешь развернуть мысль?
обычно
// U.ts
type U = { a: A, b: B }
// fA.ts
let fA = (u: U) => u.a
// fB.ts
let fB = (u: U) => u.b
// fB2.ts
let fB2 = (u: U) => u.b

рефакторинг который обычно делают:
// U.ts
type U = AU & BU
type AU = { a: A }
type BU = { b: B }
// fA.ts
let fA = (u: AU) => u.a
// fB.ts
let fB = (u: BU) => u.b
// fB2.ts
let fB2 = (u: BU) => u.b

рефакторинг который надо было сделать на самом деле:
// U.ts
type U = AU & BU
// BU.ts
type BU = BU1 & BU2
// fA.ts
type AU = { a: A }
let fA = (u: AU) => u.a
// fB.ts
type BU1 = { b: B }
let fB = (u: BU1) => u.b
// fB2.ts
type BU2 = { b: B }
let fB2 = (u: BU2) => u.b
источник

AO

Aleksandr Osipov in ☄️ effector
Сложно :)
источник

AO

Aleksandr Osipov in ☄️ effector
Бывает кстати что вообще все типы описывают в models/**/*
источник

AO

Aleksandr Osipov in ☄️ effector
Отдалено от кода
источник

AO

Aleksandr Osipov in ☄️ effector
Не очень понимаю профита
источник

NF

Nikita Fedorov in ☄️ effector
Принцип инверсии зависимостей говорит что последний вариант не правильный, т.к. абстракции зависят от реализации
источник

NF

Nikita Fedorov in ☄️ effector
Но на самом деле, если посмотреть ту же чистую архитектуру, это не совсем верно. И последний вариант во всех смыслах лучше чем пред последний
источник

NF

Nikita Fedorov in ☄️ effector
И на самом деле нужно делать не рефакторинг, а сразу писать типы для реализаций, а рефакторинг должен быть только на уровне BU.ts последнего примера. И уже в нем нужно соблюдать указанное правило из DIP.
источник

AA

Andrey Antropov in ☄️ effector
скорее комбинирование интерфейсов для реализации конечных интерфейсов объектов тогда утилиты можно делать например более универсальными когда каждый интерфейс это одно поле то под них сразу все можно написать и протестить а конечные элементы собирать из таких кирпичиков
источник

NF

Nikita Fedorov in ☄️ effector
Andrey Antropov
скорее комбинирование интерфейсов для реализации конечных интерфейсов объектов тогда утилиты можно делать например более универсальными когда каждый интерфейс это одно поле то под них сразу все можно написать и протестить а конечные элементы собирать из таких кирпичиков
ну да, суть моего спича в том что этот шаг нужно делать исходя из использования, а не оперируя изначально абстракциями продиктованными тем что "ну юзер, у юзера есть такой-то набор полей, давайте сделаем его сразу в одном интерфейсе, а потом разделим если нужно"
источник

NF

Nikita Fedorov in ☄️ effector
намного более адекватный путь это задать только имена и связи без данных, а потом добавить интерфейсы данных и поведения снизу вверх
источник