Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 11

Спасибо за шикарное представление данного паттерна на языке golang. Молодец Алекс, так держать!!!
Спасибо за обратную связь.
Когда применять?

Когда пишем не на Go. А на Go так писать не надо, плз.

По сути же это просто функция, которая возвращает разные реализации интерфейса на основе входных параметров. Такого же полно в библиотеках на Go. Что этом плохого? В том, что это можно назвать "шаблоном"?

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

При этом у автора:

Так как в Golang отсутствуют возможности ООП, такие как классы и наследование


Для создания нового объекта вашего продукта, достаточно создать новый подкласс


Обычно в ООП когда говорят «подкласс», подразумевают наследование. При этом автор вот эту вот вторую часть про расширение скромно опустил как очевидную (и как явно написано, реализовал-то он другую версию шаблона, а не Factory Method), и вот этого противоречия в своем тексте видимо не наблюдает.

Ну да, примеры об одном, текст о другом.

В том, что написали Вы — ничего плохого нет. В том, что написано в статье — плохо примерно всё. Что конкретно плохо — по большей части Вы же сами и описали комментарием ниже.

Ваш код ужасен. Изучите Go пожалуйста.
Спасибо за обратную связь. Примеры специально делал без строгого соответствия код-стайлу. Но хотелось бы получить более развернутую обратную связь от Вас, в чем конкретно «ужасность» кода?

Интерфейс называется iTransport - так не принято, скорее Transport или Transportable.

У геттеров предпочтительнее не использовать префикс get: name() вместо getName()

Пример, конечно, синтетический, но непонятно, зачем интерфейс с неэкспортируемыми методами, который не обладает логикой кроме как установки полей структуры.

Эмбеддинг используется, чтобы эмулировать наследование - это не совсем идиоматично. Лучше стараться избегать такого и использовать другие решения.

Функция создания структуры возвращает интерфейс, хотя идиоматичнее возвратить конкретный тип: в Go т.н. structural typing поэтому паттерны из Java/PHP не так работают: предпочтительнее возвращать конкретные типы, а определять и использовать интерфейсы уже на уровне консьюмера/клиента, тогда структура автоматически приведется к интерфейсу без строгой номинальной привязки. Т.е. некий код говорит, что он хочет принимать в качестве аргумента нечто, что ведет себя как утка, и приведение конкретного типа к интерфейсу происходит в этот момент. Неидиоматично объявлять, что некая структура изначально удовлетворяет какой-то интерфейс (что это её якобы неотъемлемое свойство).

Спасибо за конструктивный ответ. С вами согласен по всем пунктам.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации