All streams
Search
Write a publication
Pull to refresh
5
0
Александр Данилов @gen1lee

13 лет опыта коммерческой разработки

Send message

Я думал

Думал но не сказал, молодец. Код выводит то же самое, если нужно состояние очевидно нужно было использовать состояние в выводе, чтобы потом не писать что ты думал?

код сразу же проспится если

Очередная демагогия "а вот если бы". Я предоставил код который куда проще и без классов. Могу предоставить еще хоть с состоянием, хоть с чем. Перепиши свой код так, чтоб работал "как ты думаешь", я скину аналог.

Лишний мусор только просьба удалить и сделать его минималистичным.

type Tool = 'collect-in-radius' | 'align' | 'instancer'

const collectInRadius = (x: number, y: number) => console.log('From ToolCollectInRadius')
const align = (x: number, y: number) => {
  collectInRadius(x, y)
  console.log('From ToolAlign')
}
const instancer = (x: number, y: number) => console.log('From ToolInstancer')

const tools: Record<Tool, (x: number, y: number) => void> = {
  'collect-in-radius': collectInRadius,
  align,
  instancer,
}

const processClick = (tool: Tool, x: number, y: number) => {
  tools[tool]?.(x, y)
}

const main = () => {
  processClick('collect-in-radius', 10, 10)
  processClick('align', 10, 10)
  processClick('instancer', 10, 10)
}

main()

В коде много какого то неиспользуемого мусора. Вот код что выводит то же самое.

Если нужна доп логика, допиши в вывод в консоль, либо тесты.

Я на Swift дважды в контестах телеги призовые места занимал.

Я похож на ChatGPT который должен дописывать код, каждый раз получая все новые комментарии?

А ваши рассуждения как и что будет - это демагогия. Предоставьте минималистичный кусок кода в ООП, который по вашему будет выглядеть плохо в ФП, и я вам его перепешу, и с кодом его использования. Последняя попытка, больше времени тратить не буду.

Я готов написать код ФП без проблем.
Разгребать тонну говнокода из библиотек, которым место на помойке (RX и еще какой то нонейм) - не готов.
Напишите что требуется, а разумных пределах, без проблем реализую.

Небольшой момент - судя по всему вы под ФП подразумеваете математический стиль из моих определений. Я трактую куда шире, и не топлю за иммутабельность, и вполне спокойно использую изменяемый стиль когда это нужно, просто без классов. И это и называю ФП. Так может и проблемы тогда нет?

switch вместо полиморфизма

Узнай что такое полиморфизм сначала.

Автор топит не за функциональный (= математический стиль), а за ФП. А в нем можно работать как в мутабельном, так и в иммутабельном стиле.

Коротко тут никому не надо. Заметил ошибку - указал, считаешь что ООП лучше - привел код в каких случаях.

Что конкретно автор не понимает и в чем ошибка в статье конечно же опустим, ведь сами не знаем.

Удобно, ответить только на те тезисы, на которые есть, что ответить 

Есть что ответить на все, пусть сначала на первое ответит.

переиспользование это конечно хорошо, но

Так и знал - типичные отмазки про то что это может и не надо. Да нельзя никак метод класса переиспользовать, вот и все. Но можете дальше сопли жевать.

Например, в той же Java, есть volatile и потокобезопасные типы данных, которые прекрасно могут работать без излишней синхронизации

Аа, ну они то конечно без синхронизаций работают внутри, ага, и не заблокируют поток.. А с разными "потокобезопасными" коллекциями одновременно работать - никаких состояний гонок конечно не будет. О многопоточке спорить с типичным комментатором это как с черепашкой спорить о черных дырах.

Речь про поверхностное копирование.

Прошлый проект - 200 000 строк кода на TypeScript только своего, не считая библиотек. Вот только он коммерческий и приватный, выложить не могу.

И да, на каком нибудь С++ или Java это было бы x20 строк кода.

А так - гляньте React какой нибудь.

const encoders = {
  xxx: {
    encode: encodeXxx,
    fallback: encodeYyy,
  }
  yyy: {
    encode: encodeXxx,
    fallback: encodeZzz,
  }
} as const

// Использование

const main = () => {
  let useFallback = false

  while (...) {
    const frame = getFrame()
    
    const {encode, fallback} = encoders[frame.encoding]

    const stream = useFallback
      ? fallback(frame)
      : (() => {
          try {
            return encode(frame)
          } catch {
            fallback = true
            return fallback(frame)
          } 
        })()
    
    // Используем stream
  }
}

Ваш код использования не приведен, додумываю сам.

Отсутствие классов и неявный this на явный это и есть ФП.

import {Tool, align, processPick} from 'some-library'

export type CustomTool = Tool & {
  ... // some custom fields
}

export const customProcessPick = (tool: CustomTool, context: ScreenContext, x: number, y: number) => {
  processPick(tool, context, x, y)
  
  align(tool.selectedItems)
}

Реализовать можно много как, и зависит от библиотеки конечно же. Либо она на базовых типах, либо вообще на обобщениях, что еще гибче. И в целом задачу хотелось бы увидеть, а не догадываться.

А что внутри processPick? И что возвращает getActiveTool?

Откуда мне знать что внутри кода из вашей головы? Возвращает какой то текущий тул? Вы мне расскажите.

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

универсальной компиляции на любых устройствах

А TypeScript запускается не на любых устройствах?

самодокументируемости интерфейсов

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

Но чтобы прям всё ООП плохо это тоже слишком сильный тейк

Тогда должен быть хоть один пример кода, где ООП выигрывает ФП. Но что то его все нет и нет.

Товарищ демагог, так как переиспользовать из вашего класса GetDisplayName для собаки, наследуемой от Animal?

Я там не вижу вообще никаких подробностей кроме обычного списка на мобилке, который я реализовывал 10000 раз во всех парадигмах, и то говно что ты написал я бы мало того что не пропустил никогда, так еще и уволил бы пинком.

Списки на мобилках делаются элементарно без дополнительных фильтраций и "вырезаний". Тебе вообще менять исходный массив на клиенте не надо, он приходит с бэкенда уже с пагинацией и в правильном порядке, просто подставляй в условный TableView и загружай новую страницу когда пользователь доскролил до конца.

Учи, студент раз два три.

А вот реализация бесконечной пагинация в моей библиотеке в ФП на TypeScript.

const mouseClick = (data: MouseEventData) => {
  processPick(getActiveTool(), getScreenContext(), data.x, data.y)
}

И?

Вы React'теру хотите доказать что клик не обработать в ФП?))))

И нафига мне Channels если я разбирал аналог стандартных примитивов типа Monitor? Нашелся "эксперд".

Могу добавить в бенчмарк ПР с каналами ради интереса, но сам писать не буду.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity

Specialization

Frontend Developer, Mobile Application Developer
Lead