Все потоки
Поиск
Написать публикацию
Обновить
1031.71

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга

Внедрили себе gitlint

В один из проектов внедрили себе gitlint и уже несколько месяцев полноценно им пользуемся. По отзывам разработчиков: кому-то понравилось, что теперь коммиты нужно писать более дисциплинированно, кто-то и так их качественно писал, поэтому и не заметил разницы. Кто-то, конечно, воняет до сих пор, но на них не отвлекаемся :)

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

За вдохновением по правилам написания коммитов загляните сюда.

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

Вдогонку посмотрите еще на comimitizen.

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

DevFM

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Как джуну вырасти до мидла, а мидлу — почувствовать уверенность

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

Если вы джун или уже работаете на позиции мидла, но не чувствуете уверенности в своих знаниях, — держите подборку курсов, которые помогут закрыть пробелы и развить необходимые навыки. В каждом курсе есть бесплатная вводная часть, чтобы проверить свои силы.

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

Мидл фронтенд-разработчик — вас ждёт работа с TypeScript, SSR, современными фреймворками и производительностью веб-приложений. Курс также охватывает CI/CD, архитектуру и паттерны проектирования.

Мидл Android‑разработчик — продвинутая разработка на Android с фокусом на Clean Architecture, Kotlin Coroutines, Jetpack Compose и Unit-тестирование. Подойдёт тем, кто хочет писать масштабируемые и поддерживаемые приложения.

Мидл Java‑разработчик — поможет освоить инструменты и технологии Java-разработчика: Spring, Hibernate, микросервисную архитектуру, Kafka и Kubernetes. Подойдёт желающим глубже разобраться в построении отказоустойчивых систем.

Мидл разработчик С++ — курс для разработчиков, желающих освоить продвинутые возможности C++: многопоточность, шаблонное программирование, оптимизацию под производительность и работу с низкоуровневыми механизмами ОС.

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

Приветствую.

Я пишу облегчённую версию SDL3, с поддержкой старых систем. Проект решил назвать SDL3Lite. Проект пишу на C++ 98, но наружу торчит совместимый С API. Я хочу реализовать базовый функционал, поэтому вполне реально довести проект до конца. Главная идея проекта это сохранить совместимость с оригинальным C API SDL3. В идеале это конечно на уровне бинарной совместимости. Код единожды написанный должен собираться без изменений для всех поддерживаемых систем.

Сейчас работает рендер на OpenGL 1.2, добавляю версию software для старых систем без поддержки аппаратного ускорения. Также планирую добавить и поддержку vulkan. В репе есть скриншоты с выводом графики.

На данный момент поддерживается windows 95 и выше, linux начиная с Debian 3.

Запуск примера под windows 95 в 16 цветов.
Запуск примера под windows 95 в 16 цветов.

В будущих версиях планирую добавить поддержу windows 3.1 и ms-dos.

Рад буду советам, критике и предложениям.

Теги:
Всего голосов 10: ↑10 и ↓0+13
Комментарии0

На картинке — код на JavaScript с ошибкой, который написал специально для Хабра руководитель группы разработки интерфейсов компании «Криптонит» Василий Беляев.

Кто увидел, где ошибка и как её можно решить — пишите в комментариях! А решение этой ошибки оставили под картинкой.

Где здесь ошибка?
Где здесь ошибка?

Если запустим этот код, то получим ошибку

Uncaught TypeError: this.clearHistory is not a function

Проблема находится на строчках 11-13 (на картинке)

this.timeout = setTimeout (function () {
        this.clearHistory();
    }, 0);

Когда мы вызываем setTimeout, то вызываем метод объекта window, и меняем область видимости с нашего конструктора на window ( window.setTimeout() ).

Именно по этой причине у нас метод clearHistory пытается вызываться у объекта window ( window.clearHistory() )

Как можно решить эту проблему?

Вариант 1

const MyItem = function () {
    this.clearStorage = function () {
        console.log ('Очищаем хранилища...');
    };
    this.clearHistory = function () {
        console.log ('Очищаем историю...');
    };
};
MyItem.prototype.refresh = function () {
    this.clearStorage();
    this.timeout = setTimeout (() => {
        this.clearHistory();
    }, 0);
};
const mуItem = new MyItem();
mуItem.refresh();

Заменить анонимную функцию на стрелочную функцию. У них отсутствует свой контекст, и они работают в контексте области видимости, включающий их самих.

Вариант 2

const MyItem = function () {
    this.clearStorage = function () {
        console.log ('Очищаем хранилища...');
    };
    this.clearHistory = function () {
        console.log ('Очищаем историю...');
    };
};
MyItem.prototype.refresh = function () {
    this.clearStorage();
    this.timeout = setTimeout (
        this.clearHistory.bind(this), 0
    );
};
const mуItem = new MyItem();
mуItem.refresh();

Явно передать контекст через метод .bind()

Вариант 3

const MyItem = function () {
    this.clearStorage = function () {
        console.log ('Очищаем хранилища...');
    };
    this.clearHistory = function () {
        console.log ('Очищаем историю...');
    };
};
MyItem.prototype.refresh = function () {
    this.clearStorage();
    const self = this;
    this.timeout = setTimeout (() => {
        self.clearHistory();
    }, 0);
};
const mуItem = new MyItem();
mуItem.refresh();

Выносим контекст в отдельную переменную и работаем с ней. Этот вариант подойдет для поддержки старых браузеров.

А как бы вы решили эту ошибку?

Теги:
Всего голосов 6: ↑3 и ↓3+2
Комментарии5

Внедрили себе gitlint

В один из проектов внедрили себе gitlint и уже несколько месяцев полноценно им пользуемся. По отзывам разработчиков: кому-то понравилось, что теперь коммиты нужно писать более дисциплинированно, кто-то и так их качественно писал, поэтому и не заметил разницы. Кто-то, конечно, воняет до сих пор, но на них не отвлекаемся :)

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

За вдохновением по правилам написания коммитов загляните сюда.

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

Вдогонку посмотрите еще на comimitizen.

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

DevFM

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии3

Представлен онлайн-ресурс для изучения языков программирования Coddy. Внутри полная геймификация: обучение через игру, квесты и допы за активность. За каждый урок ваш персонаж двигается по карте к финишу. Ежедневные испытания дают дополнительный опыт, а за стрик капают «огоньки». Опыт можно тратить на бустеры, включая премиум подписку на 2 недели. Темы выбираете сами — можно сменить в любой момент.

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

Присоединяйтесь к обновленной реферальной программе 💰

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

Кому подойдет:

  • Разработчикам — можете предлагать облачные услуги как часть своих пакетов;

  • DevOps-инженерам — рекомендуйте сервисы для размещения решений;

  • Веб-студиям — советуйте облако для размещения сайтов;

  • Системным интеграторам — интегрируйте облачные решения в свои проекты.

Как принять участие:

Регистрируйтесь в программе до 31 мая и приводите новых пользователей в течение трех месяцев. Участвовать могут самозанятые, ИП и юридические лица. 

А еще приведенные пользователи получат до 26 000 бонусов — их хватит, чтобы запустить проект, протестировать гипотезы или проверить интересующее решение на практике.

👉 Присоединиться

Теги:
Рейтинг0
Комментарии0

Знакомьтесь с программой и регистрируйтесь на GoCloud 2025 ☁️

Делимся с вами программой предстоящей масштабной конференции про облака и AI, которая состоится 10 апреля GoCloud 2025.

10:00 – 11:00 Регистрация

11:00 – 12:00 Открытие конференции

12:20 – 18:00 Доклады. Три трека

  • Инфраструктура и сервисы: K8s, Bare Metal, платформа данных и другие сервисы Cloud.ru Evolution для ваших задач в облаке. Покажем новые и популярные инструменты, а также возможности личного кабинета. Все, чтобы развернуться по максимуму.

  • AI & ML: загляните в будущее искусственного интеллекта. Мы расскажем об AI-инструментах, поделимся опытом и анонсируем продукты, меняющие индустрию. Узнайте, как мы работаем с сообществом и какие возможности открываются для вас.

  • Сценарии работы в облаке: не только доклады, но и дискуссии с лидерами рынка, которые уже в облаке. Будем обсуждать популярные сценарии, гибридные решения, GenAI, миграцию в облако, вопросы безопасности, а также кейсы наших клиентов.

18:00 – 20:00 Afterparty и нетворкинг

Для участия подключайтесь к онлайн-трансляции (ссылка придет зарегистрированным участникам в письме) или приходите в Цифровое деловое пространство (ЦДП) в Москве.

🔎 Смотреть темы докладов и зарегистрироваться

А пока можно почитать, как проходили предыдущие конференции Cloud.ru:

Теги:
Рейтинг0
Комментарии0

На ресурсе OverAPI собраны все шпаргалки для разработчиков по популярным языкам программирования и технологиям. Информация там постоянно обновляется. Можно нажать на любую команду и узнать о ней всё. Ресурс бесплатный и без регистрации.

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

Поздравляем с 0x8 марта девушек в IT!

В этом году мы решили не просто на словах поздравить девушек с праздником. Мы сделали видео с девушками и о девушках в IT. На то есть несколько причин:

  • Мы хотим сказать: коллеги, мы вам благодарны за ваш труд! Мы гордимся вами!

  • Мы хотим показать вам реальных людей из разных сфер IT, а не просто цифры в статистике.

  • Надеемся, примеры участниц покажут, что IT — это не для избранных. Здесь есть место каждой, если ей интересно и она этого захочет.

Смотрите видео по ссылкам:

Вдохновляйтесь, делитесь своими историями и отправляйте своим друзьям, коллегам, знакомым и всем, кто имеет отношение к IT!

А мы желаем всем айтишницам счастливого праздника, безопасности и простого человеческого счастья!

Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии1

Приглашаем на первый Cloud․ru Tech Lab: Golang — митап для Go-разработчиков и технических лидеров 🎙️

📅 Дата: 13 марта, 19:00
📍 Место: Москва, Большая Почтовая улица, 40с7, Гоэлро Лофт

В программе четыре доклада от разработчиков Cloud․ru и приглашенного гостя. А еще — нетворкинг и afterparty с диджеем, музыкой и ужином.

Темы докладов:

  • Как устроена Go-разработка в Cloud․ru — Александр Шакмаев и Андрей Рацеров, технические лидеры;

  • Балансировка gRPC в Kubernetes — Михаил Абраш, старший Go-разработчик;

  • Как мы бутстрапим пользовательское окружение с Go, Temporal и Kubernetes — Евгений Третьяков, ведущий Go-разработчик;

  • Осторожно unsafe! Практические примеры и ошибки использования — Владимир Балун, основатель balun․courses.

👉 Зарегистрироваться

А еще заглядывайте в наши статьи и делитесь размышлениями в комментариях:

Теги:
Рейтинг0
Комментарии0

Хочу поделиться своим максимально ненужным проектом на Python, под названием flexpasm.

Это билдер кода для FASM под Linux. Работает ограниченно, но вроде-бы работает.

Проект, лично для меня, интересный.

Установить эту библиотеку можно через PyPi:

from flexpasm import ASMProgram
from flexpasm.constants import LinuxInterrupts
from flexpasm.instructions.registers import get_registers
from flexpasm.instructions.segments import Label
from flexpasm.mnemonics import IntMnemonic, MovMnemonic, XorMnemonic
from flexpasm.settings import Settings


def main():
    settings = Settings(
        title="Example ASM Program",
        author="alexeev-prog",
        filename="example.asm",
        mode="64",
    )
    asmprogram = ASMProgram(settings, __name__)
    regs = get_registers(settings.mode)

    start_lbl = Label("start")

    start_lbl.add_instruction(MovMnemonic(regs.AX, 4))
    start_lbl.add_instruction(MovMnemonic(regs.CX, "message"))
    start_lbl.add_instruction(MovMnemonic(regs.DX, "message_size"))
    start_lbl.add_instruction(IntMnemonic(LinuxInterrupts.SYSCALL))
    start_lbl.add_instruction(MovMnemonic(regs.AX, 1))
    start_lbl.add_instruction(XorMnemonic(regs.BX, regs.BX))
    start_lbl.add_instruction(IntMnemonic(LinuxInterrupts.SYSCALL))

    asmprogram.add_label(start_lbl)
    asmprogram.main_rws.add_string("message", "Hello, World!")

    asmprogram.save_code()
    # asmprogram.restore_backup()


if __name__ == "__main__":
    main()
$ fasm example.asm example
$ ld example -o example
$ ./example

Hello, World!

А сам код генерируется такой:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Author: alexeev-prog                                                                                               ;;
;; Example ASM Program                                                                                                ;;
;; Program generated by FLEXPASM (github.com/alexeev-pro/flexpasm)                                                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

format ELF64 executable 3;                      ; ELF64 EXECUTABLE
entry start                                     ; Set Start Entry


;; Segment readable executable in FASM is a directive for defining a section of code with readable and executable attributes.
segment readable executable

start:                                          ; Label start with 7 commands
    MOV RAX, 4                                      ; Loading 4 value into RAX register.
    MOV RCX, message                                ; Loading message value into RCX register.
    MOV RDX, message_size                           ; Loading message_size value into RDX register.
    INT 128                                         ; Call software interrupt 128: SYSCALL
    MOV RAX, 1                                      ; Loading 1 value into RAX register.
    MOV RBX, RBX                                    ; Exclusive OR operation RBX and RBX using XOR
    INT 128                                         ; Call software interrupt 128: SYSCALL


;; Segment readable writeable in FASM is a definition of a segment of program data codes, where the attributes readable (the contents of the segment can be read) and writeable (program commands can both read codes and change their values) are specified for it.
segment readable writeable

message db 'Hello, World!', 0xA                 ; Var message (string)
message_size = $-message                        ; Var message (string) length

Я его написал довольно давно, вот решил поделиться. Может кому-то пригодится. Если есть баги - создавайте PR и Issue, буду рад)

github.com/alexeev-prog/flexpasm

Теги:
Всего голосов 5: ↑4 и ↓1+3
Комментарии0

Новый релиз языка Zig 0.14.0

Github Release

Описания изменений версии

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

Важное изменение, которое всё же я упомяну - появился свой backend для компилятора. То есть отказ от LLVM состоялся, но на данный момент только для Linux x86_64.

Теги:
Всего голосов 4: ↑3 и ↓1+4
Комментарии0

Ближайшие события

SRE PUB #5 Судный день

Интерактивный стримкаст со зрителями 9 марта в 19:00

Максим будет писать веб интерфейс для вики (с выделением текста и возможностью отставлять инлайн комментарии) с помощью последней версии Copilot agent.
А все мы (включая вас) — токсично (и не очень) комментировать.

Посмотреть нас можно будет на следующих платформах:
Youtube - https://www.youtube.com/@srepubstreamcast
Twitch - https://www.twitch.tv/srepubstreamcast
Telegram - https://t.me/sre_pub

Готовьте попкорн, напитки, хорошее настроение и колкие комментарии.

Пишите в календари: 9 марта, 19:00

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Исследование выявило ключевые тенденции в том, как open-source проекты работают с документацией:
✅ README-файлы появляются на ранних этапах жизни проекта.
✅ Руководства по внесению вкладов (CONTRIBUTING) добавляются позже, когда активность растёт.
✅ Документация в основном сосредоточена на использовании и внесении изменений, а не на развитии сообщества, несмотря на частые рекомендации уделять больше внимания именно этому аспекту.

Хотя развитие сообщества считается важным фактором устойчивости FLOSS-проектов, не все основатели сразу ставят эту цель. Более того, излишний упор на построение сообщества на ранних этапах может усложнить процесс и отпугнуть потенциальных участников.

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

https://arxiv.org/pdf/2502.18440

Теги:
Рейтинг0
Комментарии0

Шаблон записи о принятии архитектурного решения

# Идентификатор и заговолок

Утверждение о принятом решении.

# Статус

Черновик\Утверждено\Заменено на ADR-XXX

# Контекст

Почему решение необходимо. Предположения, ограничения, мотиваторы принятия решения.

# Критерий оценки

Какие приоритеты в принятии решения? Какие из параметров и характеристик системы рассматриваются или используются в принятии этого решения. Какие мотиваторы и ограничения использовались при принятии решения?

# Доступные варианты

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

# Решение

Сделанный выбор и аргументация в его пользу.

# Последствия

Положительные и отрицательные последствия принятого решения.

# Консультации

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

Теги:
Рейтинг0
Комментарии0

Представлен локальный ИИ-ассистент DeepSeek Code Companion для разработчиков на базе DeepSeek R1. Для работы с ним не нужен даже API. Пишет код на уровне сеньора. Во время компиляции помогает в отладке и исправлении багов. Даёт рекомендации по архитектуре и масштабированию. На выбор есть две модели: для быстрых ответов и для более сложных задач.

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии5

Из серии "мелких удивлений", почему так всё странно:
Когда появилась двоичная плавающая точка, естественно было бы ожидать, что сразу появится и вариант текстового ввода-вывода в двоичном виде (возможно, свёрнутого до восьмеричного или шестнадцатиричного), который даёт:
1) точность передачи значения;
2) избавление от сложного и дорогого кода преобразования путём умножения и деления (который ещё долго был неточным, а для точного требуется многословная арифметика - для double это 1000+ бит в предельном случае, а ещё база констант).

Пример: "0x1.921fb54442d18p+1" (число π в double).

Тем не менее, в Fortran этого нет до сих пор, насколько я знаю - а там я ожидал бы в первую очередь. В C появилось в C99 ("%a" в printf, scanf). Аналогичные форматные методы ещё в десятке актуальных языков (Go, Lua, Matlab, OCaml, Perl, PHP, R, Ruby, Rust, Swift, Zig, спасибо ИИ за поиск). В C++ - режим iostream, с C++11 (std::hexfloat). В Python, Ada, Java, Julia, Haskell - нет форматного знака, есть отдельные методы (например, hex(), from_hex()). В некоторых других - требуются отдельные библиотеки, особенно странно про Javascript, где и целых-то нет, есть double на всё.

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

(Ну, и опробуем "посты". На статью это не тянет, а просто поговорить - почему бы и нет.)

Теги:
Всего голосов 4: ↑4 и ↓0+5
Комментарии17

🗓 23.02.1993 — Создан язык программирования Ruby [вехи_истории]

Японский программист Юкихиро Мацумото (Matz) начал разработку языка программирования Ruby, который позже стал одним из самых популярных скриптовых языков. Его цель заключалась в создании удобного, элегантного и продуктивного языка, который сочетал бы мощь Perl и объектно-ориентированный подход Smalltalk, но при этом был простым и интуитивно понятным.

🗓 23.02.1993 - Создан язык программирования Ruby
🗓 23.021993 — Создан язык программирования Ruby

Его популярность резко выросла в 2000-х благодаря веб-фреймворку Ruby on Rails, который упростил создание веб-приложений. Ruby ценится за лаконичный синтаксис, гибкость и философию минимального удивления (Principle of Least Surprise), что делает его любимым инструментом разработчиков.


📼 Мир IT не стоит на месте и постоянно развивается, а некоторые истории уже на канале:

1️⃣ История КРАХА Twitter. Как Илон Маск ЗАХВАТИЛ синюю птичку
YouTube | VkVideo

2️⃣ ВЕЛИКИЙ Китайский Файрвол! Как устроен КРУПНЕЙШИЙ блокировщик интернета в мире 
YouTube | VkVideo

3️⃣ Удивительная история Android! Вы этого НЕ ЗНАЛИ
YouTube | VkVideo

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

В начале года я опубликовал статью про гибридное кэширование.

Гибридное кэширование в ASP.NET Core
В .NET 9 появилась новая библиотека для кэширования — HybridCache . В статье расскажу, что это такое...
habr.com

Прошло уже больше месяца, а стабильная версия nuget-пакета Microsoft.Extensions.Caching.Hybrid так и не вышла.

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

Начну с последнего — каких изменений я не ожидаю

Изменение состава и сигнатур текущих методов. Если следить за выходом новых версий пакета Microsoft.Extensions.Caching.Hybrid, можно заметить, что методы объекта HybridCache не меняются уже давно. Из этого можно сделать вывод, что в стабильной версии мы увидим тоже самое, что наблюдаем сейчас.

Какие изменения я ожидаю увидеть

Удаление объекта из кэша по тегам. На момент написания статьи метод RemoveByTagAsync вообще не имел реализации. Сейчас в версии 9.2.0-preview.1.25105.6 он реализован и вполне себе работает, так что в релизную версию явно войдёт.

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

  await cache.GetOrCreateAsync(
    "someKey",
    async ct => await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag2", "tag3"],
    cancellationToken);

  await cache.GetOrCreateAsync(
    "someKey",
    async ct => await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag4"],
    cancellationToken);

Представим, что метод GetOrCreateAsync вызывается несколько раз с одним и тем же ключом, но разным набором тегов. Теги будут присвоены только при первом попадании объекта в кэш, то есть в момент его извлечения из хранилища. Когда проектируем приложение, не всегда заранее известно, в какой из вызовов GetOrCreateAsync объект будет извлекаться из кэша, а в какой — из хранилища. Оно и логично — метод специально создали так, чтобы мы не задумывались об этом. Соответственно, сейчас при вызове этого метода мы не можем определить, какой из наборов тегов ляжет в кэш.

И тут у меня два варианта развития событий: или логика поменяется и теги будут перезаписываться всегда — независимо от того, берётся объект из кэша или хранилища. Или при написании программы нужно будет следить, не передаём ли мы разные наборы тегов.

Теги:
Всего голосов 3: ↑2 и ↓1+3
Комментарии0

Вклад авторов