LINUX.ORG.RU

Взаимодействие backend и frontend

 , , , ,


0

3

До этого писал чисто консольные проекты на чистом си (один был с использованием ncurses). Хочу реализовать программу, которая может работать с несколькими гуями. Тоесть с одним... Поясню на примере. Есть у меня какое-то основное апи и есть несколько вариантов main функции. Одна чисто консольная, другая GTK, третья ncurses. Я закидаю один из этих вариантов в src и компилирую. Это как вариант. На самом деле мне параллельно, как они будут взаимодействовать, компилироваться вместе или отдельно, где будет main и прочее. Мне просто надо то что я описал выше. Желательно так чтобы можно было писать backend на С, a frontend на С++

Выносишь всю логику в разделяемую библиотеку и дёргаешь её API из любого main, хоть консольного, хоть ncurses, хоть GTK, хоть Qt. Или в чём вопрос?

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от nikitosios20031

logic.h:

#ifndef LOGIC_H
#define LOGIC_H

typedef struct
  {
	int param1,
	    param2;
  } config_t;

int  my_cool_func(config_t *conf);
void another_cool_func(int someshit);
int  awful_func_dont_call_it(char **memleak);

#endif /* LOGIC_H */

logic.c не привожу, там всё понятно.

main.c (CLI):

#include <stdlib.h>
#include <stdio.h>
…
#include "path/to/logic.h"



int main(int argc, char **argv)
  {
	config_t conf;

	/* Parse arguments */
	/* Run logic */
	return my_cool_func(&conf);
  }

main.cpp (Qt):

#include <QApplication>
…
extern "C"
  {
	#include "path/to/logic.h"
  }



int main(int argc, char **argv)
  {
	QApplication app(argc, argv);

	// Your logic

	return app.exec();
  }

Аналогично с остальными.

CMakeLists.txt (я использую CMake, но можно сделать аналогично на любой системе сборки):

cmake_minimum_required(VERSION 3.0)

project(liblogic C)
… # всякие настройки

add_library(logic SHARED logic.c)

project(logic-cli C)
…

add_executable(logic-cli main.c)
target_link_libraries(logic-cli logic)

project(logic-qt)
…

add_executable(logic-qt main.cpp)
target_link_libraries(logic-qt logic Qt5::Core Qt5::Widgets)

Как-то так. Разумеется, это всё очень упрощённо, просто чтоб показать принцип. За синтаксическую корректность не ручаюсь

XMs ★★★★★
()

Если нужно подружить несколько реализаций фронтенда (ncurses/gtk/qt/cocoa/etc), для этого идеально подойдет абстрактная фабрика.

Если же нужно всего два фронтенда - консольный (классический вариант, не ncurses) и гуевый, то проще всего сделать как-то так:

$ myprogram --gui

Или так:

$ myprogram-gui $ myprogram --some-console-args

anonymous
()

backend и frontend - разеые процессы, коммуницирующие между собой через IPC - самый гибкий вариант. Нужно только продумать интерфейсы и найти IDL из которого можно нагенерировать код занимающийся всем IPC.

invy ★★★★★
()
Ответ на: комментарий от Stil

Худший

Вкусовщина. Я, например, не терплю K&R.


Какое-нибудь гну?

Вариация

XMs ★★★★★
()
Ответ на: комментарий от invy

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

anonymous
()
Ответ на: комментарий от anonymous

Правильно! Перед написанием hello world необходимо пройти пятилетние курсы по архитектуре вычислительных систем, праву и металлургии и двухнедельные по современной философии.

Stahl ★★☆
()
Ответ на: комментарий от Stil

Худший код-стайл, который я когда-либо видел

Плюсую.

UVV ★★★★★
()

Желательно так чтобы можно было писать backend на С, a frontend на С++

Почему такое ограничение? Можно зафигачить оба на плюсах и применить REST. Хотя в суть проекта я не вникал...

UVV ★★★★★
()
Ответ на: комментарий от XMs

Спасибо, как раз сам до этого дошел. Написал калькулятор с cli и ncurses, принцип тот же, что и выше. Сразу пробовал другие способы, но выходил костыль. Уже все прояснилось, считайте тему закрытой.

nikitosios20031
() автор топика
Ответ на: комментарий от anonymous

15 лет назад было модно под онтопиком генерировать код из IDL? ПЛ моему тогда тупо парсили вывод программы...

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

Рест с вебом связан разве что с помощью http.

UVV ★★★★★
()
Ответ на: комментарий от tailgunner

Ага и вместо ноомалного IPC поднимать вэбснрвер и городить рест на пэхапэ. А GUI писать через qwebengine... Какой-то кошмар... Брр.

invy ★★★★★
()
Ответ на: комментарий от invy

Ага и вместо ноомалного IPC поднимать вэбснрвер

Чем тебе REST не нормальный IPC?

и городить рест на пэхапэ

Пиши на Rust %)

А GUI писать через qwebengine... Какой-то кошмар...

И что кошмарного? HTML + CSS - это просто еще один GUI-тулкит.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

HTML + CSS - это просто еще один GUI-тулкит.

Ещё бы не требовался практически полноценный браузер для его использования.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Люди работают над этим - Sciter, Modest. Может, на основе Servo что-то будет.

tailgunner ★★★★★
()
Ответ на: комментарий от invy

Причём здесь «рест на пэхапэ». У нас был вполне себе rest на плюсах и никакой веб сервер там не нужен. Есть библиотеки с HTTP классами Не всегда они покрывают на все 100% твои требования по фичам и производительности, конечно, но тем не менее. В том проекте, мы таки отказались от библиотеки и написали свою http часть на boost asio, емнип, поскольку упёрлись в производительность библиотеки. Получалось что front и backend как бы части распределённой системы. Хочешь, на одной машине оба запускай. Хочешь - на разных.

UVV ★★★★★
()
Ответ на: комментарий от UVV

http - лишняя сущность. Есть сокеты, shared memory, dbus в конце концов. Вместо json'а есть куда более адекватный ptb, где хотя бы меньше бойлерплейта.

Главное что все это по-хорошему писать вообще не надо. Вон, есть тот же commonapi: https://at.projects.genivi.org/wiki/pages/viewpage.action?pageId=5472316

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)

если есть API и «ядро» отлажено, то делаешь GUI фронтенд на Tk и не жужжишь :-) получается нативная программулина для всех популярных платформ.

MKuznetsov ★★★★★
()
Ответ на: комментарий от invy

так или иначе любой комм. софт это будет рест напохапе. если до релиза дойдет.

anonymous
()
Ответ на: комментарий от invy

http - лишняя сущность

давайте строить API над D-Bus

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

В первой части варианты shared memory и sockets и _в конце концов_ dbus. CommonAPI умеет еще someip, а при желании можно написать и свой бэкэнд. Прелесть именно в кодогенерации.

https://at.projects.genivi.org/wiki/pages/viewpage.action?pageId=5472320

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

В первой части варианты shared memory и sockets и _в конце концов_ dbus.

А поверх сокета наверняка свой протокол. Почему он не лишняя сущность?

tailgunner ★★★★★
()

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.