Forwarded from Настоящий JavaScript
✅ Luhn check
Реализует алгоритм Luhn, используемый для проверки различных идентификационных номеров, таких как номера кредитных карт, номера IMEI, идентификационные номера национального провайдера и т.д.
📂 Подробнее
#сниппет
💛 Настоящий JavaScript
Реализует алгоритм Luhn, используемый для проверки различных идентификационных номеров, таких как номера кредитных карт, номера IMEI, идентификационные номера национального провайдера и т.д.
📂 Подробнее
#сниппет
💛 Настоящий JavaScript
#архитектура
Open-Closed Principle, OCP
задача:
на входе в функцию filteredOrderList мы передаем orders и какую-то функцию filter а на выходе получаем отфильтрованный список ордеров
но в будущем нам захочется изменить логику фильтрации
решение:
а если бы захотелось применять несколько фильтров, то
Open-Closed Principle, OCP
задача:
на входе в функцию filteredOrderList мы передаем orders и какую-то функцию filter а на выходе получаем отфильтрованный список ордеров
но в будущем нам захочется изменить логику фильтрации
решение:
// Базовый класс для фильтров
class OrderFilter {
filter(orders) {
throw new Error("Метод 'filter' должен быть переопределён в наследнике");
}
}
// Фильтр по статусу
class StatusFilter extends OrderFilter {
constructor(status) {
super();
this.status = status;
}
filter(orders) {
return orders.filter(order => order.status === this.status);
}
}
// Фильтр по сумме
class AmountFilter extends OrderFilter {
constructor(minAmount) {
super();
this.minAmount = minAmount;
}
filter(orders) {
return orders.filter(order => order.amount >= this.minAmount);
}
}
// Функция для отфильтровывания заказов
function filteredOrderList(orders, filter) {
return filter.filter(orders);
}
// Пример использования
const orders = [
{ id: 1, status: 'completed', amount: 150 },
{ id: 2, status: 'pending', amount: 200 },
{ id: 3, status: 'completed', amount: 300 },
{ id: 4, status: 'cancelled', amount: 100 },
];
// Создаем экземпляры фильтров
const completedFilter = new StatusFilter('completed');
const amountFilter = new AmountFilter(200);
// Применяем фильтры
const completedOrders = filteredOrderList(orders, completedFilter);
const highAmountOrders = filteredOrderList(orders, amountFilter);
console.log('Completed Orders:', completedOrders);
console.log('High Amount Orders:', highAmountOrders);
а если бы захотелось применять несколько фильтров, то
class CompositeFilter extends OrderFilter {
constructor(filters) {
super();
this.filters = filters;
}
filter(orders) {
return this.filters.reduce((filteredOrders, filter) => {
return filter.filter(filteredOrders);
}, orders);
}
}
const orders = [
{ id: 1, status: 'completed', amount: 150 },
{ id: 2, status: 'pending', amount: 200 },
{ id: 3, status: 'completed', amount: 300 },
{ id: 4, status: 'cancelled', amount: 100 },
];
// Создаем экземпляры фильтров
const completedFilter = new StatusFilter('completed');
const amountFilter = new AmountFilter(200);
// Объединяем фильтры
const combinedFilter = new CompositeFilter([completedFilter, amountFilter]);
// Применяем комбинированный фильтр
const filteredOrders = filteredOrderList(orders, combinedFilter);
console.log('Filtered Orders:', filteredOrders);
Forwarded from FrontEndDev
AbortController не только для fetch
Несколько вариантов использования AbortController'a, о которых мало кто знает, но которые могут быть сподручными при решении задач разработки.
https://kettanaito.com/blog/dont-sleep-on-abort-controller
Несколько вариантов использования AbortController'a, о которых мало кто знает, но которые могут быть сподручными при решении задач разработки.
https://kettanaito.com/blog/dont-sleep-on-abort-controller
#архитектура
про нейминг
абстрактный нейминг использовать только тогда, когда неважно, что лежит за этим неймингом - что-то обобщеное (list, item, value, number и тд)
но когда мы работаем с чем-то специфичным, то нейминг должен быть специфичным. например мы фильтруем заказы значит
не стоит конкретизировать с фанатизмом там, где не нужно
пример: если в этом случае нам важно чтобы функция работала именно с провалидироваными заказами, то все ок
но если нам не важно это углубленное уточнение, то стоит его избегать, чтобы не вводить других в заблуждение
про нейминг
абстрактный нейминг использовать только тогда, когда неважно, что лежит за этим неймингом - что-то обобщеное (list, item, value, number и тд)
но когда мы работаем с чем-то специфичным, то нейминг должен быть специфичным. например мы фильтруем заказы значит
const filterOrderList = (orderList) => {
return filteredOrderList
}не стоит конкретизировать с фанатизмом там, где не нужно
пример: если в этом случае нам важно чтобы функция работала именно с провалидироваными заказами, то все ок
const filterOrderList = (validOrderList) => {
return filteredOrderList
}
но если нам не важно это углубленное уточнение, то стоит его избегать, чтобы не вводить других в заблуждение
const validateEmail = (userEmail/customerEmail) // неважно чью почту мы валидируем, важно, что мы в принципе валидируем почту
на заметку - попробовать схлопнуть фильтрацию, в которой мы будем передавать только колбэк
Forwarded from Frontend Portal
This media is not supported in your browser
VIEW IN TELEGRAM
Cвойство font-variant-numeric определяет, как будут отображаться числа. При значении 'tabular-nums' числа будут представлены с одинаковой шириной, что позволит им идеально выстраиваться в ряд
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Frontend Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM