Независимость программ от фреймворков
21.02.2022
|
velkin |
Парадигмы программирования
В книге "Чистая архитектура" Мартина Роберта говорится о том, что не нужно зависеть от фреймворков. Автор рассказывает и про себя, как он прошёл путь от программирования перфокарт, до самых современных парадигм.
Книга делится на несколько больших частей. Одна из них обсуждает парадигмы программирования, а именно структурное, объектно-ориентированное и функциональное. Главная его мысль в том, что каждая парадигма ограничивает программиста, в этом и есть их основное назначение.
Но дают ли парадигмы сверх этого какие-то новые возможности? Если считать ограничения возможностями, то да, дают. В конце концов появляются некие правила позволяющие использовать лучшие практики предстающие в виде конструкций языка.
Для структурного программирования это ветвления и циклы. Для объектно-ориентированного это объекты и классы. В функциональном программировании упор идёт на функции, которые можно передавать в качестве аргументов.
Линус Торвальдс о С++
Линус Торвальдс о С++
C++ — кошмарный язык. Его делает ещё более кошмарным тот факт, что множество недостаточно грамотных программистов используют его, до такой степени, что оказывается намного проще выкинуть его как мусор.
Откровенно говоря, даже если нет *никаких* причин для выбора Си, кроме того чтобы держать C++-программистов подальше — то одно это уже будет достаточно веским основанием для использования Си.
Я пришёл к выводу, что *действительно* предпочту выгнать любого, кто предпочтёт вести разработку проекта на C++, нежели на Си, чтобы этот человек не загубил проект, в который я вовлечён.
C++ приводит к очень, очень плохим проектным решениям. Неизбежно начинают применяться «замечательные» библиотечные возможности вроде STL, и Boost, и прочего мусора, которые могут «помочь» программированию, но порождают:
— невыносимую боль, когда они не работают (и всякий, кто утверждает, что STL и особенно Boost стабильны и портируемы, настолько погряз во лжи, что это даже не смешно)
— неэффективно абстрагированные программные модели, когда спустя два года обнаруживается, что какая-то абстракция была недостаточно эффективна, но теперь весь код зависит ото всех окружающих её замечательных объектных моделей, и её нельзя исправить, не переписав всё приложение.
Другими словами, единственный способ иметь хороший, эффективный, низкоуровневый и портируемый C++ сводится к тому, чтобы ограничиться всеми теми вещами, которые элементарно доступны в Си.
А ограничение проекта рамками Си будет означать, что люди его не выкинут, и что будет доступно множество программистов, действительно хорошо понимающих низкоуровневые особенности и не отказывающихся от них из-за идиотской ерунды про «объектные модели».
Когда эффективность является первостепенным требованием, «преимущества» C++ будут огромной ошибкой.
Мартин Роберт о фреймворках
Чистая архитектура. Мартин Роберт
Есть некоторые фреймворки, с которыми вы просто обязаны вступить в союз. Если, например, вы пишете на C++, вам почти наверняка придется вступить в союз с STL — избежать этого очень сложно. Если вы пишете на Java, вы будете вынуждены вступить в союз со стандартной библиотекой.
Это нормально — но все равно это должно быть осознанное решение. Вы должны понимать, что, заключив союз между фреймворком и вашим приложением, вам придется придерживаться этого фреймворка в течение всего жизненного цикла этого приложения. В радости и в горе, в болезни и в здоровье, в богатстве и в бедности, отказавшись от всех остальных, вы будете использовать этот фреймворк. Этот шаг нельзя делать по легкомыслию.
Встретившись с фреймворком, не торопитесь вступать с ним в союз. Посмотрите, есть ли возможность отложить решение. Если это возможно, удерживайте фреймворк за архитектурными границами. Может быть, вам удастся найти способ получить молоко, не покупая корову.
Бизнес-правила
А теперь вопрос, можно ли в действительно избежать зависимостей от фреймворков? И логично было бы получить ответ у того кто поднял этот вопрос в книге. В первую очередь Мартин Роберт говорит о бизнес-правилах, которые описываются вариантами использования.
Чистая архитектура. Мартин Роберт
Прежде чем пытаться делить приложение на бизнес-правила и плагины, необходимо понять, какие бизнес-правила существуют. Как оказывается, их несколько видов.
Строго говоря, бизнес-правила — это правила или процедуры, делающие или экономящие деньги. Еще строже говоря, бизнес-правила — это правила, делающие или экономящие деньги независимо от наличия или отсутствия их реализации на компьютере. Они делают или экономят деньги, даже когда выполняются вручную.
Банк взимает N% за кредит — это бизнес-правило, которое приносит банку деньги. И неважно, имеется ли компьютерная программа, вычисляющая процент, или служащий вычисляет его на счетах.
Мы будем называть такие правила критическими бизнес-правилами, потому что они имеют решающее значение для бизнеса и будут существовать даже в отсутствие системы, автоматизирующей их.
Варианты использования
Но даже если отбросить каким образом описываются варианты использования в итоге получаем, что независимость от фреймворков это не работающий код, а некое описание алгоритмов, которое в принципе можно было бы закодировать опять же с использованием тех же фреймворков.
Да, кто-то может сказать, что можно создать обёртки и прочее, а внутри них подменять код ссылаясь на фреймворки.
Но...
1) Во-первых, это снижение эффективности кода на лишние вызовы.
2) Во-вторых, загромождение кода лишними деталями, что усложнит анализ.
3) В-третьих, всё это не поможет при смене языка программирования, а не только фреймворка как программной платформы.
Если уж Мартин Роберт топит за варианты использования, то получается нужно создавать программу на неком псевдоязыке и псевдофреймворке с использованием псевдокода, а так же модели использования выраженной в виде чертежа или изображения.
После можно перекодировать варианты использования с использованием конкретных фреймворков или иных библиотек алгоритмов. Так же верна и обратная ситуация, когда фреймворк может послужить для создания вариантов использования.
С другой стороны это всего лишь моё временное видение проблемы. Так ли это на самом деле? Может быть и нет.
Числовой мир
Процессоры посредством машинных команд сосредоточены на управлении потоком исполнения и обработкой чисел. В частности поддерживаются арифметические и логические операции. Чем хорош Мартин Роберт так это тем, что во времена его молодости всяких заумных штук не существовало.
Взять для примера управление потоком исполнения. Да его можно обернуть ветвлениями и циклами. Можно создать функции и передавать управление потоком в них. Можно сделать эти функции членами класса, а глобальные обернуть в пространства имён.
Но в конечном итоге всё всегда будет сводится к числам, не важно данные ли это или управление потоком. Говорю я об этом потому, что если не воспринимать программирование за счёт парадигм, то как-то это всё равно нужно делать.
Само собой напрашивается решение в котором можно анализировать изменение чисел. Но этому будет мешать как чёрные ящики исполняемого кода, так и парадигмы программирования с огромным количеством налепленных на них абстракций.
Во втором случае даже, если код и виден, распутать его может быть крайне сложно. За абстракцией простого числа может скрываться сверхсложный программный "механизм", который очень далеко ушёл от простых машинных команд.
21.02.2022 10 комментариев |
V>В книге "Чистая архитектура" Мартина Роберта говорится о том, что не нужно зависеть от фреймворков.
Ага, вдруг придётся на другой фреймворк переезжать в будущем
V>>В книге "Чистая архитектура" Мартина Роберта говорится о том, что не нужно зависеть от фреймворков.
R>Ага, вдруг придётся на другой фреймворк переезжать в будущем
Так и есть. На написание темы меня натолкнуло сравнение Qt и Godot. В Godot я и вовсе увидел то, что было в Source. Вот тогда я и открыл книгу "Чистая архитектура" про архитектуру, так как книги про случаи (варианты) использования (use case) больше ссылаются на требования, а не проблематику.
Что лежит в основе?
1) проблемы.
2) идеи.
3) требования.
4) задачи.
5) решения.
Программный код это решение. Оно лишь косвенно может сказать какие проблемы лежали перед теми кто его разработал. Идея не представляет проблемы. Требования в определённом роде являются детальной постановкой задачи, но сами они скорее служат для её выявление.
Это всё слова, которые можно понять по-разному, но в книге "Чистая архитектура" меня зацепила фраза уже процитированная выше:
Может кто уже дошёл до такого уровня. Или не дошёл, но хотел бы дойти. Может программы действительно нужно писать так, как будь-то планируешь переезжать в будущем. И естественно переезжать придётся с фреймворков. Да и даже если бы это были системные вызовы ситуация не улучшилась бы.
V>Здравствуйте, rosencrantz, Вы писали:
V>>>В книге "Чистая архитектура" Мартина Роберта говорится о том, что не нужно зависеть от фреймворков.
R>>Ага, вдруг придётся на другой фреймворк переезжать в будущем
V> V>Может кто уже дошёл до такого уровня. Или не дошёл, но хотел бы дойти. Может программы действительно нужно писать так, как будь-то планируешь переезжать в будущем. И естественно переезжать придётся с фреймворков. Да и даже если бы это были системные вызовы ситуация не улучшилась бы.
Я Роберта Мартина сто лет не читал, но помню, что пишет он об "энтерпрайзном коде" — о монструозных уродливых проектах, которые живут десятки лет, в разработке которых участвуют многие поколения девелоперов, и мучительно поддерживать которые выходит намного дешевле, чем переписывать с нуля. Каким боком там переезд на другой фреймворк, я не знаю — это из какой-то параллельно вселенной.
("Чистую архитектуру" не читал, но осуждаю)
Книги
Здравствуйте, rosencrantz, Вы писали:
R>Я Роберта Мартина сто лет не читал, но помню, что пишет он об "энтерпрайзном коде"
Это Фаулер Мартин, его книги:
1) Архитектура корпоративных программных приложений
(оно же "Шаблоны корпоративных приложений", именно там речь об энтерпрайзе)
2) Предметно-ориентированные языки программирования
3) Проектирования больше нет (заметка)
4) Рефакторинг. Улучшение существующего кода
5) NoSQL. Новая методология разработки нереляционных баз данных (в соавторстве)
6) UML Основы. Краткое руководство по унифицированному языку моделирования
— не в моей коллекции
7) Рефакторинг кода на JavaScript
8) Экстремальное программирование: планирование (в соавторстве)
Книги Мартина Роберта:
1) Быстрая разработка программ
2) Идеальный программист
3) Принципы паттерны и методики гибкой разработки на языке C#
4) Чистая архитектура
5) Чистый код
— не в моей коллекции
6) Гибкая разработка программ на Java и C++
7) Чистый Agile
R>Каким боком там переезд на другой фреймворк, я не знаю — это из какой-то параллельно вселенной.
Книга или личный опыт, топик от этого не меняется. Хотя мне сдаётся, что многиие просто пишут код и не особо задумываются над темой независимости от фреймворка, или задумываются, но просто забивают.
UML
R>"Чистую архитектуру" не читал, но осуждаю
Кстати, по поводу осуждения. Есть UML диаграммы случаев использования (use case), оно же варианты использования, оно же сценарии использования.
У меня сложилось мнение, что в своё время этому поспособствовал софт вроде Rational Rose.
Но на самом ли деле уместно применять в моделировании UML — унифицированный язык моделирования). Так-то штука хорошая, когда смотришь на неё с точки зрения диаграмм, но вместе с тем они не несут в себе никакого геометрического смысла реального мира и нельзя изобразить даже простые абстракции вроде массива. По сути это просто текст помещённый в различные геометрические фигуры и связанный линиями.
Сниппеты
На фоне этого вспоминаются сниппеты или по другому фрагменты кода, которые при унификации могли бы достигать того же самого, только ещё и быть опорой в создании реального кода.
Примеры сниппетов:
Я к тому, что геометрия должна быть геометрией, вроде чертежей, а код он и есть код, то есть простого текста достаточно.
Детализация
Но что насчёт независимости от фреймворков?
1) Как должна выглядеть исходная программа?
2) Как описать способы перекодировки во фреймворк?
3) А нужно ли этим заниматься?
Если же брать чужие проекты, от примеров до крупных приложений, то получается сначала нужно декодировать программу в свой универсальный вариант, а потом уже с него вдохновляться и производить кодировку в конкретный фреймворк попутно выбирая детали вроде реализации массивов и прочего.
Насчёт детализации, если UML стремится отбросить детали, то в собственных конструкциях напротив можно ввести даже больше деталей, чем есть в конкретных языках. Конечно всё это при условии, если это действительно нужно. Возможно это будет нужно лишь при кодировке во фреймворк.
Взять те же константы (постоянные), в том же C++ это средство оптимизации, а не просто конструкция, которая позволяет не ошибиться программисту. Точно так же как и switch можно заменить if лишь функционально, но без оптимизаций при которых сразу происходит переход со смещением в нужную позицию без перебора вариантов.
Тогда как модификаторы доступа в объектно-ориентированном программировании можно рассматривать лишь как ограничения, которые не дают программисту "ошибиться". И я не знаю, что они делают помимо того, что происходит на этапе компиляции в виде предупреждений.
Потому можно разделять:
1) Функциональный смысл.
2) Оптимизацию реализации.
Но чтобы декодировать код в что-то независимое, а потом собрать тоже самое заново, всё же придётся записать и то и другое, в противном случае детали будут упущены.
R>Ага, вдруг придётся на другой фреймворк переезжать в будущем
Иногда лучше жевать, чем говорить )))
В указанной книге речь идет что фреймворк не дожен определять то, как создается BL. Ну т.е. совсем упрощая — не надо втягивать объекты веб-фреймворка в BL. Или руководствоваться его правилами при создании BL. А то, что API/WebUI слой будет зависеть от веб-фреймворка это ок.
Т.е. это BL диктукет свои условия (контракты), а уже потом их реализуют на выбранном фремворке.
Ну и там же признается что есть базовые феремворки у языков (например .NET для C#) от которых никуда не делаться.
Другими словами: есть доменная логика и есть инфраструктура (СУБД, веб-сервер и т.п.)
но нельзя сделать независимо, можно лишь не инжектить в домен.
vaa>Другими словами: есть доменная логика и есть инфраструктура (СУБД, веб-сервер и т.п.)
vaa>но нельзя сделать независимо, можно лишь не инжектить в домен.
Если просто разделить архитектуру на слои, уровни и прочее, то здесь скорее рассуждения будут больше походить на те, что излагает Фаулер Мартин. Но Мартин Роберт толкает мысль про то, что логика домена не должна зависеть от фреймворка.
В топике как раз отрывок из главы "Фреймворки — это деталь" книги "Чистая архитектура" Мартина Роберта. Но отношение к тем же базам данных и вебу у него похоже тоже самое. С моей точки зрения это как если бы реализация собственной программы не зависела ни от какой чужой реализации.
Для меня вопрос больше в том, как это должно выглядеть в реальности. В конце концов даже парадигмы во второй части описаны как нечто, что ограничивает программистов, то есть он прошёлся не только по фреймворкам, базам данных и вебу.
Мартин Роберт очень любит слово чистый, его книги "Чистый код", "Чистая архитектура", "Чистый Agile". В данном случае я бы тогда ввёл понятие "чистый алгоритм".
Но вот вопрос, как записать этот чистый алгоритм?
V>Здравствуйте, vaa, Вы писали:
vaa>>Другими словами: есть доменная логика и есть инфраструктура (СУБД, веб-сервер и т.п.)
vaa>>но нельзя сделать независимо, можно лишь не инжектить в домен.
V>Для меня вопрос больше в том, как это должно выглядеть в реальности. В конце концов даже парадигмы во второй части описаны как нечто, что ограничивает программистов, то есть он прошёлся не только по фреймворкам, базам данных и вебу.
V>Но вот вопрос, как записать этот чистый алгоритм?
Книжку читал пару лет назад. Вынес главную мысль: ни каких циклических зависимостей. Еще понравилось описание паттернов. лучшее.
В F# например, компилятор вынуждает выстраивать исходный код, модуль который используется должен быть доступен раньше места использования.
В C# с кучей проектов на голом ООП был момент когда эта гадина стала подозрительно странно собираться(с нескольких попыток).
Чистота достигается отсутствием в домене зависимостей:
https://youtu.be/9zpG_hJsrL8?t=1221
https://youtu.be/05DyWjTBg0c?t=1816
Про мартина https://youtu.be/05DyWjTBg0c?t=1475
vsb>Мартин Роберт — оторванный от реальности теоретик. Не надо его слушать.
ну почему же? вполне себе писатель https://github.com/unclebob