Hacker News Digest

Тег: #composition

Постов: 3

Be careful with Go struct embedding (mattjhall.co.uk)

Встраивание структур в Go позволяет обращаться к полям вложенных структур напрямую, но может приводить к неожиданным конфликтам имён. Например, если две вложенные структуры содержат поле с одинаковым именем, компилятор не выдаст ошибку, а выберет поле из наименее вложенной структуры — в примере opts.URL вернёт "abc.com", хотя ожидалась неоднозначность.

Это поведение опасно, так как маскирует потенциальные ошибки проектирования: код компилируется, но логика может работать некорректно. Конфликт имён при встраивании не вызывает паники, а разрешается неявно, что усложняет отладку. На практике такие ситуации лучше избегать, явно именуя вложенные структуры или переименовывая поля.

by mattjhall • 21 сентября 2025 г. в 23:16 • 105 points

ОригиналHN

#go#struct#programming#design#composition

Комментарии (72)

  • Критика структуры Go за разрешение конфликтов имён полей при вложении структур, что может приводить к неочевидным ошибкам.
  • Предложения считать такие случаи ошибкой компиляции или, как минимум, выдавать предупреждения через линтеры.
  • Отмечается, что поведение соответствует спецификации (выбирается поле с наименьшей глубиной вложения), но это противоречит интуиции некоторых разработчиков.
  • Приводятся аргументы за и против использования вложения структур: полезно для композиции методов, но опасно для данных.
  • Обсуждается историческое происхождение фичи из Plan 9 C и её потенциальная полезность в ограниченных сценариях.

The value of bringing a telephoto lens (avidandrew.com)

Телеобъектив: зачем тащить тяжесть
Большой и тяжёлый, но даёт три вещи, которых широкий не сделает:

  1. Убирает мусор
    Широкий захватывает здания, провода, туристов. Телевик вырезает лишнее, оставляя горы и облака в чистом виде.

  2. Сжимает планы
    Отойди и приблизь: озеро, скамейка с людьми и вершины сольются в одну компактную сцену. Следи за гиперфокальным расстоянием, чтобы всё было резко.
    В darktable маску гор можно накидать грубо, а потом «feathering radius» и «mask contrast» подтянут края автоматически.

  3. Изолирует, как глаз
    На огромном озере широкий покажет пустоту. Телевик выцепляет одинокую лодку — и вот уже есть сюжет.
    Убрать дымку: модуль haze removal, потом color balance rgb → вибрация, контраст, насыщение теней и средних тонов. Воду приглушить contrast equalizer с градиентной маской по каналам L и h.

Итог: весит много, но экономит кадры и время в обработке.

by freediver • 09 сентября 2025 г. в 16:08 • 100 points

ОригиналHN

#photography#telephoto-lens#darktable#haze-removal#color-balance#contrast-equalizer#micro-4-3#rx-100#composition

Комментарии (101)

  • Телеобъективы помогают выделить детали и «сжать» планы, делая кадры заметнее на фоне широкоугольного потока.
  • Многие отмечают, что телефоны всё ещё слабы в теле-диапазоне, поэтому «настоящий» зум даёт уникальный вид.
  • Компактные системы (Micro 4/3, RX-100) позволяют носить длинный фокус без тяжёлого рюкзака, сохраняя мотивацию снимать.
  • Узкий кадр требует точной композиции: ищете «интересную точку» и строите вокруг неё, иначе получится скучный «снимок про вещь, а не о вещах».
  • Скептики напоминают: эффект «сжатия» создаётся не самой оптикой, а большим расстоянием до сцены; теле просто заставляет вас отойти.
  • Независимо от техники, главное — взять камеру и снимать: «f/8 and be there»; иначе дорогой телеобъектив будет пылиться в углу.

The key to getting MVC correct is understanding what models are (stlab.cc) 💬 Длинная дискуссия

Как 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 без изменения кода.

by csb6 • 07 сентября 2025 г. в 01:26 • 176 points

ОригиналHN

#mvc#smalltalk#controller#model#view#observer#ios#reactive#rad#composition

Комментарии (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 и отсутствия языковой поддержки композиции.