Как стать автором
Обновить
0
0
Андрес Ковалев @andres_kovalev

Разработчик

Отправить сообщение
Странная подборка аргументов. Откуда она?
Всё, что есть в ООП, уже давно есть в других парадигмах

Не думаю, что данный тезис может вообще являться аргументом за или против ООП.
ООП смешивает данные и действия над ними. Это плохо

ООП не запрещает создавать объекты без состояния, ровно как и объекты без поведения.
Наследование закрепощает программу, делает трудным внесение изменений

Как и любой другой инструмент, может быть губительным не в тех руках. Возможно, речь о том, что наследование — очень сильная связь от общего к частному, а с сильными связями стоит быть осторожным. Уж точно наследование существует не для «выделения общих методов в базовый класс». Это как с KISS, который многие ошибочно считают призывом выносить все похожие участки кода в отдельный метод.
Инкапсуляция не имеет смысла

Нет, у данных аргументов правда существует какой-то источник?
Если не предполагается расширять родительский класс третьим классом — такое наследование попросту бессмысленно. Если вы создаёте магазин спиртных напитков, то классы Beer, Vodka и Vine можно унаследовать от класса Alcohol, но совершенно не нужно создавать ещё и класс Drinks, если только вы не хотите продавать ещё и, скажем, парагвайский чай.

Кроме классов существуют еще и интерфейсы, которые с точки зрения SOLID как раз желательно сегрегировать.
Но ведь никто не мешает создать, например, иерархию, где все реки мира (Конго, Сена, Темза, Амазонка, Колыма и т.д.) являются объектами одной всеобъемлющей «Реки», которой присущи свойства (например, состоит из воды) и действия (например, течёт), а уже она будет наследоваться от «Водоёма», который тоже состоит из воды, а от «Водоёма» можно унаследовать ещё и «Озеро», объектами которого будут отдельные озёра (Байкал, Каспийское море, Титикака и т.д.).

Например: человек — объект из реального мира. Он может ходить, бегать, кушать, срать спать, играть в футбол, смотреть футбол, но, к сожалению, я тут не могу всё перечислить, да и, честно сказать, всё перечислять было бы противно.

Это, вроде как, про одно и то же. Кстати, пример с человеком очень хорошо показывает, что наследование не может заменить композицию (иногда и наоборот). Как вы имплементируете человека, который играет в футбол от человека, который плавает, сделаете его наследником человека? А что нужно сделать, чтобы получить человека футболиста-пловца? Обычно, в таком случае композиция выиигрывает. Вообще, Composition over inheritance — один из основных принципов ООП, описанный еще в небезизвестной Design Patterns от GoF.
Но даже миллионы мух не убедят нас, что навоз — это вкусно

В целом статья получилась сумбурная, как это бывает обычно, когда она пишется «чтобы было». Цель Автора, вроде как, понятна, но для этого было достаточно прочитать последний абзац без всей воды с сомнительными аргументами и нечеткими контраргументами.
Ваше желание поделиться новыми для Вас знаниями можно понять, но почему хабр? Не достаточно ли было показать это своим друзьям или выложить на каком-нибудь форуме? Мало того, что статья на уровне «объясню как понял» (с примером из документации), так еще и код в ней, как говорится, с душком — учить такому совершенно не стоит торопиться:
Для начала нам нужен менеджер пакетов. Я выбрал npm, а он есть в Node.js
На самом деле для запуска Вам нужен Node.js, а без менеджера пакетов даже можно обойтись. Но судя по статье — нода, это просто что-то, где есть npm.
this – текущий класс
this не текущий класс, а контекст. В Вашем случае — экземпляр класса.
Далее стандартная обработка конструктора родительского класса super(props)
Конструктор не обрабатывается, а вызывается.

Ну и по коду.
const INTERVAL = 100;
На самом деле это не интервал, интервал в Вашем случае — 1000/INTERVAL (в описании Вы и сами пишете, что это частота).
this.stopTimer = this.stopTimer.bind(this);
В комментариях уже упоминались стрелочные функции и proposal class properties.
this.setState({value: this.state.value + 1})
Также в комментариях уже упоминалось о возможности асинхронного обновления состояния, в связи с чем оф. документация рекомендует использовать использовать функциональный стиль.
stopTimer(){
	this.setState({stopped: !this.state.stopped});
		if(this.state.stopped){
			clearInterval(this.timerID);
		}
		else
		{
			this.timerID = setInterval(() => this.increment(), 1000/INTERVAL);
		};
	}
}
Судя по названию метод должен останавливать таймер, но он его и запускает. Не должен ли он тогда называться toggleTimer()?
this.timerID = setInterval(() => this.increment(), 1000/INTERVAL);
и
clearInterval(this.timerID);
Повторяющийся код в данном случае можно вынести в отдельную функцию.
if (this.state.stopped) document.title = "Таймер";
Вы выносите в отдельную переменную value, но не stopped. Подобные обращения на несколько уровней вложенности тяжело читать. Сделать код читабельнее и короче Вам поможет деструктуризация.
Math.floor(value/INTERVAL/60/60)+":"+Math.floor(value/INTERVAL/60) % 60+":"+Math.floor(value/INTERVAL) % 60;
Подобные выражения лучше предварительно вычислять и сохранять в соответствующие переменные, тем более что их значения по коду используются несколько раз (для отображения в заголовке окна и в самом таймере).
{value % INTERVAL < 10 ? '0' : ''}{value % INTERVAL}
Для добавления ведущих нулей обычно используется padStart(), преимущества которого особенно заметны в тех случаях, когда ведущих нулей больше одного. Интересно, что ведущие нули есть только у децисекунд. Если Вам было лень дублировать ту же логику для секунд/минут/и т.д. могли бы выделить ее в отдельную функцию.
Также надо исправить метод increment(), чтобы он останавливался, когда stopped = true:
Разве не для этого был остановлен таймер?
<div class="container-fluid align-items-center">
Оф. документация любезно просит использовать className вместо class, о чем React сигнализирует в консоли разработчика своими warning'ами.
&nbsp;
Совместно с flexbox'ом выглядит очень прогрессивно =)

Даже после исправления всех этих упрощений и ошибок (в т.ч. орфографических) статья все еще не сможет называться «Изучаем реакт», скорее «Изучаем еще один способ сделать таймер с применением реакта». Пожалуйста, не торопитесь делиться тем, в чем еще сами не до конца разобрались, тем более на ресурсе такого уровня. Подобных статей на хабре итак много, что превращает его в помойку из выброшенных велосипедов.

Для тех же, кому действительно хотелось бы изучить реакт за один день, могу посоветовать данный материал, в котором все по порядку объясняется на доступном языке и наглядном примере (есть продолжения про redux и router). И да, дня вполне хватит, чтобы его прочитать и попрактиковаться. повторив все действия автора.

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

От себя хотел добавить, что Ваши оппоненты делают упор на том, что условия контракта были несправедливы или неадекватны (слишком большое задание, слишком мало времени). Но ведь никто не заставлял их принимать. А если автор принял, то уже не важно, как он бы хотел, важно как договорились.

...остановите планету, я сойду...

Я бы тоже хотел находиться в обществе людей, которые во время диалога способны отслеживать направление мысли и следить за тем, чтобы не попадаться на наивные логические уловки ("кидалово, потому что нет доказательства, что не кидалово", "вы бот, поэтому аргументы не важны независимо от их разумности"). Поэтому если сойдёте - напишите название остановки, я тоже там выйду:)

В последнем вопросе ответ неправильный - чтобы что-то вывелось, надо App срендерить, а там он просто экспортируется)

Спасибо за интересный материал. Вопрос к автору библиотеки - поддерживает ли она в каком-либо виде асинхронность?

А как быть со случаями, когда пропы компонента меняются и коллбек должен об этом знать? Создавать в замыкании переменные, через которые прокидывать пропы?

```

export const clear = () => instances.clear()

```

=/

Это уже не первая библиотека, которая прячет за "хуками" использование глобальной переменой спрятанной в самой библиотеке (`instances`). Примерно так же поступает бОльшая половина библиотек "убийц редакса" (я не поклонник редакса, просто отметил).

Вопрос из зала - как Вы это тестируете?

Поясните, что хотели сказать этим комментарием? Ведь typeof null на самом деле не объект.

Я не имел в виду реализацию, я имел в виду в принципе его наличие. DI на фронте не очень популярен в других библиотеках и фреймворках. Я не поклонник Angular, но вариант с вынесением логики в сервисы и внедрение их в компоненты мне нравится и я думаю, как бы это объединить с прелестями React'а. Вы наверняка скажете, что эта проблема уже давно решена в $mol, причем более изящно, но так уж вышло, что я в нём не силен (хоть и читал почти все Ваши статьи про него) :)

Отличный за интересный материал и изложение - очень легко и приятно читается. Тоже уже какое-то время думаю о вынесении максимального количества логики из компонентов и тоже смотрю в сторону MobX и DI (примерно как в Angular). Ваш подход выглядит очень интересно и думаю, стоит его попробовать, чтобы понять, чего в нем может не хватать. Спасибо.

Разработка это целое творчество, а не работа за станком

поэтому я более чем знаю как именно писать код, чтобы это было максимально удобно и продуктивно

В огромных проектах, я точно так же просто делаю import состояния и читаю его в компонентах

Судя по тому, что Вы так агрессивно предлагаете, Вы назначили себя опытным "не-джуном" сами и в признании извне не нуждаетесь:) Любопытно (на самом деле нет), как вы тестируете потом такой код. Хотя допускаю, что Вы за 6 лет работы с React и MobX могли не увидеть в этом необходимости.

Как так виза позволяет Вам выпускать виртуальные карты для пользователей без KYC и вообще какой угодно регистрации?

В этом случае ее можно раскрасить цветом той страны, с которой она не граничит - т.е. новый цвет не нужен.

Уж простите я скажу странную вещь. Что денег всегда не хватает.

Для себя я вижу следушее. Что я получаю покупая а не воруя из магазина продукты, одежду, технику? Как бы чистую совсеть. Что теряю деньги, а если эта пакупка ещё и оказалась некачественной, то получаю торату нервных клеток, потому, что я купил это за свои деньги. Это само банальное, что есть. Если подойти не банально, то да есть куча одежды которую можно купить. Но блин мне пиджак нужен раз в пол года на 10 минут, ну явно не рационально его покупать. Вы скажете есть есть аренда или можно сшить самому, да но из за 20 минут в год искать их и разбираться как там это делается это выльется в 30 минут в год, а оно мне надо? Второй вариант это костюм за неподъемные деньги, тот же Pierre Cardin и Ralph Loren, да у меня, что так, что этак нету денег на него. А даже если бы и были туже Versace мне и до всех известных событий могли не продать, потому, что я им не понравился.

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

Классические объявление функции и функциональное владение идентичны определению стрелочной функции только в случае контексто-независимых функций. Например, в данном случае тип функции имеет значение:


const instance = {
  id: '...',
  filter(items) {
    return items.filter(item => item.id === this.id);
  }
};

Именно им ни разу не пользовался. Как-то пытался, но выбор на нем показался очень ограниченным. Советую Вам попробовать КиноПоиск, хотя бы просто для сравнения. Первые два месяца подписки бесплатно. Ассортимент более динамичный. Например, сегодня по подписке (т.е. бесплатно) стала доступна Лига справедливости Зака Снайдера. Я совершенно не являюсь поклонником данной франшизы (далее наоборот), просто привожу пример доступности новинок.

На счёт удаления: На практике пока такое ни разу не произошло, по крайней мере со мной.
На счёт облаков: Надеюсь, это шутка.

Кстати, забыл спросить, на с каким сервисом связан Ваш негативный опыт. Возможно, мы с Вами пользовались разными сервисами.

Почему шутка? Пока сервис существует, купленные Вами фильмы будут доступны в Вашей коллекции для просмотра. Что Вас здесь смущает?


Современные люди переезжают в облака ;)

Информация

В рейтинге
Не участвует
Откуда
Ухта, Коми, Россия
Дата рождения
Зарегистрирован
Активность