LINUX.ORG.RU

inversifyjs

 , ,


0

2

Сабж.

Насмотрелся я тут на проекты обложенные всякими декораторами @injectable, контейнерами, символами и интерфейсами (которые реализует один единственный класс) по самое не могу, аж в глазах рябит.

Кто-то это вообще использует? Чем оно лучше ванильного js/babel/ts?

@injectable()
export class My implements MyInterface {
    public constructor(
        @inject(Symbols.Logger) private readonly _log: Logger,
    ) {
    }
}

Что это такое? Почему нельзя сделать просто:

export class My implements MyInterface {
    private readonly log: Logger;

    public constructor()
    {
        this.log = new Logger();
    }
}

И не тащить за собой лишние пакеты?

★★

Последнее исправление: neversleep (всего исправлений: 1)

Ответ на: комментарий от crutch_master

Ну, могу 3 варианта сделать. Что ты имеешь ввиду под жестко/мягко?

Твои варианты заранее определены. Хоть сто сделай. Понадобится стопервый - и без изменения кода не привернуть.

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

IMO это все из серии агитации за глобалы. Ну а чо, можно же, и даже удобно бывает.

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

Vit ★★★★★
()
Ответ на: комментарий от Vit

Понадобится стопервый - и без изменения кода не привернуть.

Ну так понятное дело, нужно будет другой логгер - полезешь его писать и делать require. А какие еще есть варианты? Путь до модуля в конфиг? Когда инжектишь что-то в класс - это тоже надо написать или прицепить с либой (и оно так же свалится в рантайме).

На чем потолще с долгосрочной поддержкой и толпой криворучек быстро станет грустно.

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

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Ну так понятное дело, нужно будет другой логгер - полезешь его писать и делать require. А какие еще есть варианты? Путь до модуля в конфиг? Когда инжектишь что-то в класс - это тоже надо написать или прицепить с либой (и оно так же свалится в рантайме).

Разница в том, откуда воздействуют модификации - снаружи или изнутри (через варианты глобалов). Если снаружи - значит у тебя изолированный код, и ты большой молодец. Если изнутри - ну ты либо великий архитектор, который точно понимает перспективы связного кода в конкретном проекте, либо крепко не подумал.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Слишком хорошо — тоже плохо.

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

wandrien ★★
()
Ответ на: комментарий от wandrien

Мы не обсуждали что лучше. Мы обсуждали в чем отличие.

Vit ★★★★★
()

что бы было, как у взрослых дяденек, во взрослых язычках. в js оно не надо. единственно выглядит знакомо для java и прочих багописцев.

anonymous
()
Ответ на: комментарий от tz4678

там не строгой тупизации

Вот что пишут в интернетах:

TypeScript добавляет строгую типизацию и не позволяет смешивать типы

Владимир 123

anonymous
()
Ответ на: комментарий от anonymous

Такой код:

class User {
    protected _name: string;
    protected _age: number;

    constructor(name: string, age: number) {
        this._name = name;
        this._age = age; 
    }

    public get age() {
        return this._age;
    }

    public get name() {
        return this._name;
    }
}

будет преобразован в:

"use strict";
class User {
    constructor(name, age) {
        this._name = name;
        this._age = age;
    }
    get age() {
        return this._age;
    }
    get name() {
        return this._name;
    }
}

как это спасет от передачи аргументов не того типа в рантайме?

и чем это говно на которое надрачивают сишарпомакаки лучше нативного js?

> class User {
  #name = null
  #age = null
  constructor(name, age) {
    this.#name = name
    this.#age = age
  }
  get name() { return this.#name }
  get age() { return this.#age }
}
undefined
> new User('semen', 42)
User {#name: "semen", #age: 42}
> new User('semen', 42).#name = 1
Uncaught SyntaxError: Private field '#name' must be declared in an enclosing class
tz4678 ★★
()
Ответ на: комментарий от tz4678

будет преобразован в:

Любой код на любом языке будет в итоге преобразован во что-то, куда ничто не мешает передать что угодно в рантайме. Ты это понимаешь или нет?

anonymous
()
Ответ на: комментарий от anonymous

только вот даже питон в рантайме выкинет исключение, а твой ts преобразованный в js как и обычный проглотит все и продолжит работы

tz4678 ★★
()
Ответ на: комментарий от tz4678

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

anonymous
()
Ответ на: комментарий от tz4678

По такой логике и машкоды процессора — говно, потому что там в рантайме исключений типизации не выкидывается.

static_lab ★★★★★
()
Ответ на: комментарий от tz4678

Это ты чушь пишешь. Плюсовая функция, например, строго типизирована, но в compile time. За передачу аргументов не того типа компилятор будет ругаться. Но после компиляции передавай функции какие хочешь параметры. Никто ничего не скажет, разве что словишь segmentation fault.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

я писал, что говно ts-runtime. если бы

function stuff(x: int): void {
  //
}

компилировалось во что-то типа этого:

function stuff(x) {
  if (typeof x !== 'number') {
    throw new TypeError('...')
  }
}

то смысл может и был… вместо же этого предлагается использовать какое-то говно с костылями. код на тайпскрипте и так громоздкий, а тут еще писать больше кода… пока что я делаю вывод о ненужности ts и всего что с ним связано.

tz4678 ★★
()
Ответ на: комментарий от tz4678

Даже в простых примерах, что я выше привел кода на ts больше намного:

`class User {
    protected _name: string;
    protected _age: number;

    constructor(name: string, age: number) {
        this._name = name;
        this._age = age;
    }

    public get age(): number {
        return this._age;
    }

    public get name(): string {
        return this._name;
    }
}`.replace(/\s/g, '').length
201
`class User {
  #name = null
  #age = null
  constructor(name, age) {
    this.#name = name
    this.#age = age
  }
  get name() { return this.#name }
  get age() { return this.#age }
}`.replace(/\s/g, '').length
133

Но придурки, которые пишут на тайпскрипте, приползшие во фронт из удоднета такой простой код не пишут. Все нужно обмазать интефрейсами, дженериками и постоянным указанием и приведением типов. Итого выйдет, что кода будет раза в 2 больше.

tz4678 ★★
()
Последнее исправление: tz4678 (всего исправлений: 1)
Ответ на: комментарий от tz4678

то смысл может и был

В том, чтобы чекать тип при каждом вызове, между разовой проверки?

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

anonymous
()
Ответ на: комментарий от anonymous

В том, чтобы чекать тип при каждом вызове, между разовой проверки?

ts-runtime именно это и делает и именно его посоветовал фанат тупизации

Ламер, пожалуйста, замолчи свой рот, ты не соображаешь в программировании и устройстве исполняемых сред

а ты такой «эксперт», что под онанизмусом парячешься, боясь оказаться в чем-то неправым - поразительная неуверенность

tz4678 ★★
()
Ответ на: комментарий от tz4678

https://en.wikipedia.org/wiki/The_purpose_of_a_system_is_what_it_does

Вы правы в качестве кода.

При этом typescript цель благополучие корпоративной разработки ( поэтому typescript так похож на жабку - что бы хоть так с пользой использовать такое число с жгм)

ваще сложение векторов вот оъьяснение вашего с анони недорозумения - так то вы видите(т.е смотрите) ситуацию одинаково - но чутка в разных координатах - следовательно видите(входные) чуть разно - и строгое сравнение не проходиться - при том что механизм сравнения у вас идентичен - в том и веселье для некоторых зрителей.

qulinxao3
()
Ответ на: комментарий от tz4678

ts-runtime именно это и делает и именно его посоветовал фанат тупизации

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

anonymous
()
Ответ на: комментарий от tz4678

https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7

+

«Summing up, implicit type coercion is a very important concept you should always keep in mind. Avoid loose equality. Think about what are you comparing, use explicit conversion whenever possible. Consider switching to TypeScript if the above scares you :)»

https://neerc.ifmo.ru/wiki/index.php?title=Частично_рекурсивные_функции

https://ru.wikipedia.org/wiki/Рекурсивная_функция_(теория_вычислимости)#Части...

как сложность/дорогость реализации всюду определённого поведения.

замечательно JavaScript: The Good Parts и You Don't Know JS как цельное произведение.

qulinxao3
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от qulinxao3

weird поведение js в жизни мало мешает, потому как складывать объекты с массивами людям в здравом уме не придет. спецификация ecmascript (ecma=acme - киноштамп, ага) в открытом доступе, там описано как работает интерпретатор сферического в вакууме языка ecmascript, реализацией которого является javascript. возможно, если бы авторы таких статеек читали спеки, то у них вопросов не возникало, но такого ожидать от смузихлеба на самокате не стоит. им действительно проще писать на сурогатах

tz4678 ★★
()
Ответ на: комментарий от tz4678

Насколько же нелепы твои жалкие потуги, макака.

class User {
  constructor(readonly name: string, readonly age: number) {}
}

Считай, макака.

anonymous
()

А нельзя как-то по-ламерски передать логгер параметром без @заклинаний? Кстати, сабжевый код это уже прям аутентичная жаба. Я бы и не догадался, что это js. За что индусы не берутся, везде у них жаба получается.

bread
()
Последнее исправление: bread (всего исправлений: 2)
Ответ на: комментарий от tz4678

JS стал бэйсиком современности.

прикольно как фальстартанулся https://en.wikipedia.org/wiki/Rhino_(JavaScript_engine)#History

индустрии потребовалось 20 лет +- для принятия «серверсайд» JS

ибо(в том числе) инерция системы подготовки спецов

пример Golang/Python/Java/Lua и прочего - «понятно» что по мере роста вычь_мощьности и память_мощьности языки со сборкой мусора и утиностью станут экономически оправданней - что и произошло.

и да - теория акторов (её частный случай теория относительности с конечностью передачи «сигнала») - отличная модель мира.

qulinxao3
()
Ответ на: комментарий от tz4678

возможно это критерий эпохи

и Си и Js и PHP (Phractal Houpeless pitifulness) - уяк_уяк_продакт

ваще кривизна как фильтр

qulinxao3
()
Ответ на: комментарий от qulinxao3

JS с первой своей версии был сервер-сайд, еще в нетскейпе. Еще даже до того, как его стандартизировали.

anonymous
()
Ответ на: комментарий от tz4678

Сразу бы сказал, что ты 1Сник.

anonymous
()
Ответ на: комментарий от bread

Конечно можно. Просто придётся вручную создать объект логгера, предварительно создав объекты, от которых зависит его конструктор. И так далее.

static_lab ★★★★★
()

JavaEEScript

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.