Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Holy Wars > ООП vs %name% |
Автор: JoeUser 18.01.19, 14:11 |
Буэнос диас, амигос! Понемногу изучая Rust, я столкнулся с тем, что привычные приемы проектирования "не работают". Конечно же я об ООП и его паттернах проектирования. Некоторые "коллеги по цеху" уже разочаровались по стопицот раз, переписывая С++ код на Rust. В представленной выше ссылке, как по мне, интересна не сама статья Собственно вопросы к обсуждению Приступая к проектированию проекта, большинство разработчиков, которые худо-бедно владеют ЯП с полной поддержкой ООП, этот подход и выбирают. Я не имею ввиду 100-строчные "хелоу ворлд" утилиты. А нормальные, более-менее сложные проекты. 1) А как быть если полной поддержки ООП в ЯП нет? 2) Есть ли приемы/методики проектирования не менее удобные чем объектно-ориентированное? 3) А есть ли для них свои "паттерны проектирования", которые есть для ООП? ЗЫ: Аббревиатуру "ООП" читаем как "Объектно-ориентированное программирование" или "Объектно-ориентированное проектирование" по контексту. |
Автор: D_KEY 19.01.19, 07:48 |
Цитата JoeUser @ Понемногу изучая Rust, я столкнулся с тем, что привычные приемы проектирования "не работают". Конечно же я об ООП и его паттернах проектирования. Например? Добавлено Цитата JoeUser @ 1) А как быть если полной поддержки ООП в ЯП нет? 2) Есть ли приемы/методики проектирования не менее удобные чем объектно-ориентированное? 3) А есть ли для них свои "паттерны проектирования", которые есть для ООП? 1) Не использовать ООП. Не использовать такой язык. Использовать ООП через кастомные/библиотечные решения для языка. На самом деле последний вариант вполне реален. Просто "шаблоны ООП" расширяются вначале самыми примитивными - "объект", "класс" и т.п. 2) Что значит "не менее удобные"? Есть старое структурное/процедурное программирование. Есть функциональное. 3) Ну конечно есть. Паттерны есть вообще почти во всем Вопрос в том, описаны ли они так же хорошо, как для ООП. Для функциональщины вроде видел литературу, но сам не читал. Добавлено Конкретно в rust, по-моему можно вполне соответствовать SOLID, а что ещё нужно? Наследование реализации? Не уверен, что это большое препятствие. |
Автор: JoeUser 19.01.19, 08:49 |
Давай для начала посмотрим простейшее, к примеру паттерн "Фабричный метод", как это будет смотреться на Rust? Пример реализации этого на С++ из вики: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include <iostream> #include <string> using namespace std; class Product { public: virtual string getName() = 0; virtual ~Product() = default; }; class ConcreteProductA: public Product { public: string getName()override {return "ConcreteProductA";} }; class ConcreteProductB: public Product { public: string getName()override {return "ConcreteProductB";} }; class Creator { public: virtual Product* factoryMethod() = 0; virtual ~Creator() = default; }; class ConcreteCreatorA: public Creator { public: Product* factoryMethod()override {return new ConcreteProductA();} }; class ConcreteCreatorB: public Creator { public: Product* factoryMethod()override {return new ConcreteProductB();} }; int main() { ConcreteCreatorA CreatorA; ConcreteCreatorB CreatorB; // An array of creators Creator*creators[] = {&CreatorA, &CreatorB}; // Iterate over creators and create products for(auto&& creator: creators) { Product* product=creator->factoryMethod(); cout << product->getName() << endl; delete product; } return 0; } Ну понятия "программирование" и "проектирование" - несколько разные все ж вещи. Результатом программирования является программа или отдельные ее части. Результатом проектирования является математическая модель, имеющая структуру, характеристики и свойства. Меня интересует сейчас только варианты проектирования - не ООП. |
Автор: OpenGL 19.01.19, 09:14 |
Точно так же и будет. Добавлено Можно, пожалуй, согласиться, что существующие подходы к проектированию gui фреймворков на раст укладываются плохо - до сих пор нет вменяемых gui библиотек. Но ООП тут вообще никаким боком. |
Автор: applegame 19.01.19, 09:20 |
Паттерны проектирования программисту не нужны. Они нужны только писателям книг про паттерны проектирования. |
Автор: JoeUser 19.01.19, 09:39 |
Цитата applegame @ Паттерны проектирования программисту не нужны. Они нужны только писателям книг про паттерны проектирования. Спорное утверждение. Пару лет назад я писал "монстра" на Qt в одно лицо. Столько времени ушло на организацию взаимодействия элементов интерфейса на основе сигналов-слотов, просто ппц. А просто по-тому, что изначально все писал "в лоб", не сильно заботясь про создание структуры, где каждый объект или совокупность выполняют только свойственные ему/ей функции. Гораздо позже прочел книгу по паттернам проектирования ООП. А мог бы сэкономить время разработки в разы. |
Автор: JoeUser 19.01.19, 09:41 |
Как считаешь, все ли паттерны ООП проектирования можно так же перевести на Rust, или могут быть проблемы? |
Автор: applegame 19.01.19, 11:00 |
Цитата JoeUser @ У меня было не так. Когда я первый раз прочитал о паттернах, то выяснил, что я их и так уже использую, не зная что они имеют какие-там названия. Они же примитивны. Гораздо позже прочел книгу по паттернам проектирования ООП. А мог бы сэкономить время разработки в разы. |
Автор: D_KEY 19.01.19, 11:02 |
Цитата JoeUser @ Ну понятия "программирование" и "проектирование" - несколько разные все ж вещи. Результатом программирования является программа или отдельные ее части. Результатом проектирования является математическая модель, имеющая структуру, характеристики и свойства. Меня интересует сейчас только варианты проектирования - не ООП. Ну так в данном конкретном случае программирование и проектирование связаны тесно. Процедурный подход толкает тебя на проектирование в концепциях модулей, структур данных и (ключевое) операций над ними, ОО - объектов и взаимодействия между ними, функциональщина - потоков данных и цепочек вычислений. Добавлено Цитата applegame @ Когда я первый раз прочитал о паттернах, то выяснил, что я их и так уже использую, не зная что они имеют какие-там названия. Так в этом и суть паттернов, что они дают каталогизированный и систематизированный список стандартных подходов, позволяя экономить время при обсуждении и работе в командах(и последующей поддержки возможно даже другими людьми). Ну а новичкам действительно дают правильную справку. Хотя я бы не торопился паттерны давать джунам |
Автор: OpenGL 19.01.19, 11:26 |
Цитата applegame @ Когда я первый раз прочитал о паттернах, то выяснил, что я их и так уже использую, не зная что они имеют какие-там названия. +1. Мне разве что visitor в новинку был, но скорей всего только потому, что на момент прочтения я не сталкивался с задачей, где нужна динамическая диспетчирезация по двум параметрам, а если бы столкнулся, то, полагаю, сам бы пришёл к похожему решению. Хз, по моему опыту всегда достаточно своими словами описать, что ты хочешь это сделать. Умные слова из книжки для этого не сильно нужны. Цитата JoeUser @ Как считаешь, все ли паттерны ООП проектирования можно так же перевести на Rust, или могут быть проблемы? Я не вижу каких-либо подводных камней. Сложности BC, которые непременно будут поначалу при программировании на расте, будут относиться скорей к конкретному применению того или иного паттерна и конкретной ситуации, а не к паттерну как таковому. |
Автор: D_KEY 19.01.19, 11:36 |
Цитата OpenGL @ Хз, по моему опыту всегда достаточно своими словами описать, что ты хочешь это сделать. Умные слова из книжки для этого не сильно нужны. Так можно не описывать, если все понимают термин сразу. Что, неужели никогда не используешь слова "фабрика", "визитор", "фасад" или ещё чего? Или разъясняешь каждый раз их? Не верю Да и в коде если соответствующие классы имеют в своих именах соответствующие названия, то читать и вникать проще. |
Автор: OpenGL 19.01.19, 11:57 |
Цитата D_KEY @ Что, неужели никогда не используешь слова "фабрика", "визитор", "фасад" или ещё чего? Если я скажу, что не использую - ты поверишь? Фабрику бывает что использую, всё остальное же использовал только для того, чтобы |
Автор: negram 19.01.19, 19:17 |
Цитата applegame @ Два чая этому гражданинуПаттерны проектирования программисту не нужны. Они нужны только писателям книг про паттерны проектирования. Цитата D_KEY @ я эти слова использую настолько редко, что уже и забыл слово "визитор". Наверное, спасибо, что напомнил:) Что, неужели никогда не используешь слова "фабрика", "визитор", "фасад" или ещё чего? Или разъясняешь каждый раз их? Не верю |
Автор: D_KEY 19.01.19, 19:54 |
Ну вот видишь. В этом и смысл. В твоём случае устоялся один паттерн. Для других этот список будет более полным. Добавлено Ну хоть фабрику-то используешь? И вообще, насколько часто обсуждаешь решения при проектировании/архитектурные решения с коллегами? Насколько часто копаешься в чужом коде? |
Автор: Астарот 19.01.19, 20:18 |
При копании в чужом коде все равно не поможет. Какой-нибудь "наблюдатель" можно реализовать сто и одним способом, и когда поймешь, что смотришь именно на него, только в профиль, тогда будет уже поздно - из глаз будут течь кровавые слезы, а уши завернутся в трубочку от мата |
Автор: D_KEY 19.01.19, 20:41 |
Цитата Астарот @ При копании в чужом коде все равно не поможет. Какой-нибудь "наблюдатель" можно реализовать сто и одним способом, и когда поймешь, что смотришь именно на него, только в профиль, тогда будет уже поздно - из глаз будут течь кровавые слезы, а уши завернутся в трубочку от мата А тебе не кажется, что одна из причин этого - отсутствие знаний о паттернах у писавшего код и, как следствие, отсутствие в документации, комментариях и коде всем понятных названий и обозначений? |
Автор: Астарот 19.01.19, 20:49 |
Цитата D_KEY @ А тебе не кажется, что одна из причин этого - отсутствие знаний о паттернах у писавшего код и, как следствие, отсутствие в документации, комментариях и коде всем понятных названий и обозначений? Так может он и написал, просто не там, где ты копаешься Добавлено Вообще, если понимать "наблюдатель", как что-то вроде "издатель-подписчик", а этот паб-саб понимать еще шире, то получится, что в какой-то мере аспектно-ориентированный подход в целом реализует этот самый паттрен Добавлено Цитата D_KEY @ Паттерны есть вообще почти во всем Вопрос в том, описаны ли они так же хорошо, как для ООП. Для функциональщины вроде видел литературу, но сам не читал. Да ну? Вспоминай, что за зверь, потому что кроме "композиция функций", "рекурсия" и "карринг" фиг что встретишь, не говоря уже о полноценных паттернах |
Автор: korvin 19.01.19, 21:27 |
Есть мнение, что, если твой язык не позволяет реализовать паттерн один раз в виде библиотечной функции/класса/whatever, то это дерьмовый язык. Что значит «полная поддержка ООП»? В каком языке есть «полная поддержка ООП»? Цитата JoeUser @ 2) Есть ли приемы/методики проектирования не менее удобные чем объектно-ориентированное? Есть. Тысячи их. Например: __________________________2019_01_20____0.25.09.png (, : 1664) Есть. Монады, например.Аппликативные функторы. CSP. Сотни их. |
Автор: D_KEY 19.01.19, 21:33 |
Цитата korvin @ Есть мнение, что, если твой язык не позволяет реализовать паттерн один раз в виде библиотечной функции/класса/whatever, то это дерьмовый язык. Возможно оно и так, но деньги, как правило, платят за код на дерьмовых языках |
Автор: korvin 19.01.19, 21:49 |
Ну, это уже другой вопрос, вне этого холивара =) Впрочем, в любом случае, паттерны — это не правила, а примеры, не нужно возводить их в абсолют, а то придёт Оби-Ван Кеноби =) |
Автор: Астарот 19.01.19, 22:15 |
Цитата Есть. Тысячи их. Это очень плохая и манипулятивная картинка. |
Автор: applegame 19.01.19, 23:14 |
Ох уж эти мне монады. Забавно, что несмотря на то, что, в отличие от хаскеля, в эликсире нет встроеного каррирования и ленивости, некоторые господа все равно тащат в эликсир эти ваши монады в виде странных библиотек делающих странные вещи. Такое впечатление, что многие любители функциональных языков давно перестали страдать от этих |
Автор: OpenGL 20.01.19, 07:36 |
"Устоялся" это слишком громко сказано. Просто "фабрика" достаточно удобное название. А вот в случае с другими думать о том, является вот эта вот штука мостом или адаптером тупо лениво, так что для них находятся более удобные названия. Например, "враппер" - по-моему это самое универсальное слово, описывающее почти что угодно и которое все понимают |
Автор: D_KEY 20.01.19, 09:17 |
Цитата OpenGL @ "Устоялся" это слишком громко сказано. Просто "фабрика" достаточно удобное название. Ну вот на мой взгляд в этом и заключается польза от любого паттерна. Удобное название для некоторого вида архитектурных решений, которые прошли проверку временем и в том или ином виде встречаются чуть ли не в любой программной системе. |
Автор: Астарот 20.01.19, 16:16 |
Цитата applegame @ Ох уж эти мне монады. Забавно, что несмотря на то, что, в отличие от хаскеля, в эликсире нет встроеного каррирования и ленивости, некоторые господа все равно тащат в эликсир эти ваши монады в виде странных библиотек делающих странные вещи. Такое впечатление, что многие любители функциональных языков давно перестали страдать от этих Учитывая что монады как бы совсем не из функциональщины - да |
Автор: OpenGL 20.01.19, 18:47 |
Цитата D_KEY @ Ну вот на мой взгляд в этом и заключается польза от любого паттерна. Удобное название для некоторого вида архитектурных решений, которые прошли проверку временем и в том или ином виде встречаются чуть ли не в любой программной системе. Ну хз. По-моему эти названия нифига неудобные потому что они не говорящие абсолютно. Вот, допустим, ты забыл, что такое "мост" или "посетитель" - вспомнишь, для чего они, зная только их название? |
Автор: D_KEY 20.01.19, 19:07 |
Цитата OpenGL @ Вот, допустим, ты забыл, что такое "мост" или "посетитель" - вспомнишь, для чего они, зная только их название? Раз забыл, значит редко используешь. Значит да, лучше обсудить детали. И значит в этом конкретном случае от паттерна толку не было. Но я таки видел большие монолитные системы, которые жили лет по 10 минимум и там паттернов применялось много(как правило по делу), а их знание упрощало жизнь во всех смыслах(как минимум - поддержка кода и обсуждения). Другое дело, что мне не нравятся монолитные системы и последние тенденции в разработке вроде как тоже от этого отходят. А там и кода меньше и сложности. Добавлено Раскрой мысль, плиз Добавлено Цитата Астарот @ Цитата D_KEY @ Паттерны есть вообще почти во всем Вопрос в том, описаны ли они так же хорошо, как для ООП. Для функциональщины вроде видел литературу, но сам не читал. Да ну? Вспоминай, что за зверь, потому что кроме "композиция функций", "рекурсия" и "карринг" фиг что встретишь, не говоря уже о полноценных паттернах Сходу не нашел. В процессе наткнулся на статью на хабре Вот ещё что-то Последняя ссылка может быть интересна автору темы Но мне почему-то кажется, что была или книжка или прям серия статей на буржуйском. Но видимо глючит память |
Автор: Астарот 20.01.19, 20:11 |
Монада - это такой хитросделанный пальцем зверек, который по сути про точки. То есть монада Try выглядит как-то так: Цитата Try.of(...) .success(....) .failure(....) А функциональщина она как раз про бесточечную нотацию, кажется. Почему монады постоянно относят к ФП для меня загадка Да и слышно про них только при слове "хаскель". Добавлено Ее видел, там вообще статья странная. Вон та картинка в ней тоже встречается. Народ в комментариях матерится Добавлено Кстати, тут спрашивали про монады в эрланге - http://erlang.org/pipermail/erlang-questio...rch/042557.html |
Автор: JoeUser 20.01.19, 20:38 |
Есть такое паттерн "Цепочка обязанностей", а не монада ли это случаем? |
Автор: applegame 21.01.19, 03:35 |
Цитата Астарот @ Монады и точки - это взаимно перпендикулярные сущности.Монада - это такой хитросделанный пальцем зверек, который по сути про точки. То есть монада Try выглядит как-то так Цитата Астарот @ Потому что в императивщине монады используются достаточно редко и всегда можно обойтись и без них, а в Хаскеле, наоборот, без монад вообще невозможно жить.Почему монады постоянно относят к ФП для меня загадка Да и слышно про них только при слове "хаскель". В последнее время, монады активно применяются в C# и JS для асинхронного I/O, просто многие не знают, что это монады. Я говорю о Promise и async/await. Но это тоже костыли на самом деле. Нет. |
Автор: Астарот 21.01.19, 03:53 |
Цитата Монады и точки - это взаимно перпендикулярные сущности. Ну фиг знает. Цепочка вычеслений и цепочка вычеслений. |
Автор: OpenGL 21.01.19, 05:25 |
Цитата D_KEY @ Раз забыл, значит редко используешь. Значит да, лучше обсудить детали. И значит в этом конкретном случае от паттерна толку не было. Почему? Юзать паттерны не зная что из них чем является - нормальное явление для программиста. |
Автор: D_KEY 21.01.19, 06:01 |
Цитата OpenGL @ Юзать паттерны не зная что из них чем является - нормальное явление для программиста. Я под паттерном понимаю в данном случае именно устоявшийся каталогизированный способ и соответствующий ему термин. А то, что твое решение совпадает с паттерном - это уже другой вопрос Думаю, что у всех программистов такое бывает и читая тот же GoF впервые они видят там свои же решения, пусть и чуть в другом виде иногда. |
Автор: D_KEY 21.01.19, 06:13 |
Разговор про монады напомнил мне, как я тут развлекался когда-то в одной из тем Монады и C++ Часть 2(списки) Часть 3(монада IO) Вот уж действительно Добавлено Я думал меньше времени прошло |
Автор: applegame 21.01.19, 08:43 |
Всякая монада - это действительно цепочка вычислений. Но не всякая цепочка вычислений - это монада. |
Автор: Астарот 21.01.19, 09:04 |
Цитата applegame @ Всякая монада - это действительно цепочка вычислений. Но не всякая цепочка вычислений - это монада. Что никак не объясняет почему они "перпендикулярны". |
Автор: applegame 21.01.19, 11:40 |
Я хз как ещё объяснять. "Монады - это точки" это примерно как "студенты - это программисты". Так вот, студенты и программисты взаимно ортогональны. Есть такая аллегория. |
Автор: Астарот 21.01.19, 12:00 |
Цитата applegame @ Я хз как ещё объяснять. "Монады - это точки" это примерно как "студенты - это программисты". Так вот, студенты и программисты взаимно ортогональны. Есть такая аллегория. Очевидно же, что когда я говорю "монада - это точки", то рассчитываю, что все тут присутствующие все же программисты, и смогут развернуть это колхозное определение во что-то вроде "объекты содержащие логику и состояние и поддерживающие цепочечные вызовы", или как-то так. Вообще говоря какой-нибудь "билдер" на все возвращающий сам себя, а на build() результат - тоже монада |
Автор: Wound 21.01.19, 12:49 |
Любой класс, в котором есть логика и состояние и в котором есть метод возвращающий тип-объект подходит под это определение. |
Автор: korvin 22.01.19, 08:08 |
Можно, но не нужно, ибо с ними удобней. Point-free notation не про '.' |
Автор: applegame 22.01.19, 08:14 |
Как ты себе представляешь приложение без I/O? Без монад можно разве что либы писать. |
Автор: OpenGL 22.01.19, 09:24 |
Более того, именно ради I/O программа и пишется |
Автор: D_KEY 22.01.19, 11:24 |
Цитата applegame @ Как ты себе представляешь приложение без I/O? Без монад можно разве что либы писать. Возможно, есть другие способы сделать ввод/вывод в haskell. Без монад. |
Автор: korvin 22.01.19, 13:06 |
Цитата applegame @ Как ты себе представляешь приложение без I/O? Без монад можно разве что либы писать. Монады не про IO. Берёшь unsafePerformIO и вперёд. Альтернативный вариант — unique types в Clean. |
Автор: applegame 23.01.19, 09:15 |
Монады не про IO, зато IO про монады. Там все равно присутствует монада IO: Цитата This is the "back door" into the IO monad, allowing IO computation to be performed at any time. И всякие операторы вроде >>= и do-нотация - это тоже использование монад. Монады в Хаскеле - это не прикольная дополнительная возможность, а суровая необходимость. |
Автор: korvin 23.01.19, 17:16 |
Ок, про unsafePerformIO я погорячился, думал, это кое-что другое. Оператор >>= — это монадическая функция bind, да, она в определении монады. do-нотация — просто синтаксический сахар для монад. Монады можно использовать для любых типов вида * => * (т.е. для любых типов, имеющих один тип-параметр). Например для списков. Конкретно тип IO инкапсулирует RealWorld. Инкапсуляция нужна, чтобы не создавать дубликатов мира и прочие неожиданные эффекты. Монада (тайпкласс Monad) выбрана в качестве удобного интерфейса для манипуляций над IO, не более того. Поэтому монады в Хаскелле — это таки прикольная фича, оказавшаяся ещё и удобной в качестве интерфейса к IO, более удобной чем unique types. Вот тут рассказывается, как устроено IO в pure-FP вообще, и в Хаскелле в частности: https://www.youtube.com/watch?v=fCoQb-zqYDI |
Автор: applegame 24.01.19, 02:31 |
Ты, видимо, как раз один из тех, кто перестал страдать от монад и начал ими наслаждаться. |
Автор: korvin 24.01.19, 06:10 |
Никогда от них не страдал, как и любой, кто ими пользовался. |