Алексей Золотых, МойОфис
Алексей Золотых
@zolotyh | |
telegram | @zolotyh |
aazolotyh@gmail.com |
Мы не можем это смерджить...
Ты сделал код хуже!
Низкий в нравственном отношении, безвкусно-грубый, лишённый идейных интересов и запросов.
- старинный, исконный
- искони принадлежавший
- прежний, обычный
Refactoring
Re: used to add the meaning "do again", especially to verbs
Refactoring
factoring: x2 + 4x + 3 => (x + 3)(x + 1)
This thesis denes a set of program restructuring operations (refactorings) that support the design, evolution and reuse of object-oriented application frameworks
1990 William F. Opdyke,
This thesis denes a set of program restructuring operations (refactorings) that support the design, evolution and reuse of object-oriented application frameworks
1990 William F. Opdyke,
Refactoring is a controlled technique for improving the design of an existing code base. Its essence is applying a series of small behavior-preserving transformations, each of which "too small to be worth doing".
Refactoring is a controlled technique for improving the design of an existing code base. Its essence is applying a series of small behavior-preserving transformations, each of which "too small to be worth doing".
function Card({ card }) {
if (card.type === 'news') {
return <NewsCard card={card} />;
}
if (card.type === 'post') {
return <PostCard card={card} />;
}
if (card.type === 'user') {
return <UserCard card={card} />;
}
return <DefaultCard card={card} />;
}
const CARDS = {
news: NewsCard,
post: PostCard,
user: UserCard,
}
function Card({ card }) {
const Component = CARDS[card.type] || DefaultCard;
return <Component card={card} />
}
Платный, есть бесплатная версия
Альтернативы
code refactoring is the process of restructuring existing computer code changing the factoring without changing its external behavior
Wikipedia, 2023
code refactoring is the process of restructuring existing computer code changing the factoring without changing its external behavior
Wikipedia, 2023
Было: меняем структуру эволюционно и улучшаем код
Стало: все время все переписываем, потому что так сказал Фаулер
Автоматический рефакторинг на AST
Переписать на хуки != отрефакторить
Разное понимание задачи
Разработчик: нужно переписать на хуки
Ревьювер: нужно сделать код чище
Чем больше вкладываешься — тем больше ценишь
На то, чтобы понять, что что-то не так, ушло 3 недели
Можно понимать такие вещи гораздо быстрее
Нужно чаще синхронизироваться
Нужно проверять, что задача понята правильно
Код для людей
Programs must be written for people to read, and only incidentally for machines to execute.
Код для людей
Programs must be written for people to read, and only incidentally for machines to execute.
Кошелек Миллера и Система 1 от Канемана
Нужно писать простой, понятный и поддерживаемый код
Проще сказать, чем сделать
Каждый метод должен быть написан в терминах одного уровня абстракции
Успею ли я к началу выступления (через час)?
const distance = map.getDistance();
const speed = car.getSpeed(speed);
return distance/speed <= 1
Добавим передачу и обороты вместо скорости
# передаточные числа
const GEARS = {
'1': 6.55,
'2': 3.09,
'3': 1.71,
'4': 1.00,
'R': 7.77
}
# считаем дистанцию
const distance = getDistance();
# параметры авто
const rotationSpeed = getCurrentRotationSpeed();
const gear = getCurrentGear();
const radius = getWheelRadius();
# успеем ли?
return (distance * 1000 * GEARS[gears]) /
(rotationSpeed * 60 * Math.PI * R) <= 1
Keep it simple, stupid
— А точно ли это проблема?
const distance = map.getDistance();
const speed = car.getSpeed(speed);
return distance/speed <= 1
class Car {
getSpeed(){...}
}
const car = new Car();
const distance = map.getDistance();
const speed = car.getSpeed(speed);
return distance/speed <= 1
More Is More Complex
Больше строчек - дороже поддержка
Пример:
Должен существовать один и, желательно, только один очевидный способ сделать это.
Массив
const arr = [1,2,3]
console.log(arr.lenght); //3
Set
const set = new Set([1,2,3,4])
console.log(set.lenght); // undefined
console.log(set.size); // 3
Массив
mylist = ['apple', 'banana', 'cherry']
len(mylist)
Set
lst = [1, 2, 3, 4, 5, 6]
len(set(lst))
Поддержка len для любого класса
class Bag:
def __init__(self, item_count):
self.item_count = item_count
def __len__(self):
return self.item_count
mybag = Bag(10)
print(len(mybag))
А в JavaScript
const obj = {
get length() {
...
}
};
const CARDS = {
news: NewsCard,
post: PostCard,
user: UserCard,
}
function Card({ card }) {
const Component = CARDS[card.type] || DefaultCard;
return <Component card={card} />
}
Субъективная оценка
Ссылка на принципы в качестве аргумента
Low Coupling (низкая связанность) и
High Cohesion (высокое зацепление)
1. Идеальная ситуация
2. Все в одном
3. Неправильные границы
4. Мастер SOLID
Tracking health over debt
Как можно найти?
Chidamber & Kemerer object-oriented metrics suite (shorturl.at/kOS28)
$ npx code-complexity . --sort=score --limit=3
┌──────────────────────────────┬────────────┬───────┬───────┐
│ file │ complexity │ churn │ score │
├──────────────────────────────┼────────────┼───────┼───────┤
│ src/cli.ts │ 103 │ 8 │ 824 │
├──────────────────────────────┼────────────┼───────┼───────┤
│ test/code-complexity.test.ts │ 107 │ 7 │ 749 │
├──────────────────────────────┼────────────┼───────┼───────┤
│ .idea/workspace.xml │ 123 │ 6 │ 738 │
└──────────────────────────────┴────────────┴───────┴───────┘
Не было метрик
PS: Про автотесты
Пирамида и трофей
Отзыв
Слайды
Алексей Золотых — @zolotyh