Pull to refresh
56
0

Full stack web developer

Send message

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


Square.draw(100, 100) 

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


Демо.

Параметры методов можно расширить, но нельзя сузить.

А кто может пояснить почему так? Я вот когда детям показывал ООП, приводил простейший пример:
Есть класс "Прямоугольник" с методом "Нарисуй". "Нарисуй" принимает два аргумента: ширину и высоту.
От его наследуется класс "Квадрат" который изменяет метод "Нарисуй" и принимает только один параметр (что логично).
Как подобное решается на PHP?

Утвердили план заседаний, на которых обсудят вопросы разработки принципов и стандартов для проведения встречь с целью определения наилучшей стратегии создания и утверждения дорожной карты для внедрения 5G

Vite and VitePress — Evan You — VueConf Toronto 2020: (Слайды)


Мне кажется это камень скорее в сторону дизайна.
Почему вашему пользователю нужно рассмотреть весь диалог, всю форму, чтобы понять что от него вообще хотят? Разве его предыдущие действия не привели его к этому окну? Если вы нажимаете на понятную кнопку "Подписаться" и попадаете в текстовое поле "Введите email" у вас не должно случаться конфуза. Другое дело, когда модалка выскакивает сама по себе, её внешний вид не расчитан на небольшие устройства, тогда да, всё что видит пользователь — одно текстовое поле. Но это не проблема юзабилити а следствие проблемы с дизайном, на мой взгляд.

Вы всё правильно делаете :) И в вашем примере, действительно, может использоваться ссылка. Но не все разработчики так хорошо понимают тонкости. Вот именно для тех кто не понимает разницы, или не думает о ней я и написал в столь категоричном ключе. Безусловно есть разные ситуации и исключения, но их понимание должно прийти с опытом.

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

Это будет "палевно" только при условии, что владелец аккаунта сможет поднять достаточный резонанс.

Если коротко — для автоматизеции и уменьшения ручной работы.


Если чуть подробнее:


  1. Источником всех типов являются .widl файлы. Они автоматически вытягиваются из браузера Edge. То есть, все веб интерфейсы пишутся не вручную а берутся из того, что имплементировано в браузере. Вот, описание MessageEvent, например.
    Так можно быстро и легко отслеживать все изменения в спецификациях веб-платформы.
  2. Многие такие интерфейсы должны быть представлены в нескольких библиотеках. Чтобы не приходилось согласовывать описание одного и того же интерфейса в разных библиотеках он вынесен в отдельный файл, а уже оттуда записывается в нужные библиотеки.

А в формате JSON просто описаны дополнительные инструкции о том, как конвертировать widl в ts

Не совсем понял ваш вопрос

В моих проектах используется такой подход:


// globals.d.ts

interface TypedMessageEvent<T> extends MessageEvent {
    data: T;
}

interface TypedWorkerEventMap<T, E = T> extends AbstractWorkerEventMap {
    "message": TypedMessageEvent<T>;
    "messageerror": TypedMessageEvent<E>;
}

interface TypedWorker<Input, Output> extends Worker {

    postMessage(message: Input, transfer: Transferable[]): void;

    postMessage(message: Input, options?: PostMessageOptions): void;

    addEventListener<K extends keyof TypedWorkerEventMap<Output>>
    (type: K, listener: (this: TypedWorker<Input, Output>, ev: TypedWorkerEventMap<Output>[K]) => any, options?: boolean | AddEventListenerOptions): void;
}

Это позволяет описать как все входящие так и исходящие сообщения


type MessageStart = 'start';
type MessageStop = 'stop';
type MessageProgress = 'progress'

type MessageInput = MessageStart | MessageStop
type MessageOutput = MessageProgress

const w = new Worker() as TypedWorker<MessageInput, MessageOutput>

w.addEventListener('message', m => {
  m.data // 'start' | 'stop'
})

w.postMessage('some') // Type "some" is not assignable to type "MessageProgress"

Да, npm — это очень удобный инструмент. Но, я вижу некоторое недопонимание у сообщества. Хотя, не исключено, что ошибаюсь именно я.


Deno — это "переосмысление" Node. Именно Node. Не смешивайте с npm. Node — это среда исполнения, npm — менеджер пакетов и появился он примерно через пол года после первых выпусков Node. Сейчас они поставляются вместе из-за исторической необходимости. Ну, и вы сами видите реакцию сообщества на идею работы среды исполнения без комплектного менеджера пакетов.


Deno — именно прокачанная среда исполнения. Разница в том, что во времена создания модульной системы Node в языке не было ничего. А в Deno просто реализованы все современные возможности языка. Даже больше чем сейчас поддерживается в Node или в браузерах. Даже компиляторы по типу babel или typescript ограничены возможностями той среды в которой будет запускаться итоговый код.


Аналогия: использование функции require без необходимости предварительно вызывать установку пакета. Просто пишете название пакета, версию если нужно, или ссылку на другой источник. А резолвер модулей в Node сам найдет и кэширует необходимые пакеты. При таком раскладе, вам не нужен npm для установки или удаления пакетов.

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

Как обычно работаю я. Я просто пишу код. Когда использую какую-то функцию — моя IDE сама вставляет import. Если бы я работал с Deno, то этого было бы достаточно. Но работая с node, моя IDE должна ещё проверить установлен ли нужный пакет, и если нет — установить.


Я думаю, что большинство подобных вопросов — это дело привычки и отсутствия инструментов.

Deno ж и с .js спокойно работает, разве нет?:D

Я имел в виде существование линтера в целом. то о чем вы писали


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

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


А вот настроить эти ограничения каждый может так как нужно именно ему. Что гораздо гибче.

А я вот понимаю такой подход. Сделать гибкий язык который может работать как угодно и предоставить инструмент, чтобы каждая команда могла "донастроить" его для своих нужд. Мне больше нравится когда всё строго, когда имена файлов и структура директорий жестко регламентирована интерпретатором. Но, как ты не крути, это нужно не всегда и часто в разном виде.

Весь JavaScript так работает :)

Так, как бы, и встроенными инструкциями такое возможно
https://deno.land/manual/linking_to_external_code/integrity_checking


Создаст список всех зависимостей:


deno cache --lock=lock.json --lock-write src/entry.ts

Скачает все зависимости и проверит каждую по хэшу


deno cache -r --lock=lock.json src/entry.ts

Но проблема с динамическими импортами действительно есть.

Deno, как и Node, умеет создавать lock.json. В нем будет список ссылок и хэш. Если при восстановлении зависимостей, хэш измененного файла не будет соответствовать сохраненному — Deno выдаст ошибку "Subresource integrity check failed"
https://deno.land/manual/linking_to_external_code/integrity_checking

Information

Rating
Does not participate
Registered
Activity