Roman
Любая функция, скажем CelsiusToFharenheit сюда подходит стало быть
Подходит. Но я бы объединил такие функции в какой нить ConvertionService и использовал бы его как единую точку входа
Александр
ООП не единственный и далеко не всегда самый удобный подход к разработке
Roman
а в чем проблема?
Вы предложили менять реализацию
Roman
Но в терминах объектов удобно думать
Александр
Подходит. Но я бы объединил такие функции в какой нить ConvertionService и использовал бы его как единую точку входа
Я вас может не понимаю, с утверждением выше я согласен, но я так понимаю вы предлагаете делать этот conversion service классом?
from
Вы предложили менять реализацию
нет, это ты про замену реализации сказал, а я рассказал как это сделать) А если задача две реализации одновременно иметь, то просто создаётся второй файл 🤷‍♀️
Александр
Да
А почему не модулем который экспортит эти функции? Ну так же проще банально
Китикет
Да
Но.. ведь.. export * as..
Китикет
Конвертация это же чистые функции частично завязанные на константы
Александр
В чем разница подменить класс или модуль
Александр
Но класс тут явно избыточен
Александр
DI
Через props
Roman
А почему не модулем который экспортит эти функции? Ну так же проще банально
Модуль не реализует интерфейс. Модуль не умеет создавать параметризованные версии себя, а класс умеет
Roman
Через props
Как можно передать модуль? Можно передать конкретный объект
Cenator 🐈
Объекты это замыкания для бедных
Roman
представляю interface ConversionService { celsiusToFahrenheit() {} htmlToPdf() {} vgaToDVI() {} }
И правда не очень, соглашусь. Тут бы я не делал интерфейс. Это был бы просто класс или даже просто модуль!
Roman
Будешь курс рубля подменять?
Подменять апи доступа к данным
Александр
Подменять апи доступа к данным
Опят же не проблема вроде как, классы тут не нужны
Roman
Модуль это объект
Можно пример? Типа import * as MyModule?
Roman
Опят же не проблема вроде как, классы тут не нужны
Они никогда не нужны, если так рассуждать. Но удобны
Александр
нооо как бы DI напрашивается
А я не говорил что надо импортировать этот модуль напрямую где исползуешь, как раз его и инжектировать
Александр
Они никогда не нужны, если так рассуждать. Но удобны
Иногда... там где удобны. Но лепить ООП ради ООП глупо
Александр
Как инжектировать?
Ну через props скажем или context api
Roman
Ну через props скажем или context api
НЕ используя типы? Просто как any?
Александр
Средства для DI слава богу в реакте архитектурно из коробки
Александр
НЕ используя типы? Просто как any?
Почему же, можете (я так и делаю) типизировать
Александр
Как типизировать модуль?
Вы из модуля можете сделать default export объекта с нужными свойствами и методами, и вот этот объект будет иметь тип описанный через type скажем
Roman
Это утиная типизация какая-то. Структурная, да. Мне больше по нраву явная
Александр
Объект тут я имею ввиду не инстанс класса если что, а просто ассоциативный массив
Roman
Объект тут я имею ввиду не инстанс класса если что, а просто ассоциативный массив
Как модуль будет хранить свой стейт? что если я хочу иметь разный стейт для разных потребителей модуля?
Александр
Это утиная типизация какая-то. Структурная, да. Мне больше по нраву явная
Явная в смысле номинальная как в шарпе и яве? Но это вопрос принятых в языке норм, в js/ts исторически структурная типизация используется
Александр
Изначально речь шла о синглтонах вроде, которые предоставляют один и тот же набор функций
from
Подменять апи доступа к данным
тут как бы в корне подход другой принят допустим есть компонент <PaymentForm /> Ты хочешь, чтобы этот компонент как-то обратился к сервису Payment, у которого бы последовательно дёргал условные методы типа authenticateUser, confirmPhoneNumber, verifyEmail, sendPayment И конечно тебе хочется иметь возможность этот сервис Payment подменять В более фп подходе с компонентами принято несколько по-другому, что-то вроде такого <Payment onAuth={data => /* handle auth */} onConfirmPhoneNumber={/* handle phone number confimration */} onVerifyEmail={/* handle email verification */} onSendPayment={amount => /* send payment */} {...otherImportantConfigurationProps} /> я наспех набросал, но хоупфулли мысль понятна И в таком случае не составляет труда использовать <Payment /> в разных местах, передавай ему разные хэндлеры бизнес-логики
Roman
Это уже другая постановка вопроса )
Эти вопросы уже решены в ООП-подходе. Что мешает его использовать? Идеологическая неприязнь?
Александр
При использовании классов, она мимикрирует под номинальную.
Не мимикрирует если я вас понял верно, но ею и является (мы же про тайпскрипт все еще?)
Roman
тут как бы в корне подход другой принят допустим есть компонент <PaymentForm /> Ты хочешь, чтобы этот компонент как-то обратился к сервису Payment, у которого бы последовательно дёргал условные методы типа authenticateUser, confirmPhoneNumber, verifyEmail, sendPayment И конечно тебе хочется иметь возможность этот сервис Payment подменять В более фп подходе с компонентами принято несколько по-другому, что-то вроде такого <Payment onAuth={data => /* handle auth */} onConfirmPhoneNumber={/* handle phone number confimration */} onVerifyEmail={/* handle email verification */} onSendPayment={amount => /* send payment */} {...otherImportantConfigurationProps} /> я наспех набросал, но хоупфулли мысль понятна И в таком случае не составляет труда использовать <Payment /> в разных местах, передавай ему разные хэндлеры бизнес-логики
Очень может быть, что эти методы должны быть семантически связаны между собой. А так мы можем один метод передать, взяв его из сервиса A, другой из сервиса B. Получится несогласованность, но на этапе написания кода это не будет видно
Александр
Эти вопросы уже решены в ООП-подходе. Что мешает его использовать? Идеологическая неприязнь?
Отвечу вам по своему опыту, при разработке на реакте у меня необходимость в ООП не возникала ни разу, и чтобы предупредить вопросы, скажу, что я знаком непонаслышке с понятием объектно-ориентрованного программирования, но вот не возникало желания и необходимости применить это на фронте с реактом. Спорить не хочу дальше.
Roman
Не мимикрирует если я вас понял верно, но ею и является (мы же про тайпскрипт все еще?)
Про Typescript. По сути мимикрирует, так как в рантайме нет никаких интерфейсов, в отличие от языков типа C#
Александр
Это все компайл тайм проверки
Александр
С точки зрения CPU так вообще никаких типов нет
Roman
В рантайме нигде нет вроде как
В C# в рантайме можно рефлексией доставать интерфейсы явно, в js же нет такого понятия в принципе в рантайме
Roman
С точки зрения CPU так вообще никаких типов нет
Это уже далеко вниз спустились
Александр
Нет, рантайм тоже
Не знаком с си шарп, но неужели оно делает какие-то поверки в скомпилированом байткоде?
Александр
C++ просто вот не делает:( я по нему сужу
Roman
Не знаком с си шарп, но неужели оно делает какие-то поверки в скомпилированом байткоде?
Мы можем создать объект динамически в рантайме и попытаться кастовать его в интерфейс
Roman
Можно тупо создать объект по имени строки класса, которая приходит извне. Понятно, что нельзя на этапе компиляции это проверить
Александр
Можно тупо создать объект по имени строки класса, которая приходит извне. Понятно, что нельзя на этапе компиляции это проверить
Интересно как это там реализовано, метаинформаиция о типах стало быть там сохраняется после компиляции?
Roman
C++ просто вот не делает:( я по нему сужу
Да, в плюсах нет механизма для создания объектов, типы которых будут известны в рантайме
Roman
Мы можем взять чужую скомпиленную сборку, подключить в свой проект и юзать. При том нам не нужны заголовочные файлы никакие, сборка выставляет наружу свой контракт через метаданные
Александр
В общем если подытожить наши споры, в мире фронтенда реактового как-то люди вполне себе делают крутые вещи без протягивания, а порой даже без представления о таком понятии как ООП. Это как минимум повод задуматься, а действительно ли стоит один в один подходы переносить. Не подумаете что хочу тут высказаться в стиле ООП сосет, но вот факт - делают без него крутые фронтенды.
Александр
Спасибо за дискуссию, спать пойду )
Madiyar
есть ли возможность шэрить модули между проектами в реакте, как ng-packager в ангуляре?
Madiyar
или создать workspace из нескольких react приложении?
Looch
Но не стоит говорить что статическая типизация сосет
Китикет
Я пиздец жалею что у меня TS нет на основном проекте, тут просто дикая логика печати чеков, и можно просто сдохнуть с кучей DI без автокомплитов