All streams
Search
Write a publication
Pull to refresh
16
1.3
Дмитрий Карловский @nin-jin

Full Stack Overflow

Send message

Препарируем React и находим родовые травмы

Выбор двух миллионов разрабов, но..

  • Не умеет в реактивность.

  • Ререндеры по любому чиху.

  • Смешивает инициализацию и обновление, логику и шаблон.

  • Путается между пересозданиями и перемещением.

  • Все компоненты либо неуправляемые, либо неполноценные, либо ожиревшие.

  • Кривая эмуляция объектов через функции с хуками.

  • Не типизируемый VDOM на выходе.

  • Разобщённая экосистема со слабой поддержкой TS.

  • Горы бойлерплейта по мере приближения к проду.

В продолжение темы: Реактивный React, Читерские бенчмарки.

Копилка благодарностейhttps://boosty.to/hyoo

Tags:
Total votes 12: ↑8 and ↓4+5
Comments6

Шаблон декомпозиции ModelView Fractal

Каждый ModelView выступает в роли модели/контроллера для ведомых ModelView и в качестве отображения для владеющего ModelView. Часть логики может выноситься как в чистые Model, так и в чистые View, которые являются лишь вырожденными случаями ModelView.

$my_user_list $my_view
	- \Owner ModelView
	users? /$my_user
	kids /
		<= Row*0 $my_user_row
			user <= user*

$my_user_row $my_card
	- \Having ModevView
	user $my_user
		avatar => image
		nickname => message

$my_card $my_view
	- \View not Model
	kids /
		<= Image $my_image
			uri <= image \about:blank
		<= Message $my_text
			text <= message \
	
$my_user $my_model
	- \Model not View
	avatar? \
	nickname? \

✅ Каждый ModelView полностью контролирует внутренние ModelView и ничего не знает про внешние.
✅ Любой ModelView может шариться между разными другими ModelView на любом уровне композиции.
✅ Изменение интерфейса ModelView требует изменения только лишь его владельцев.
✅ Фрактальная структура легко масштабируется на приложения любого размера.

Tags:
Total votes 7: ↑4 and ↓3+1
Comments0

Шаблон декомпозиции Model-View-Presenter

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

MVP
MVP
// Presenter
class User_preview {
	user: User
	card = new Card({
		image: ()=> this.user.avatar,
		message: ()=> this.user.nickname,
		color: ()=> this.user.skin.color,
		click: ()=> this.skin_change(),
	})
	skin_change() {
		this.user.skin = Skin.random()
	}
}

// View
<div class="Card" onclick={click} style={{ background: color }}>
	<img src={ image } />
	<p>{ message }</p>
</div>

// Model
class User extends Model {
	avatar: string
	nickname: string
	skin: Skin
}

✅ Легко добавлять новые отображения, не меняя модели. И наоборот.
✅ Изменение интерфесов модели или отображения требует изменения только лишь презентеров.
❌ Трёх слоёв слишком мало на больших масштабах.
❌ Для использования состояния одного презентера из другого необходимо искусственное вынесение его в модели.

Tags:
Total votes 10: ↑7 and ↓3+4
Comments0

Шаблон декомпозиции Model-View-Controller

Контроллер создаёт отображение, и говорит ему с какой моделью работать. Так же он обрабатывает все команды от пользователя, и управляет своими подопечными.

MVC
MVC
// Controller
class Users_resource {
	GET() {
		return User.all.map( user_brief )
	}
}

// View
function user_brief( user: User ) {
	return {
		id: user.guid,
		name: user.passport.name_full,
	}
}

// Model
class User {
	
	static all = [] as User[]
	
	guid: GUID
	passports: Passport[]
	resumes: Resume[]
	
	get passport() {
		return this.passports[0]
	}
	
}

✅ Отображение может использовать произвольные модели с тем же интерфейсом.
✅ Легко добавлять новые отображения, не меняя модели. И наоборот.
❌ Для отображения разных типов моделей необходимо дублировать код отображения.
❌ Изменение интерфейса модели требует обновления всех использующих её отображений и контроллеров.
❌ Трёх слоёв слишком мало на больших масштабах.

Tags:
Total votes 8: ↑2 and ↓6-4
Comments7

Шаблон декомпозиции Model-View-ViewModel

Отображения работают с моделями через посредников, которые трансформируют абстракции предметной области в абстракции отображения и обратно. ViewModel также выступает хранилищем состояния отображения, не связанного с предметной областью.

MVVM
MVVM
// View
<li class="User_card" model="User_card_model">
	<img src={ image } />
	<p>{ message }</p>
</li>

// ViewModel
class User_card_model {
	user = User.current
	get image() {
		return this.user.avatar
	}
	get message() {
		return this.user.nickname
	}
}

// Model
class User {
	avatar: string
	nickname: string
	static current = new User
}

✅ Отображение может использовать произвольные вьюмодели.
✅ Легко добавлять новые отображения, не меняя ни модели, ни вьюмодели.
✅ Изменение интерфейса модели или отображения требует изменения только лишь вьюмодели.
✅ Одну и ту же вьюмодель можно шарить между несколькими отображениями.
❌ Для отображения разных моделей необходимо дублировать код отображения и вьюмодели.
❌ Трёх слоёв слишком мало на больших масштабах.

Tags:
Total votes 9: ↑6 and ↓3+3
Comments0

Шаблон декомпозиции View-Model

Код работы с моделями пишется прямо в отображении.

// View
function Task_list() {
	return <ul>{
		Task.list.map( task =>
			<li><Task_row {task} /></li>
		)
	}</ul>
}

// Model
class Task {
	static list = [] as Task[]
}

✅ Отображение может использовать произвольные модели.
✅ Легко добавлять новые отображения, не меняя модели.
❌ Для отображения разных моделей необходимо дублировать код отображения.
❌ Изменение интерфейса модели требует обновления всех использующих её отображений.
❌ Двух слоёв слишком мало на больших масштабах.

Tags:
Total votes 8: ↑4 and ↓40
Comments0

Шаблон декомпозиции Model-View

Модель знает как себя по разному представлять.

class User { // Model
	
	_id: bigint
	_nickname: string
	
	toString() { // View
		return 'user=' + this._id
	}
	
	toJSON() { // View
		return {
			id: String( this._id ),
			name: this._nickname,
		}
	}
	
}

✅ Удобно из модели получать любые отображения.
❌ Добавление нового отображения требует изменения модели.
❌ Отображение полностью определяется одной основной моделью.
❌ Загрузка модели вытягивает по зависимостям и все её отображения.
❌ Двух слоёв слишком мало на больших масштабах.

Tags:
Total votes 10: ↑6 and ↓4+2
Comments2
Tags:
Total votes 8: ↑7 and ↓1+6
Comments0

Препарируем Material Design и находим родовые травмы

Подробнейшая документация, но..

  • Неконсистентный и неуниверсальный дизайн.

  • Сомнительный пользовательский опыт чуть ли не в каждом компоненте.

  • Реализация от Гугла в Вебе безбожно тормозит и глючит.

  • Тяжёлая поддержка разных форм-факторов и инпут-девайсов.

В продолжение темы: Бестолковый дизайн, Mathematics Driven Design.

Мета: Форум Гипер Дев, Канал с новостями, Донаты.

Tags:
Total votes 8: ↑3 and ↓5-2
Comments3

Выводим Мурыча на чистую воду

Топ перлов:

  • В JS нет переменных и присваивания, но есть потоки

  • Все числа выделяются в куче

  • TS не годится для разработки

  • let и const - главные перфоманс ботлнеки

Упоминаемые материалы:

Мета-сслыки:

Tags:
Total votes 14: ↑2 and ↓12-10
Comments4

Препарируем Tailwind CSS и находим родовые травмы

Бандлинг лишь используемых стилей, но..

  • Тормоза при любой динамике.

  • Раздутый HTML.

  • Крайне слабая кастомизация стороннего кода.

  • Сложный массовый рефакторинг.

  • Куча стилей компонента в одну строку.

Копилка благодарностей: https://boosty.to/hyoo

Tags:
Total votes 4: ↑2 and ↓20
Comments0

Препарируем StyleX и находим родовые травмы

Решение от большой компании, но..

  • Раздутый как CSS, так и HTML, и даже JS

  • Несемантичный CSS и HTML

  • Околонулевая типизация без автодополнения

  • Много бойлерплейта

  • Зависимость от Babel

  • Тормозная сборка

  • Сложная отладка

Копилка благодарностей: https://boosty.to/hyoo

Tags:
Total votes 2: ↑2 and ↓0+2
Comments0

Препарируем Feature Slices Design и находим родовые травмы
https://youtu.be/tNx05dfFHRU

Стандартизированная декомпозиция, но..

  • Распыление каждой бизнес-фичи по всему проекту

  • Нечёткие сомнительные правила

  • Тонны бойерплейта на синглтонах

  • Ограниченная масштабируемость и гибкость

Поблагодарить, Обсудить.

Tags:
Total votes 5: ↑3 and ↓2+1
Comments0

Чтобы окончательно решить вопрос с кнопками, я создал Фонд Синей Кнопки.

Если наберётся миллион рублей, то все вложившиеся получат свои деньги обратно.

Иначе, для отказавшихся вложиться ничего не изменится, а вот вложившиеся потеряют свои деньги навсегда.

Tags:
Total votes 8: ↑6 and ↓2+4
Comments2

Препарируем Nano Stores и находим родовые травмы
https://youtu.be/Q2rzPc7EEa8

Крайне малые размеры, но..

  • Лишние вычисления и сайд-эффекты

  • Медленная работа: и архитектурно, и по реализации

  • Только статические зависимости с ручным приводом

  • Нестабильность поведения

  • Автор без этических ограничений

Поблагодарить, Обсудить, Бенчмарки, $mol_wire.

Tags:
Total votes 3: ↑2 and ↓1+1
Comments0

Запуск тестов параллельно с мокнутыми импортами, но..

  • Медленное исполнение каждого теста

  • Врут про Zero Config

  • Развесистый сложный API

  • Заточка под модульные тесты вместо компонентных

  • Красивые отчёты не помогают в отладке

Поблагодарить: https://boosty.to/hyoo

Tags:
Total votes 6: ↑3 and ↓30
Comments0

Централизованный сериализабельный тайм-тревел, но..

  • Много бойлерплейта с кишками наружу

  • Врут про undo/redo

  • Утечки памяти by design

  • Тормоза на больших проектах

  • Сложно переиспользовать свой код

  • Требует кучи тяжёлых костылей

Tags:
Total votes 4: ↑2 and ↓20
Comments1

Столько обещаний, но..

  • Линейная бизнес-логика превращается в лапшу.

  • Много бойлерплейта с ручным приводом.

  • Деградация производительности по мере роста приложения.

  • Нестабильная работа при возникновении исключения.

  • Легко допустить конфликт инвариантов, который приводит к дребезгу, неконсистентности или даже зависанию.

Tags:
Total votes 4: ↑2 and ↓20
Comments0

Классные метрики, но..

  • Тормоза и глюки в дев-режиме.

  • Сетевые задержки при любой навигации.

  • Падение при лагающей/потерянной сети.

Total votes 9: ↑5 and ↓4+1
Comments0

Богатый набор компонент, но..

  • Медленная работа

  • Огромный вес

  • Слабая кастомизируемость

  • Сомнительные практики

Total votes 6: ↑3 and ↓30
Comments10

Information

Rating
1,494-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Chief Technology Officer (CTO), Chief information officer (CIO)
Lead
From 8,000 €
OOP
Database
Designing application architecture