Как написать модульную программу

Например, приложение делится на три модуля: Core, Personal, Client; В Core определены основные библиотеки и методы которые будут переиспользовать остальные модули. Personal и Client — это модули со своим набором activity и бизнес логикой. При авторизации пользователя выбирается, какой модуль использовать. Подскажите, как разрешить зависимости между модулями, а так же каким образом может происходить выбор модуля в зависимости от триггера у пользователя?

Отслеживать
1,331 14 14 серебряных знаков 30 30 бронзовых знаков
задан 2 июл 2017 в 11:56
Евген Амбол Евген Амбол
33 1 1 серебряный знак 3 3 бронзовых знака

Что вы под этим понимаете? При авторизации пользователя выбирается, какой модуль использовать. Разные окна или вкладки открыть?

2 июл 2017 в 13:56

В каждом модуле свой MainActivity , специфичный Drawer и своя логика использования приложения. Тоесть если логинится клиент компании, то используется один модуль, если логинится кто то из персонала , то другой. А в модуле Core например находится активити авторизации и REST.

Многофайловый проект | Изучение С++ для начинающих. Урок #139

2 июл 2017 в 14:04

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Создание модуля (библиотеки)

Для создания модуля в Android Studio выбираете

File > New > New Module

Далее есть 2 варианта. Если вы планируете создать «чистую» java-библиотеку, в качестве типа указывайте Java Library, в итоге код такой библиотеки скомпилируется в JAR файл. Это удобно, так как вы сможете использовать ее не только в Android приложениях.

Если же вы собираетесь использовать android-специфичные вещи и вам понадобятся классы из пакетов android.* , то создавайте Android Library, которая при компиляции собирается в AAR файл. В данном случае вам понядобится последний вариант.

ВАЖНО: В minSDKVersion (файлы build.gradle модулей) приложения должен совпадать или быть больше, чем указанный в модуле библиотеки.Указанные buildToolsVersion должны быть установлены в Android-SDK. Каждый модуль библиотеки генерирует свой класс ресурсов (*.R.class). Когда Android библиотеки добавляются в проект и происходит его сборка, то их ресурсы сливаются, что может привести к конфликтам. Поэтому в документации определены следующие соглашения:

  • Если ID ресурса приложения совпадает с ID ресурса в библиотеке, то используется ресурс приложения
  • Если ID ресурса совпадает в разных библиотеках, то используется ресурс библиотеки, которая указана первой в списке зависимостей (находится выше в блоке dependecies )
  • Для избежания описанных выше конфликтов рекомендуется использовать префикс или другую последовательную схему именования ресурсов, которая будет уникальна для каждого из модулей (или уникальна для всего приложения вцелом)

Подключение Android библиотеки

Подключаются Android библиотеки как зависимости (если библиотека была создана как отдельный проект в AndroidStudio). Тут есть так же 2 варианта:

1.Либо добавить скомпилированный AAR (или JAR) файл:

Как Сделать Логотип в Adobe Illustrator? ЛОГОТИП ЗА 5 МИНУТ


— File > New Module — Import .JAR/.AAR Package > Next — вводите путь до ARR (или JAR) файла > Finish

2.Либо импортировать библиотеку из исходников:

— File > New > Import Module — вводите путь до директории, в которой находятся исходники библиотеки > Finish

ВАЖНО: убедиться, что имя Android библиотеки было добавлено в settings.gradle

include ‘:app’, ‘:core’, ‘:personal’, ‘:client’

и появилась в блоке dependencies файла build.gradle приложения

dependencies

Android библиотеки могут содержать в себе ресурсы, другие JAR библиотеки, собственный AndroidManifest.xml.

Структура скомпилированной Android библиотеки

Скомпилированная Android библиотека представляет собой обычный zip архив с расширением .arr , который содержит следующие обязательные файлы и директории:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt
  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so (где abi_name один из поддерживаемых Android ABIs)
  • /proguard.txt
  • /lint.jar

Источник: ru.stackoverflow.com

Пишем модульную Go программу с плагинами

Среди всех фич, которые появились в Go 1.8 есть система плагинов. С ее помощью можно создавать модульные программы используя пакеты как динамически загружаемые в рантайме библиотеки.

Это открывает большие возможности. Наверняка вы замечали, что разработчикам больших систем на Go неизбежно приходится структурировать по модулям свое приложение. Мы можем использовать различные инструменты для мудуляризации нашего приложения, такие как системные вызовы, сокеты, RPC/gRPC и т.д. Несмотря на то, что перечисленные подходы работают, все это говорит о том, что не плохо было бы иметь нативную поддержку системы плагинов.

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

Плагины в Go

Плагины в Go, по своей сути, это пакеты, скомпилированные с указанием флага -buildmode=plugin в общие динамические библиотеки (файлы .so). Экспортируемые функции и переменные в этом пакете остаются открытыми как ELF символы, которые могут быть использованы в рантайме с помощью пакета plugin

В одной из моих прошлых статей я рассказывал, что Go компилятор, при использовании флага -buildmode=c-shared , может делать совместимые с сишными динамические библиотеками.

Ограничения

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

Читайте также:
Программа для мужчин в домашних условиях

Простая программа с плагинами

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

Эта программа, greeter.go, использует плагины, которые реализуются пакетами ./eng и ./chi , для вывода приветствия на английском и китайском, соответственно. На картинке снизу показана примерная структура программы.

Прежде всего, рассмотрим код eng/greeter.go который выводит сообщение на английском языке.

Код находится в файле ./eng/greeter.go

1package main 2 3import «fmt» 4 5type greeting string 6 7func (g greeting) Greet() < 8 fmt.Println(«Hello Universe») 9> 10 11// экспортируется как символ с именем «Greeter» 12 var Greeter greeting

Код выше это все содержимое пакета. Вам нужно учитывать несколько вещей:

  • Сам пакет, не зависимо от папки а которой он лежит, должен называться main
  • Экспортируемые функции и переменные становятся доступными символами в динамической библиотеке. В примере выше экспортируемая переменная Greeter экспортируется как символ в динамической библиотеке.

Компилирование плагина

Плагины компилируются с помощью команд ниже:

go build -buildmode=plugin -o eng/eng.so eng/greeter.go go build -buildmode=plugin -o chi/chi.so chi/greeter.go

Использование плагинов

Плагины загружаются динамически с использованием специального пакета plugin . Клиентская программа ./greeter.go использует заранее скомпилированные плагины как указано ниже:

package main import «plugin»; . type Greeter interface < Greet() >func main() < // определяем пакет для загрузки lang := «english» if len(os.Args) == 2 < lang = os.Args[1] >var mod string switch lang < case «english»: mod = «./eng/eng.so» case «chinese»: mod = «./chi/chi.so» default: fmt.Println(«don’t speak that language») os.Exit(1) >// загружаем плагин // 1. открываем .so файл для загрузки символов plug, err := plugin.Open(mod) if err != nil < fmt.Println(err) os.Exit(1) >// 2. выполняем поиск символов(экспортированных функций или переменных) // в нашем случае, это переменная Greeter symGreeter, err := plug.Lookup(«Greeter») if err != nil < fmt.Println(err) os.Exit(1) >// 3. делаем возможным работу с этими символами в нашем коде // нужно не забывать про тип экспортированных символов var greeter Greeter greeter, ok := symGreeter.(Greeter) if !ok < fmt.Println(«unexpected type from module symbol») os.Exit(1) >// 4. используем загруженный плагин greeter.Greet() >

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

  • Прежде всего, нужно определится с названием плагина, который нужно загрузить. В нашем случае имя плагина передается через аргументы os.Args .
  • Необходимо добраться до нужного символа “Greeter” с помощью вызова plguin.Lookup(«Greeter») . Название символа совпадает с названием экспортируемых переменных и функций, определенных в пакете плагина.
  • Приводим найденный символ к нужному интерфейсу с помощью конструкции symGreeter.(Greeter) .
  • Теперь можем спокойно вызывать Greet() , который выведет приветствие на английском.

Запускаем программу

Программа выводит в консоль приветствие на английском или китайском, в зависимости от того, какой параметр указан при запуске, как показано ниже.

> go run greeter.go english Hello Universe > go run greeter.go chinese 你好宇宙

Самое главное преимущество такого подхода к проектированию приложения, это возможность в рантайме изменять логику работы приложения(вывод приветствия) без необходимости перекомпилирования самого приложения.

Модульный дизайн Go приложений

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

ПОнятная интеграция

Когда вы проектируете расширяемое приложение, очень важно чтобы вы заранее продумали как плагины будут интегрироваться в вашу систему. Вы должны предоставить простые и удобные интерфейсы для встраивания плагинов. С другой стороны, разработчики плагинов должны относится к вашей системе как к черному ящику и руководствоваться только только предоставленной вами спецификацией.

Независимость плагинов

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

Идеология Unix

Плагин должен хорошо выполнять одну и только одну задачу.

Понятная документация

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

Испольуйте интерфейсные типы как границы

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

Читайте также:
Как совместить две программы в одну

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

Новая парадигма деплоя

Использование плагинов может повлиять на то, как собираются и деплоятся приложения на Go. Например, автор библиотеки может распространять свой код как скомпилированные компоненты, которые могут быть использованы в рантайме. А это уже довольно сильное отклонение от стандартного цикла go get , сборки и линковки.

Доверие и безопасность

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

Версионирование

Go плагины независимые и самостоятельные сущности, которые должны версионироваться так, чтобы было понятно, какая функциональность включена в какую версию. Я рекомендую использовать семантическое версионирование и добавлять номер версии к названию самого .so файла. Например, файл может называться eng.so.1.0.0 , где 1.0.0 и есть номер версии.

Gosh: модульная командная оболочка

Я хочу представить проект, который я недавно начал. Как только стало известно о появлении плагинов в Go, я захотел написать расширяемый фреймворк для создания интерактивной командной оболочки, в которой все команды будут реализованы с помощью плагинов. В итоге у меня получился Gosh (Go shell).

Gosh использует драйвер оболочки для загрузки плагинов различных команд прям в рантайме. Когда пользовать набирает команду в консоли, драйвер выбирает необходимый плагин, необходимый для обработки этой команды. Конечно, это только первые шаги, но уже виден потенциал и мощь системы плагинов в Go.

Заключение

Меня очень радует идея добавления плагинов в Go. Я считаю, что это одно из самых важных изменений, которое очень сильно повлияет на сбоку и дистрибуцию Go приложений. Плагины позволяют создавать Go программы нового типа, с более динамической связанностью, реализованной через загрузку разделяемых библиотек. И одним из первых примеров такого приложения является Gosh. Теперь мы можем делать более распределенные системы, загружая бинарки плагинов на ноды или используя их в контейнерах при необходимости.

Конечно, плагины не решают всех проблем, а порой добавляют новых. Плагины Например, использование плагинов может увеличить размер вашего приложения. А если посмотреть на использование пакетов в других языках, то вероятно нас ожидает еще один “ад плагинов” связанные с их версионированием и распространением. Конечно, для решения всех этих вопросов необходима Go платформа, поддерживающая как модульную стрктуру приложения так и монолитные программы

Как всегда, если вам понравилась эта статья, жду комментариев и репостов.

Источник: kovardin.ru

Презентация, доклад Модульное программирование

Вы можете изучить и скачать доклад-презентацию на тему Модульное программирование. Презентация на заданную тему содержит 22 слайдов. Для просмотра воспользуйтесь проигрывателем, если материал оказался полезным для Вас — поделитесь им с друзьями с помощью социальных кнопок и добавьте наш сайт презентаций в закладки!

Презентации » Информатика » Модульное программирование

Основные понятия Модульное программирование – это такой способ программирования, приОсновные концепции: В основе модульного программирования лежат три основные концепции: ПринципОсновные концепции: Аксиома модульности Коуэна Модуль – независимая программная единица, служащаяХарактеристики модуля (Майерс, 1980) Размер модуля Связность (прочность) модуля СцеплениеРазмер модуля Модуль не должен превышать 60 строк В результате егоСвязность модуля Связность модуля – мера независимости его частей. Чем вышеСвязность модуля Типы связности: Последовательная Модуль с такой связностью может бытьСвязность модуля Типы связности: Информационная Модуль с информационной связностью – этоСвязность модуля: Следует избегать Временной связности - когда объединяются действия,Сцепление модулей Сцепление – мера относительной независимости модулей от других модулей.Типы сцепления Независимые модули – идеальный случай. В этом случае модулиТипы сцепления Сцепление по данным (параметрическое) – это сцепление, когда данныеТипы сцепления Не рекомендуется использовать: Сцепление по управлению – это сцепление,Рутинность модуля Рутинность модуля – это независимость модуля от предыдущих обращенийРутинность модуля В некоторых случаях возникает необходимость в создании модулей, которыеСвойства модуля На модуль можно ссылаться с помощью имени модуля. Преимущества модульного программирования: Функциональные компоненты модульной программы могут быть написаны иНедостатки модульного программирования: Может увеличиться время компиляции и загрузки. Может увеличитьсяСтандартные модули Разработка и использование стандартных библиотечных программ является одним изСтандартные модули Недостатки: Нужный стандартный модуль иногда бывает трудно найти. Еще Подпрограммы (функции) Подпрограммы также являются средством для построения модульных программ Не

Слайды и текст этой презентации

Слайд 1

Описание слайда:

Слайд 2

Описание слайда:

Основные понятия Модульное программирование – это такой способ программирования, при котором вся программа разбивается на группу компонентов, называемых модулями, причем каждый из них имеет свой контролируемый размер, четкое назначение и детально проработанный интерфейс с внешней средой. Альтернатива модульности – монолитная программа

Слайд 3

Описание слайда:

Основные концепции: В основе модульного программирования лежат три основные концепции: Принцип утаивания информации Парнаса При разработке программ формируется список проектных решений, которые особенно трудно понять или которые , скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.Большие программы должны использовать модули без каких-либо предварительных знаний об их внутренней структуре. Примерами удачных модулей могут служить программы ППП (пакетов прикладных программ) и стандартные процедуры. Сборочное программирование Цейтина. Модули – это программные «кирпичи», из которых строится программа.

Слайд 4

Описание слайда:

Основные концепции: Аксиома модульности Коуэна Модуль – независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям: Блочность организации Синтаксическая обособленность Семантическая независимость Общность данных Полнота определения

Слайд 5

Описание слайда:

Характеристики модуля (Майерс, 1980) Размер модуля Связность (прочность) модуля Сцепление модуля с другими модулями Рутинность (независимость от предыдущих обращений) модуля

Слайд 6

Описание слайда:

Размер модуля Модуль не должен превышать 60 строк В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора

Слайд 7

Описание слайда:

Связность модуля Связность модуля – мера независимости его частей. Чем выше связность, тем больше связей он «упрятывает» в себе Типы связности: Функциональная Модуль с функциональной связностью реализует одну какую-нибудь функцию и не может быть разбит на два модуля с теми же типами связности Последовательная

Читайте также:
Программа подключения к сети это

Слайд 8

Описание слайда:

Связность модуля Типы связности: Последовательная Модуль с такой связностью может быть разбит на последовательные части, выполняющие независимые функции, но реализующие совместно единственную функцию (например, оценка , а затем обработка данных)

Слайд 9

Описание слайда:

Связность модуля Типы связности: Информационная Модуль с информационной связностью – это модуль, выполняющий несколько операций или функций над одной и той же структурой данных, которая считается неизвестной вне этого модуля (применяется для реализации, например, абстрактных типов данных таких как стек, очередь и др.)

Слайд 10

Описание слайда:

Связность модуля: Следует избегать Временной связности — когда объединяются действия, связанные со временем (например, действия, которые должны быть выполнены в один и тот же момент времени) Логической связности — когда в модуль объединяются действия по признаку их некоторого подобия (например, функции для проверки корректности входных данных для всей программы) Случайной связности — когда действия объединяются произвольным образом Процедурной связности — когда действия сгруппированы вместе только потому, что они выполняются в течение одной и той же части процесса

Слайд 11

Описание слайда:

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

Слайд 12

Описание слайда:

Типы сцепления Независимые модули – идеальный случай. В этом случае модули ничего не знают друг о друге. Взаимодействие модулей организуется через их интерфейсы, когда выходные данные одного модуля передаются на вход другого. Достичь такого сцепления очень сложно, и в большинстве случаев не нужно.

Слайд 13

Описание слайда:

Типы сцепления Сцепление по данным (параметрическое) – это сцепление, когда данные передаются модулю как значения его параметров или как результат его обращения к другому модулю для вычисления некоторой функции (Этот тип сцепления реализуется в языках программирования при обращении к функциям) Разновидности этого сцепления: Сцепление по простым элементам данных Сцепление по структуре данных (оба модуля при этом должны знать о внутренней структуре данных)

Слайд 14

Описание слайда:

Типы сцепления Не рекомендуется использовать: Сцепление по управлению – это сцепление, в котором один модуль управляет решениями внутри другого с помощью передачи флагов, переключателей и т.п. В этом случае один модуль должен достаточно хорошо знать структуру вызывающего модуля Сцепление по внешним ссылкам – возникает, когда у одного модуля есть доступ к данным другого Сцепление по кодам – возникает, когда коды инструкций модулей перемежаются друг с другом (внутренняя область одного модуля доступна другому)

Слайд 15

Описание слайда:

Рутинность модуля Рутинность модуля – это независимость модуля от предыдущих обращений к нему. Будем называть модуль рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений)

Слайд 16

Описание слайда:

Рутинность модуля В некоторых случаях возникает необходимость в создании модулей, которые должны сохранять предысторию (не рутинные) В выборе степени рутинности пользуются тремя рекомендациями: В большинстве случаев делаем модуль рутинным Зависящие от предыстории модули следует использовать только в том случае, когда необходимо сцепление по данным В спецификации зависящего от предыстории модуля должна быть сформулирована эта зависимость

Слайд 17

Описание слайда:

Свойства модуля На модуль можно ссылаться с помощью имени модуля. Модуль должен иметь один вход и один выход Модуль должен быть сравнительно невелик Возможность сепаратной компиляции Модуль может вызвать другой модуль или сам себя Модуль должен возвращать управление тому, кто его вызвал Модуль не должен сохранять историю своих вызовов для управления своим функционированием

Слайд 18

Описание слайда:

Преимущества модульного программирования: Функциональные компоненты модульной программы могут быть написаны и отлажены порознь Модульную программу проще проектировать, легче сопровождать и модифицировать Становится проще процедура загрузки в оперативную память боль-шой программы, требующей сегментации

Слайд 19

Описание слайда:

Недостатки модульного программирования: Может увеличиться время компиляции и загрузки. Может увеличиться время исполнения программы. Может возрасти объем требуемой памяти. Организация межмодульного взаимодействия может оказаться довольно сложной. Для современных компьютеров первые три недостатка несущественны.

Слайд 20

Описание слайда:

Стандартные модули Разработка и использование стандартных библиотечных программ является одним из путей построения модульного программирования Преимущества стандартных модулей: 1) стандартные модули экономят время программирования; 2) они также могут экономить память компьютера и выполняться максимально быстро; 3) использование стандартных модулей защищает от ошибок программирования.

Слайд 21

Описание слайда:

Стандартные модули Недостатки: Нужный стандартный модуль иногда бывает трудно найти. Еще труднее – подробную документацию к нему Стандартный модуль может оказаться более универсальным, чем это нужно пользователю Стандартный модуль может быть написан на другом языке Каждый программист решает самостоятельно использовать ему стандартные модули или разрабатывать свой собственный.

Слайд 22

Описание слайда:

Подпрограммы (функции) Подпрограммы также являются средством для построения модульных программ Не всякая подпрограмма является модулем. Модуль должен удовлетворять перечисленным выше характеристикам и свойствам.

Источник: myslide.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru