Skip to content

Instantly share code, notes, and snippets.

@xexys
Last active September 14, 2021 19:26
Show Gist options
  • Select an option

  • Save xexys/05eabccd197dc3d12d1faa662db80f93 to your computer and use it in GitHub Desktop.

Select an option

Save xexys/05eabccd197dc3d12d1faa662db80f93 to your computer and use it in GitHub Desktop.

Revisions

  1. xexys renamed this gist Sep 14, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. xexys created this gist Sep 14, 2021.
    46 changes: 46 additions & 0 deletions arguments-count
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    > а слишком много - это сколько?) больше 5?)

    Имхо 4 еще можно передать списком, остальное уже объект.
    Дело в том, что когда аргументов больше 4-х, то, как правило, ты попадаешь в ситуацию, про которую написал ниже.

    > мне непринципиально, я просто привыкла к объектам, потому что мне так понятнее, что и в какой аргумент ты передаешь - порядок для тебя неважен в этом случае)

    Ну вот да, тут ключевое - это порядок.

    Какое-то время назад мы использовали рамду и карринг, и, чтобы можно было в `point-free` стиле создавать ф-ии, основной аргумент шел в самом конце.

    Пример
    ```ts
    const replace = curry((pattern, value) => {...});
    const replaceX = replace('x');
    ```

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

    ```ts
    const setFieldValue = async (ctx: Ctx, field: typeof FormFieldPO, value: string, name?: string): Promise<void>
    ```
    `setFieldValue` - само название нам уже диктует кто тут главный. Если нет `field`, то и ф-ию вызывать не имеет смысла. Именно `field` наделяют ф-ию какой-то семантикой, что это не абстрактный сеттер.
    Если нет `value` то как бы тоже не имеет смысла вызывать, но все же `value`- вторичен, так как оно более абстрактный в отрыве от ф-ии. Это именно `fieldValue`, а не просто `value`.
    `name` - необязательный параметр, служит чтобы в отчете дать больше подробностей, потому в самом конце.

    ```ts
    const calculateSomeValue = (params: {a: string, b: number, c: string[]}): Value;
    ```

    А вот тут другая ситуация, сложно сказать какие из параметров `a`, `b` или `c` определяющие, и какие из них больше вносят вклад в итоговый результат. Потому тут скорее всего лучше использовать объект.

    Конечно нет каких-то строгих правил, и все во многом на уровне договоренности в команде.

    Я бы рекомендовал как-то так делить:
    - Если это геттеры или сеттеры для каких-то сущностей, то как правило тут лучше перечислить аргументы.
    - Если это какие-то вычисления на основе данных, то лучше объект.

    Но могут быть как геттеры так и вычисления в одном флаконе. Например селекторы. Они с одной стороны геттеры для сущности `state`, а с другой стороны идет вычисление от данных.
    Но все же мы с уверенностью можем сказать что `state` - определяющий параметр.
    В таких случаях можно все равно выделить один аргумент под основной, как скажем наш `state`, а все остальные собрать в объект.

    ```ts
    const selectCalculatedValue = (state: State, params: {a: string, b: number, c: string[]}): Value;
    ```