Be careful with Go struct embedding
Встраивание структур в Go позволяет обращаться к полям вложенных структур напрямую, но может приводить к неожиданным конфликтам имён. Например, если две вложенные структуры содержат поле с одинаковым именем, компилятор не выдаст ошибку, а выберет поле из наименее вложенной структуры — в примере opts.URL вернёт "abc.com", хотя ожидалась неоднозначность.
Это поведение опасно, так как маскирует потенциальные ошибки проектирования: код компилируется, но логика может работать некорректно. Конфликт имён при встраивании не вызывает паники, а разрешается неявно, что усложняет отладку. На практике такие ситуации лучше избегать, явно именуя вложенные структуры или переименовывая поля.
Комментарии (72)
- Критика структуры Go за разрешение конфликтов имён полей при вложении структур, что может приводить к неочевидным ошибкам.
- Предложения считать такие случаи ошибкой компиляции или, как минимум, выдавать предупреждения через линтеры.
- Отмечается, что поведение соответствует спецификации (выбирается поле с наименьшей глубиной вложения), но это противоречит интуиции некоторых разработчиков.
- Приводятся аргументы за и против использования вложения структур: полезно для композиции методов, но опасно для данных.
- Обсуждается историческое происхождение фичи из Plan 9 C и её потенциальная полезность в ограниченных сценариях.
The value of bringing a telephoto lens
Телеобъектив: зачем тащить тяжесть
Большой и тяжёлый, но даёт три вещи, которых широкий не сделает:
-
Убирает мусор
Широкий захватывает здания, провода, туристов. Телевик вырезает лишнее, оставляя горы и облака в чистом виде. -
Сжимает планы
Отойди и приблизь: озеро, скамейка с людьми и вершины сольются в одну компактную сцену. Следи за гиперфокальным расстоянием, чтобы всё было резко.
В darktable маску гор можно накидать грубо, а потом «feathering radius» и «mask contrast» подтянут края автоматически. -
Изолирует, как глаз
На огромном озере широкий покажет пустоту. Телевик выцепляет одинокую лодку — и вот уже есть сюжет.
Убрать дымку: модуль haze removal, потом color balance rgb → вибрация, контраст, насыщение теней и средних тонов. Воду приглушить contrast equalizer с градиентной маской по каналам L и h.
Итог: весит много, но экономит кадры и время в обработке.
Комментарии (101)
- Телеобъективы помогают выделить детали и «сжать» планы, делая кадры заметнее на фоне широкоугольного потока.
- Многие отмечают, что телефоны всё ещё слабы в теле-диапазоне, поэтому «настоящий» зум даёт уникальный вид.
- Компактные системы (Micro 4/3, RX-100) позволяют носить длинный фокус без тяжёлого рюкзака, сохраняя мотивацию снимать.
- Узкий кадр требует точной композиции: ищете «интересную точку» и строите вокруг неё, иначе получится скучный «снимок про вещь, а не о вещах».
- Скептики напоминают: эффект «сжатия» создаётся не самой оптикой, а большим расстоянием до сцены; теле просто заставляет вас отойти.
- Независимо от техники, главное — взять камеру и снимать: «f/8 and be there»; иначе дорогой телеобъектив будет пылиться в углу.
The key to getting MVC correct is understanding what models are 💬 Длинная дискуссия
Как MVC стало таким бардаком
Классическое Smalltalk-MVC:
- Model — данные, ничего не знает об UI.
- View — рисует Model, подписывается на её изменения.
- Controller — переводит клики/клавиши в команды Model.
Связь Model→View только через наблюдение (observer), поэтому Model переиспользуема.
Apple (и большинство фреймворков) всё перепутали:
- View и Controller слили в «View-Controller» — толстый монстр, который одновременно держит UI-элементы и кучу логики.
- Controller превратился в мусорный бак кода, «непереиспользуемый — но это нормально».
- Model зачастую делают пассивной структурой, а состояние хранят в самом виджете (чекбокс знает своё значение).
Итог: вместо «Model как источник истины» получаем размазанное состояние по View-Controller’ам, гонки данных и невозможность тестировать.
Почему случилось: в C/Pascal сделать observable-Model было больно, поэтому в Xerox Lisa пожертвовали чистотой ради скорости. За ними потянулись все.
Как надо:
Model — любой observable-объект (даже bool в обёртке). View подписывается и рисует текущее значение; никогда не спрашивает «каков чекбокс?» — он знает только Model. Controller лишь говорит Model «переключись». Можно цеплять сколько угодно View к одной Model без изменения кода.
Комментарии (158)
- MVC — «религия без евангелия»: все уверены, что знают, что такое Model и View, но Controller — у каждого свой.
- Исходные определения настолько абстрактны, что под MVC подгоняют любую структуру из трёх классов; реальные кодовые базы показывают 1:1 связь V-C, что уничтожает пользу разделения.
- Контроллер быстро превращается в «всё, что не влезло в M или V», из-за чего страдает тестируемость и масштабируемость; 15 лет рефакторинга iOS-проектов подтверждают: 100 % проблем — в недостаточной проработке Model.
- RAD-фреймворки и визуальные редакторы ускорили искажение: код-behind стал контроллером, а «настоящий» MVC остался только в Smalltalk-историях.
- Практический выход: оставить MV, убрать лишний C или превратить его в тонкий «GluePuppy», который просто связывает наблюдаемую Model с реактивной View; всё остальное — следствие Expression Problem и отсутствия языковой поддержки композиции.