Каков наилучший подход к модульности и независимости от платформы?

StackOverflow https://stackoverflow.com/questions/33510

  •  09-06-2019
  •  | 
  •  

Вопрос

Я надеюсь, что этот вопрос не окажется таким широким, как может показаться на первый взгляд.Я разрабатываю программное обеспечение в своей <sarcasm>объемный</sarcasm> Свободное время.Хотелось бы, чтобы он был одновременно кроссплатформенным и модульным.На данный момент, поскольку я все еще нахожусь на этапе планирования, я могу выбрать практически любой язык и набор инструментов.

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

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

Это не новая идея и не особо экзотическая.Тем не менее, я ломаю голову не столько над тем, как это сделать (я могу придумать множество способов), сколько над тем, какой метод лучше.

Например, я знаю, что Eclipse практически воплощает то, что я описываю, но считаю, что Java-приложения в целом (и Eclipse не исключение) слишком велики и медленны для того, что мне нужно.То же самое касается настольных приложений, написанных на Python и Ruby (которые являются отличными языками!)

Я не против перекомпилировать кодовую базу для разных платформ как нативные исполняемые файлы.Однако у C и C++ есть свои проблемы.

Как разработчик C#, я отдаю предпочтение управляемому коду.Но я пока совсем не в восторге от Mono (меня можно было убедить).

Есть ли у кого-нибудь идеи/опыт/конкретные любимые фреймворки, которыми можно поделиться?

Это было полезно?

Решение

Просто приведу пример:для приложений .NET существуют CAB (блок составного приложения) и Руководство по составному приложению для WPF.Оба в основном представляют собой реализации набора из нескольких шаблонов проектирования, ориентированных на модульность и слабую связь между компонентами, похожими на подключаемую архитектуру:у вас есть структура IOC, базовые классы MVC, слабосвязанный брокер событий, динамическая загрузка модулей и другие вещи.

Итак, я полагаю, что именно такую ​​инфраструктуру шаблонов вы пытаетесь найти, но не специально для .NET.Но если вы рассматриваете CAB как набор реализаций шаблонов, вы можете увидеть, что почти каждый язык и платформа имеет ту или иную форму уже встроенных или сторонних фреймворков для отдельных шаблонов.

Итак, мое мнение будет таким:

  1. Изучите (если вы не знакомы) некоторые из этих шаблонов проектирования.В качестве примера можно взять структуру CAB для документации WPF: Шаблоны в библиотеке составных приложений
  2. Разрабатывайте свою архитектуру, думая, какие из этих шаблонов, по вашему мнению, будут полезны для того, чего вы хотите достичь. сначала не задумываясь о конкретных реализациях шаблонов или продуктах.
  3. После того, как вы определите свои «архитектурные требования» более конкретно, найдите отдельные платформы, которые помогут реализовать каждый из этих шаблонов/функций для языка, который вы решите использовать, и создайте на их основе свою собственную платформу приложений.

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

Другие советы

Планируете ли вы настольное или веб-приложение?

Кажется, все здесь думают, что Mono — это здорово, но я все еще не думаю, что он готов к использованию в промышленности. Я бы приравнял моно к тому, где находится вино, отличная идея;когда это работает, то работает хорошо, а когда нет... ну, вам не повезло.mod_mono для Apache крайне глючен, и его сложно правильно запустить.

Если вы стремитесь к настольному компьютеру, ничто не сравнится с инфраструктурой eclipse RCP (Rich Client Platform): http://wiki.eclipse.org/index.php/Rich_Client_Platform.

Вы можете собрать Windows, Linux и Mac под одним и тем же кодом, и все компоненты пользовательского интерфейса являются встроенными в ОС.И RCP безусловно выигрывает в модульности, у него непревзойденная подключаемая архитектура (из того, что я видел)

Я работаю с RCP уже 1,5 года и не знаю, что еще может его заменить, это №1 в своей нише.

Если вы категорически против Java, я бы посмотрел на wxWidgets с Python или C ++.

Если вы хотите независимости от платформы, вам придется найти компромисс между производительностью и усилиями по разработке.C++ может быть быстрее, чем Java (это спорный вопрос, FWIW), но с Java вы гораздо легче получите независимость от платформы.Python и Ruby находятся в одной лодке.

Я сомневаюсь, что .NET будет намного быстрее, чем Java (в конце концов, они оба являются языками виртуальных машин), но большая проблема .NET — это независимость от платформы.У Mono есть благородная цель и на данный момент удивительно хорошие результаты, но это еще не все. всегда догонять Microsoft в Windows.Возможно, вы сможете принять его ограничения, но это все равно не то же самое, что иметь идентичные многоплатформенные среды, которые есть в Java, Python и Ruby.Также:инструменты разработки и поддержки .NET сильно ориентированы на Windows и, вероятно, так будет всегда.

ИМО, лучше всего ориентироваться на Java...или, по крайней мере, JVM.Если вам не нравится язык Java (а я, как разработчик C#, предполагаю, что это не так), то у вас, по крайней мере, есть такие варианты, как Jython, JRuby и Scala.Используя JVM, вы получаете очень хорошую независимость от платформы, хорошую производительность и доступ к огромному количеству библиотек и инструментов поддержки.Почти всегда существует библиотека, порт или реализация Java, которая сделает то, что вам нужно.Я не думаю, что какая-либо другая платформа имеет такое же количество опций;в этой гибкости есть реальная ценность.

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

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

Учитывая мой ограниченный опыт работы с Mono, я могу сказать, что он меня вполне устраивает.Тот факт, что ведется активная разработка и предпринимаются многочисленные усилия по приведению его в соответствие с новейшими технологиями .Net, обнадеживает.Невероятно полезно иметь возможность использовать существующие навыки работы с .Net на нескольких платформах.У меня были похожие проблемы с производительностью при попытке выполнить некоторые базовые задачи в Python + PyGTK — возможно, их можно заставить работать в умелых руках, но приятно не беспокоиться о производительности в 90% случаев.

Для настольных приложений написание его на интерпретируемом языке и использование кроссплатформенного набора инструментов пользовательского интерфейса, такого как wxWidgets, продвинет вам долгий путь к независимости от платформы (вы просто должны быть осторожны, чтобы не использовать какие-либо другие модули, которые не являются кросс-платформенными). , используйте такие вещи, как Python os.path модуль, вместо того, чтобы делать такие вещи, как config_path = "/home/$USER")

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

Например, OS X, вероятно, наиболее отличается - настройки обычно хранятся в ~/Library/Prefernces/ в виде .plists, пользовательский интерфейс обычно основан на плавающих окнах с единственной строкой меню, закрепленной в верхней части экрана.

Полагаю, здесь вступает в игру модульность..В приведенном выше примере предпочтений у вас может быть класс UserConfig, для которых у вас есть версии для конкретной ОС.Windows хранит данные конфигурации в соответствующем Application Data папку или реестр.В Mac OS используются файлы .plist. ~/Library/Preferences/, а unix'y использует ~/.dotfiles.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top