Pull to refresh
76
0
Zaur Nasibov @BasicWolf

Software Engineer

Send message

Это относилось к переводу "Винни Пуха". Если перевести названия глав "в лоб" получится... что получится. И для сравнения приводится текст Заходера в спойлере.
Перевод "в лоб" виден невооружённым глазом в статьях которые публикуются сразу на английском и русском языке. В других статьях, которые публикуются только на английском, часто налицо построение предложения на русском языке (пусть и в голове автора) и мысленный гугл-транслейт его на английский.

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

В начале пути архиважна фигура лидера, который поведёт за собой команду. Ему придётся внедрять новые привычки и плавно искоренять старые, менять культуру с "лидер-подчинённый" на "лидер-лидер", бодаться с упёртыми продукт менеджерами и вышестоящим начальством, для которого "поставить кнопочку вот сюда, как просит старый клиент, приносящий 1 килодоллар в год" важнее всех долгосрочных начинаний и перемен.

И это только культурная составляющая, а сколько сил приходится тратить на техническую сторону дела! Товарищи переходящие с монолита на распределённые системы просыпаются через пол-года со словами "I know kung-fu". "Кружки" программистов тянущих друг-друга вверх становятся необходимыми. Работе в паре или "толпой" становится не роскошью, а необходимостью. Помимо улучшений в качестве, мы получаем моментальное распространение знаний.

Я очень советую вам прочесть книгу "Turn the ship around" (L. David Marquet). Возможно именно она станет катализатором, который поможет преодолеть все перепоны и укоренить практики DDD.

Как-то несправедливо погнали на Арч для десктопа. Он в принципе ориентирован на другую категорию пользователей, по сравнению с Дебианом или Убунтой. Представьте, что неподготовленного человека, вместо круизного мотоцикла от именитого производителя посадили на спортивный болид собранный по чертежам. Мало не покажется :)

Из своего опыта 3 года на Убунте, 2 года на Дебиане и уже 9 лет на Арче. И если были минорные проблемы, то быстро решались благодаря отличной вики-документации.

Не обязательно, если включить десять посредством i <= 10 то можно начинать от 1 :)
Но проблема раздута сверх всякой меры. В школе много лет программировал на бейсике, а когда перешёл на C, нижняя граница массива от 0 стала просто аксиомой.

Полностью с вами согласен по всем пунктам. Использование Protocol в данном случае вообще не о structural subtyping и это вводит в заблуждение. Здесь больше моя интерпретация и её ноги растут скорее из классической Java (до версии 8).

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

Protocol же я рассматриваю как чистый интерфейс, в котором есть лишь абстрактные методы.

NotImplementedError - нужно убрать, оно тут совсем не к месту :)

Вы имеете ввиду наследование от Protocol, например в

class CastArticleVoteUseCase(Protocol):
    def cast_article_vote(self, command: CastArticleVoteCommand) -> CastArticleVoteResult:
        raise NotImplementedError()

или наследование в сервисах/адаптерах, например

class ArticleVoteRepository(
    SaveArticleVotePort,
):

?

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

Во втором случае - безусловно можно было бы обойтись без "наследования" и статический анализатор даже бы не заикнулся на чём-то вроде save_article_vote_port: SaveArticleVotePort = ArticleVoteRepository(). Но здесь и зарыта собака - т.к. этот протокол - "голый" интерфейс, нас не интересует наследование. Мы хотим явным образом показать в коде, что ArticleVoteRepository реализует этот интерфейс.

С ума сойти, в финских магазинах — от 80 (!) Евро. Печаль.

Спасибо pantafive, который указал на ошибку в дизайне с точки зрения DDD:


VotingUser является агрегатом, поэтому он должен инкапсулировать ArticleVote и репозиторий должен быть только у него. При вызове метода repository.save() должен обновляться (при необходимости) пользователей и добавляться новый голос.

Таким образом VotingUser.vote(...) лишь изменит своё внутренее состояние. Ещё лучше — выделить "Голосующего Пользователя" и "Проголосовашего Пользователя" в разные модели. Тогда метод VotingUser.vote() вернёт проголосовавшего пользователя у которого можно "спросить", как он проголосовал:


class VotingUser:
    def vote(...) -> VotedUser:
        ...

class VotedUser:
    @property  
    def article_vote(self) -> ArticleVote:
        ...

Эх, вам повезло пока не встречаться с народом на велосипедах с электроподдержкой. Нет, я ничего против них не имею, но мозг банально не воспринимает картину, где человек очень лениво крутит педали и при этом летит километров 20-25 в час :(

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

Рыдаю. Несчастный Agile Manifesto, как только над ним не издеваются! Какие только шаманские ритуалы не придумывают. С курсами и сертификатами.

Сугубо личное мнение, но вместо этих курсов потратив время на лекции Мартина, Бэка, Фаулера, Кокбёрна, Холуба ... по теме, читатель вынесет гораздо больше.

Человек может пройти все эти курсы, знать как устроен Канбан, Скрам, СЕЙФ и т.п. только вот проблема в том, что "scrum != agile". Практически невозможно навесить процесс на группу, команду, целую компанию, которая не стремиться изменить свою культуру. А если эта культура есть - ей не нужны сертифицированные процессы, так так группы сами вырабатывают и подстраивают нужные процессы под свою работу.

Однозначно, как сказал @masai - вы же выбираете, что переводить! Человек, выбирающий подобный материал для перевода, мягко говоря профнепригоден. Он тратит время переводчика и время читателя впустую. Что хуже, в следующий раз увидев OTUS в тегах, читатель даже не станет заглядывать в статью. Пожалуйста, берите качеством, а не количеством.

ОТУС, ну зачем? Чем эта статья лучше краткого и лаконичного объяснения из docs.python.org?

Ну уж если писать статью, почему бы не раскрыть откуда и для чего в языке не ограничивающем доступ к полям класса появился этот функционал? Пример с __name ужасен по той простой причине, что в Питоне не принято обрамлять "_поле" или "__поле" в property просто так. Хотя этим любят заниматься товарищи пришедшие из Java и C#.

Стоило бы отметить пару обыденных сценариев пользования property в Питоне:

1. read-only property, которые возвращают фиксированное либо просчитанное значение. Например:

class Circle:
    def __init__(self, radius):
        self._radius = radius
        
    @property
    def area(self):
        return 2 * self.radius * math.pi
        
    @property
    def radius(self):
        return self._radius

2. property in place of field - свойство ставится на месте обычного поля с сохранением имени. Таким образом сохраняется интерфейс класса, но при этом можно навесить дополнительную логику на операции чтении / записи поля.

@kolkoni, мне кажется что вы нарисовали гексагональную архитектуру "в профиль". Ведь Гексагональная архитектура - это ни что иное, как "Архитектура портов и адаптеров". Алистар Кокбёрн ввёл туда многогарнник лишь для того, чтобы упростить визуализацию. А конкретнее:

The hexagon is not a hexagon because the number six is important, but rather to allow the people doing the drawing to have room to insert ports and adapters as they need, not being constrained by a one-dimensional layered drawing.

Эх ностальгия! Помню NT у меня даже на первом пне в 120Mhz и гигабайтным HDD бегала вполне себе бегала. Оперативки - да, было 64 мб.

Так на том же T3 (с версией PalmOS 5) можно было вводить символы в любой части экрана.

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

Вы — счастливый человек. А что делать тому, у кого страховки нет?

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

Information

Rating
Does not participate
Location
Азербайджан
Registered
Activity