Обновить
6
0
Давид Шекунц@Dionid

Tech lead || Software Architect

Отправить сообщение

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

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

Среднестатистически я пытаюсь оцифровать затраты, которые несет бизнес (сколько стоит uptime, как много часов бэклога ушло на дебагинг системы, доработку самопала или оптимизацию взаимодействия с ним, сколько тратиться на инфру, что разработчики не могут использовать из-за самопала из-за чего новые фичи выходят медленнее) и какие фичи они долгосрочно хотят, прикидывая как новое решение поможет достичь этого, потом предоставляю эти цифры, со словами: "Вот эти деньги мы сможем сохранить и конвертировать в больше фич, если сделаем вот это" – и дальше уже то, насколько я был убедителен

Уверен ли каждый раз в своих словах? Нет, удивительно насколько часто это все субъективно, НО практика показывает, что с опытом начинаешь попадать все четче и четче и это опуртонистическое: "нас ждет светлое будущее" – может и не в такой степени, но сбывается

Важно рисковать, брать ответственность, показывать всем бенефиты, но готовиться к шторму

Да, в данной ситуации (1) код был разбросан необоснованно, (2) пост больше про еще одно преимущество складывать связанный код ближе друг к другу, ЕСЛИ такая возможность имеется, (3) я вернул все на места, потому что это прод код, который сделан так как сделан и на данный момент единообразие всей кодовой базы – более ценно для всех, чем модификация одного куска.

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

Да, крутой пример, спасибо! Лайкнул бы, но рейтинг хейтеры сожрали)
Наша ветка — прекрасный пример тому, что несмотря на приличное количество контрпримеров, основной текст (и тон) вашего поста остался без изменений.

Да, потому что это мой пост и мое мнение, а есть ваше мнение.

Я хочу, чтобы вы не пропагандировали идею, что что-то, называющееся «законом Деметры» на самом деле является сколько-нибудь объективным правилом, ведущим к хорошему коду.

Для вас нет, а мне и моим коллегам знание этого принципа полезно для принятия решения использовать или не использовать его в той или иной ситуации.

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

У вас есть позиция против LoD, ок, это ваша позиция.
Ну то есть ваша цель — она «получить побольше комментариев»?

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

А «правила» вообще существуют в определенных рамках.

Оно называет «Правило / Закон Деметры», вы хотите чтобы я перевел это как-то по-другому? Кажется, вы не заметили, что лично я использую в статье слово «принцип»
Правда же, совсем иначе звучит?

Согласен, но вы очень категоричны, мне нравится мое название, оно завлекает и заставляет людей написать почти 40 комментариев)

… а вмержить все равно не дадут, потому что правила.

Мы говорим про терминологию, а не устав процесса разработки компании, это абсолютно разные вещи. Это как соотносить «замок» на двери, и «замок» при вязке собак.

Поэтому, какое бы не было название у термина / паттерна, если его несоблюдение не мешает скомпилировать / воспроизвести программу с требующейся логикой это всегда «рекомендация». А если вы решили добавить его в устав, тогда становиться «правилом», но только в определенных рамках.
Случай с текстом не критический (хоть и влияет на восприятие), а вот случай с «обращением к локальной переменной» приведет к ошибке во время компиляции / исполнения кода.

Так вот, хоть и дословный перевод «Law of Demeter» получается «Правило / Закон Деметры», но, конечно же, на деле, это «рекомендация», потому что соблюдение / не соблюдение данного «правила» не повлияет на runtime или компиляцию кода.

Поэтому, какое бы не было название у термина / паттерна, если его несоблюдение не мешает скомпилировать / воспроизвести программу с требующейся логикой это всегда «рекомендация».
Мне не нравится неполнота правила.

Можете привести пример полноценного правила?

Неа. «Любой адекватный программист» понимает, что есть правила, а есть рекомендации, и одно от другого надо отличать.

А можете привести пример «правил», которые нарушать нельзя нигде и никогда?
С момента определения getter Comments вы можете скрыть любую внутреннюю связь / имплементацию.
Вам не нравится неполнота текста в описании правила на Википедии? Да, ребята ограничились описанием самого правила.

Любой адекватный программист понимает, что правила – это ориентир, а не неприкосновенная истина.

Ими можно пользоваться, а можно этого не делать. Выбор за каждым.
Переопределение getter – это один из приемов, который позволяет придерживаться LoD.

Просто не везде бывают getter (например в Golang в любом случае пришлось бы писать метод getComments)

repository.Active()

Это как-то слишком похоже на QueryBuider, поэтому я скорее за «repository.Where(ActiveSpecification())», но это лично моя вкусовщина.
И самое основное, что вам в нем не нравится?
Ну как-как. Раньше post.Comments (извините, я выше перепутал) возвращал все комментарии, станет возвращать только «активные». И все.

Через переопределение getter?

post.Where(ActiveSpecification())

А, вы в формате Active Record пишите, понял. Я использую Repository, чтобы больше сохранять чистоту Сущностей.
Мне кажется мы говорим о разных вещах, поэтому уточню: что в вашем понимании «LoD»? С терминологической точки зрения
А если нам не нужно об этом знать, то это будет спрятано в comment.Posts, и ничего снаружи трогать будет не надо.

Как именно будет спрятано?

А она ей и не является.

Вы выстаиваете цепочку методов от post, а спецификация должна существовать как отдельный класс с chain methods или как command.
LoD ничего не говорит про логику домена.

Я не говорил что LoD это говорит, наоборот, if бизнес-логика требует управлять вложенными сущностями -> можно использовать LoD

Агрегаты мне как раз очень нравятся

Это супер и они как раз являются отличными примером того, как LoD помогает структурировать код.
И опятьже ".Active()" это раскрытие подробностей, о которых внешнему коду может быть (зависит от бизнес-требований, о чем я писал выше) абсолютно не нужно знать.

posts.Comments.Active().OnlyByUser(...).Today()

Спецификация не должна быть частью сущности post, вот здесь есть хороший пример Specification blog.byndyu.ru/2014/07/command-and-query-responsibility.html
LoD стимулирует запихнуть весь API в один объект


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

Я думаю, что вам стоит почитать про Агрегаты из DDD, скорее всего, вам они тоже не понравятся, они тоже направлены на то, чтобы управлять всеми операциями, которые относятся к подчиненным / вложенным Сущностям.

а это совершенно не обязательно правильно

Да, именно так, поэтому я и написал в статье, что надо использовать «здравый смысл»)

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, Архитектор программного обеспечения
Ведущий
SQL
Golang
Kubernetes
Базы данных
Высоконагруженные системы
Docker
Проектирование архитектуры приложений
DevOps
Node.js