Как стать автором
Обновить

В языке Go наконец-то появятся дженерики. Proposal принят

Время на прочтение 1 мин
Количество просмотров 9.8K
Программирование *Go *

Как сообщает телеграм-канал Cross Join, предложение по добавлению дженериков в Go наконец-то приняли.


Ссылка на сам документ здесь: type parameters.


type Stringer interface {
    String() string
}

type Plusser interface {
    Plus(string) string
}

func ConcatTo[S Stringer, P Plusser](s []S, p []P) []string {
    r := make([]string, len(s))
    for i, v := range s {
        r[i] = p[i].Plus(v.String())
    }
    return r
}
Читать дальше →
Всего голосов 26: ↑22 и ↓4 +18
Комментарии 58

Состоялся релиз языка программирования Go 1.18

Время на прочтение 1 мин
Количество просмотров 6.1K
Go *

Команда Go представила версию языка Go 1.18. Релиз включает в себя новые функции и улучшение производительности. Сами разработчики назвали обновление масштабным и заявили о том, что шли к этому с самого начала развития Go.

Читать далее
Всего голосов 11: ↑10 и ↓1 +9
Комментарии 5

Kafka, проблемы с драйвером PostgreSQL и (не)нужные дженерики. Golang-митап 27.04

Время на прочтение 1 мин
Количество просмотров 622
Блог компании СберМаркет Go *

Привет! 27 апреля в 18:00 по Москве приглашаем Golang-разработчиков на онлайн-митап. Будут доклады спикеров из СберМаркета, Ozon и Selectel на три очень болезненные темы.

Читать далее
Всего голосов 5: ↑5 и ↓0 +5
Комментарии 0

Необычное поведение generics

Время на прочтение 1 мин
Количество просмотров 5.6K
Java *
Случайно обнаружил нетипичную проблему с параметризацией и наследованием в Java.
Сразу оговорюсь, что все это представляет только академический интерес. В реальной жизни так криво писать никто не будет. Но формально такого быть не должно:
Interface.java
public interface Interface {
    void test(Class<Object> clazz);
}

BaseClass.java
public abstract class BaseClass<T> implements Interface {
    abstract public void test(Class<Object> clazz);
}

MyClass.java
public class MyClass extends BaseClass {
    public void test(Class<Object> clazz) {
    }
}
Компилятор выдает ошибку:
MyClass is not abstract and does not override abstract method test(java.lang.Class)
Всего голосов 37: ↑28 и ↓9 +19
Комментарии 39

Обобщенные интерфейсы в Delphi

Время на прочтение 3 мин
Количество просмотров 6.6K
Delphi *
Перевод
Первод стаьи от Malcolm Groves, «Generic Interfaces in Delphi».

imageБольшинство примеров использования дженериков в Delphi используют класс с дженерик-типом. Однако, работая над своим проектом, я решил, что мне нужен интерфейс с дженерик-типом.

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

Однако, я понятия не имел, могу ли я определить дженерик интерфейс, не говоря уже о реализации. Даже если предположить, что я могу сделать это, сможет ли Delphi выбрать правильный метод Receive для вызова? Есть только один способ узнать…
Читать дальше →
Всего голосов 10: ↑7 и ↓3 +4
Комментарии 0

Работа с переменными класса класса-наследника в базовом классе

Время на прочтение 3 мин
Количество просмотров 2.3K
Delphi *
Recovery mode
Из песочницы
Зачем это нужно?

С такой необходимостью я столкнулся, например, при сериализации классов. Было желание вынести весь рутинный код и информацию о классах-наследниках в базовый класс. Ну, лень ведь, прописывать одно и то же для каждого дочернего класса. Вот и призадумался, может сюда дженерики прикрутить.
И прикрутил
Всего голосов 18: ↑3 и ↓15 -12
Комментарии 4

Метод Гаусса на Java

Время на прочтение 5 мин
Количество просмотров 45K
Java *Математика *
Из песочницы
Статья посвящена реализации алгоритма Гаусса для решения системы линейных алгебраических уравнений на языке Java.

Теоретические сведения


Рассмотрим математическую теорию. Система линейных уравнений может иметь одно решение, бесконечно много решений или же быть несовместной (не иметь решений). Не все методы решения СЛАУ могут справится с вторым случаем, когда система имеет бесконечно много решений. Например, метод Крамера и матричный метод не применимы, но метод Гаусса вполне можно использовать.

Алгоритм можно условно разделить на два этапа:

  • Прямой ход
  • Обратный ход

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

Реализация


Начнем с постановки задачи:

  • нам нужно создать программу, реализующую систему линейных уравнений в виде некоторой структуры данных, используя приемы обобщенного программирования. Система должна содержать коэффициенты производного типа от класса Number (т.е. Float, Integer, Double и т.д.)
  • Запрограммировать алгоритм, который получив на вход структуру данных системы образует нули ниже главной диагонали
Читать дальше →
Всего голосов 17: ↑12 и ↓5 +7
Комментарии 6

Пора ли переходить на Swift?

Время на прочтение 5 мин
Количество просмотров 21K
Блог компании JUG Ru Group Программирование *Разработка под iOS *Разработка мобильных приложений *Swift *
Сегмент мобильной разработки регулярно предлагает участникам рынка новый инструментарий. О том, стоит ли использовать такую новую для программирования под iOS концепцию, как дженерики, а заодно о том, пора ли переходить на Swift, мы поговорили с Максимом Соколовым, специалистом по мобильной разработке компании Avito.


— Расскажите, пожалуйста, в двух словах о себе и своем опыте работы со Swift.

— На текущий момент я работаю в компании Avito разработчиком мобильных приложений для iOS. В мобильной разработке я около 5 лет, а до нее занимался различными направлениями, в частности, веб-сайтами, бэкэндом и desktop-приложениями.
Swift мы начали использовать в Avito больше полугода назад, когда вышла вторая версия языка, накопилась обратная связь от сообщества разработчиков. Ранее в работе мы использовали Objective-C, но теперь весь новый код пишем на Swift.

— Некоторые разработчики отзываются о Swift, как о весьма «сыром» языке, не подходящим пока для крупных проектов. Можете ли вы подтвердить или опровергнуть это мнение?

— У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код. Упомянутые недостатки нельзя назвать причиной отказа от разработки больших проектов на Swift. Сталкиваясь с проблемами — мы находили решение. И мы уже отправили в продакшн достаточно объемный проект, написанный на этом языке.
Читать дальше →
Всего голосов 33: ↑17 и ↓16 +1
Комментарии 20

Применяем дженерики в RAD Studio Delphi. Создаем библиотеку сортировки списков однотипных объектов

Время на прочтение 6 мин
Количество просмотров 15K
Программирование *Delphi *
Сегодня будем создавать в RAD Studio Delphi библиотеку классов, реализующих сортировку списков однотипных объектов.

Цель задачи


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

  • оперировать с объектами списка;
  • применять различные правила сравнения объектов;
  • применять различные алгоритмы сортировки объектов.

На выходе должна получиться библиотека классов, которая позволяет:

  • прикладному разработчику сортировать любой из 100 объектов любым из 100 методов сортировки;
  • дорабатывать и поддерживать новые алгоритмы или новые типы объектов в течении одного дня силами одного специалиста.
Читать дальше →
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 4

О дженериках в PHP и о том, зачем они нам нужны

Время на прочтение 6 мин
Количество просмотров 32K
Блог компании VK PHP *Программирование *Анализ и проектирование систем *Проектирование и рефакторинг *
Перевод


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

Читать дальше →
Всего голосов 53: ↑44 и ↓9 +35
Комментарии 89

Пользовательские типы в PHP

Время на прочтение 5 мин
Количество просмотров 20K
PHP *
Recovery mode
В отношении данных, которые программа получает извне, принято следовать правилу trustno1. Это справедливо не только в отношении данных, получаемых непосредственно от пользователя, но и в отношении данных, которые передаёт в подпрограммы клиентский код.

PHP 7 оснащён расширенной системой контроля типов аргументов, включающей не только классы, но и скаляры. Однако в том, что касается сложных структур данных, ничего не изменилось — для них существует единственный тип array, который в PHP может содержать всё, что угодно.

Я надеюсь, что новые версии PHP исправят ситуацию. А на данный момент я хочу поделиться с сообществом некоторыми своими наработками в этой области:

image

alexeymaximov/fulltype
alexeymaximov/containum

Читать дальше →
Всего голосов 29: ↑27 и ↓2 +25
Комментарии 54

Дженерики и конвертеры в Nim

Время на прочтение 3 мин
Количество просмотров 5.3K
Программирование *
Из песочницы
Логотип языка Nim

Всем привет! В данной статье я постараюсь рассказать, что такое generic процедуры и converter’ы в Nim (и показать примеры их использования)

Что такое Nim? Nim – компилируемый (в C, C++, Objective C и JS) высокоуровневый язык программирования со сборщиком мусора, имеющий три основных цели (в порядке приоритета): производительность, выразительность, элегантность. Официальный сайт языка, репозиторий на GitHub.
Также в Nim достаточно развито метапрограммирование (дженерики, шаблоны, макросы).
Читать дальше →
Всего голосов 20: ↑19 и ↓1 +18
Комментарии 7

Чего из Rust мне не хватает в C

Время на прочтение 7 мин
Количество просмотров 22K
Программирование *C *Rust *
Перевод
Об авторе. Федерико Мена-Кинтеро — мексиканский программист, один из основателей проекта GNOME.

Librsvg достиг переломного момента: внезапно выясняется, что легче портировать некоторые основные части из C на Rust, чем просто добавить аксессоры. Кроме того, всё больше «мяса» библиотеки сейчас написано на Rust.

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

Элегия C


Я влюбился в C около 24 лет назад. Выучил азы по второму изданию “The C Programming Language by K&R” в переводе на испанский. До этого я использовал достаточно низкоуровневый Turbo Pascal, с указателями и ручным распределением памяти, так что C казался приятным и придающим сил.

K&R — отличная книга для выработки стиля и лаконичности. Эта маленькая книжка даже научит вас реализовать простой malloc()/free(), что поистине просветляет. Даже низкоуровневые конструкции можно вставлять в самом языке!

В последующие годы я хорошо освоил C. Это небольшой язык с маленькой стандартной библиотекой. Вероятно, идеальный язык для реализации ядра Unix на 20 000 строк кода или около того.
Читать дальше →
Всего голосов 80: ↑76 и ↓4 +72
Комментарии 181

PHP дженерики уже сегодня (ну, почти)

Время на прочтение 7 мин
Количество просмотров 20K
PHP *Программирование *
Перевод

Если спросить PHP-разработчиков, какую возможность они хотят увидеть в PHP, большинство назовет дженерики.


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


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

Читать дальше →
Всего голосов 29: ↑23 и ↓6 +17
Комментарии 28

Зачем нужны дженерики в Go?

Время на прочтение 14 мин
Количество просмотров 35K
Блог компании VK Высокая производительность *Программирование *Анализ и проектирование систем *Go *
Перевод

Эта статья о том, что будет означать добавление дженериков в Go, и почему я считаю, что нам это следует сделать. Также я коснусь возможного изменения архитектуры языка ради добавления дженериков.

Go вышел 10 ноября 2009-го. Меньше чем через сутки появился первый комментарий про дженерики. В нём также упомянуты исключения, которые мы добавили в язык в виде паники и восстановления (panic and recover) в начале 2010-го.

За три года наблюдений отсутствие дженериков всегда входило список трёх главных проблем, которые необходимо исправить в языке.
Читать дальше →
Всего голосов 78: ↑71 и ↓7 +64
Комментарии 250

Заменить Object на var: что может пойти не так?

Время на прочтение 6 мин
Количество просмотров 10K
Программирование *Java *

Недавно я столкнулся с ситуацией, что замена Object на var в программе на Java 10 приводит к исключению в процессе выполнения. Мне стало интересно, много ли разных способов добиться такого эффекта, и я обратился с этим вопросом к сообществу:



Оказалось, что добиться эффекта можно разными способами. Хотя все они несильно сложные, но на примере такой задачки интересно вспомнить о разных тонкостях языка. Давайте посмотрим, какие удалось найти способы.

Всего голосов 44: ↑43 и ↓1 +42
Комментарии 17

Почему Discord переходит с Go на Rust

Время на прочтение 7 мин
Количество просмотров 76K
Высокая производительность *Разработка веб-сайтов *Проектирование и рефакторинг *Rust *
Перевод


Rust становится первоклассным языком в самых разных областях. Мы в Discord успешно используем его и на серверной, и на клиентской стороне. Например, на стороне клиента в конвейере кодирования видео для Go Live, а на стороне сервера для функций Elixir NIF (Native Implemented Functions).

Недавно мы резко улучшили производительность одной службы, переписав её с Go на Rust. В этой статье объясним, почему для нас имело смысл переписать службу, как мы это сделали и насколько повысилась производительность.
Читать дальше →
Всего голосов 174: ↑170 и ↓4 +166
Комментарии 307

Продвинутые дженерики в TypeScript. Доклад Яндекса

Время на прочтение 14 мин
Количество просмотров 13K
Блог компании Яндекс JavaScript *Промышленное программирование *TypeScript *
Дженерики, или параметризованные типы, позволяют писать более гибкие функции и интерфейсы. Чтобы зайти дальше, чем параметризация одним типом, нужно понять лишь несколько общих принципов составления дженериков — и TypeScript раскроется перед вами, как шкатулка с секретом. AlexandrNikolaichev объяснил, как не бояться вкладывать дженерики друг в друга и использовать автоматический вывод типов в ваших проектах.

— Всем привет, меня зовут Александр Николаичев. Я работаю в Yandex.Cloud фронтенд-разработчиком, занимаюсь внутренней инфраструктурой Яндекса. Сегодня расскажу об очень полезной вещи, без которой сложно представить современное приложение, особенно большого масштаба.
Читать дальше →
Всего голосов 9: ↑7 и ↓2 +5
Комментарии 2

PhpStorm 2021.2: дженерики, перечисления, array shapes, новые инспекции и рефакторинги

Время на прочтение 11 мин
Количество просмотров 11K
Блог компании JetBrains Разработка веб-сайтов *PHP *


Вышел второй мажорный релиз PhpStorm в этом году. Под катом подробный разбор всех изменений и новых возможностей с кучей гифок.
Всего голосов 36: ↑36 и ↓0 +36
Комментарии 35

Реакт Компоненты-дженерики

Время на прочтение 5 мин
Количество просмотров 9.3K
JavaScript *ReactJS *TypeScript *
Из песочницы
✏️ Технотекст 2021

Давайте на секундочку представим, что будет если объединить React-компоненты и дженерики...

Читать далее
Всего голосов 4: ↑4 и ↓0 +4
Комментарии 2
1