Welcher Ansatz sollte für die Entwicklung von Anwendungen für mehrere Plattformen verfolgt werden?


9

Für Anwendungen, die auf mehrere Plattformen abzielen, sehe ich hauptsächlich zwei Entwicklungsansätze:

  • Entscheiden Sie sich für eine JAVA-ähnliche Entwicklungsplattform. Haben Sie eine Codelösung und lassen Sie die Zwischenlaufzeit verschiedene Plattformen handhaben. Wenn auf einer Plattform etwas schief geht, ändern Sie den Code ein wenig. Aber halte es für alle gleich.

  • Erstellen Sie modularen Code, der die Kernlogik und die Benutzeroberfläche voneinander trennt. Entwickeln Sie separate Benutzeroberflächen für die jeweiligen Plattformen, die dieselben Kernbibliotheken aufrufen. Erstellen Sie die Anwendung für jede Zielplattform separat.

Also, welchem ​​soll ich folgen? Ich weiß, die Antwort beginnt mit " Es kommt darauf an ". Ich möchte jedoch Ihre Meinung zu diesen Ansätzen und den Faktoren hören, die bei der Auswahl eines dieser Ansätze zu berücksichtigen sind.


2
Diese Frage kann nicht beantwortet werden, ohne "es kommt darauf an" zu verwenden. Es hängt von so vielen Faktoren ab, wie z. B. den tatsächlichen Plattformen, an die Sie denken, ob Sie eine eigenständige Desktop-Anwendung planen oder die Verwendung einiger Webdienste planen. Welche Pläne haben Sie für die Benutzeroberfläche (für jede Plattform gleich oder unterschiedlich?) Und bald. Denken Sie, dass das Qt- oder Gtk-Entwicklungsmodell auf das erste Modell fällt oder nicht? Was ist mit .Net und Mono? Soll ich fortfahren...?
Paweł Dyda

@ Gulshan Entschuldigung, offensichtliche Frage - gibt es einen Grund, warum dies keine Webanwendung sein kann und / oder mit so etwas wie Adobe Air gemacht wurde?
Quallenbaum

Diese Seite ist eher für subjektive Fragen und Antworten gedacht, kann aber auch Gründe für die Akzeptanz sein. Wir haben nur das Gefühl, dass Sie mitspielen. Ich neige dazu, nach kürzlich gestellten Fragen zu suchen und nicht nach unbeantworteten.
JeffO

Antworten:


3

Abgesehen von den aktuellen Streitigkeiten zwischen Oracle, Apache und Google ist es immer noch schwer, die JVM für diesen Zweck zu schlagen. Es ist wirklich sehr hochwertig auf den meisten Plattformen, universell, und Sie haben eine gute Anzahl von Sprachen zur Auswahl (Java, Clojure, Scala usw.). Damit können Sie auf eine einzelne Maschinenarchitektur (die VM) abzielen und sich nicht zu viele Gedanken über die spezifische Endbenutzerhardware machen.

Es gibt jedoch bestimmte Anwendungstypen, für die es möglicherweise nicht so geeignet ist: Netzwerke auf niedriger Ebene kommen in den Sinn, ebenso wie umfangreiche Grafik- / Videoverarbeitung.


2

Gehen Sie für HTML5. Jede Plattform mit einem HTML5-Browser kann Ihre Anwendung ausführen. Obwohl HTML5 noch nicht für große Zeit bereit ist, ist der Webanwendungsansatz.


2
Es gibt keine vollständigen HTML5-Browser.
Craig

2

Im Audacity Sound Editor verwenden wir wxWidgets als plattformübergreifende Bibliothek. Da wir eine Verbindung zu C-Bibliotheken herstellen müssen und Geschwindigkeit und Zugriff auf niedriger Ebene benötigen, würde ein JVM-Ansatz für uns nicht funktionieren. Der GUI-Code ist auf allen Plattformen zu 95% gleich. Wir verwenden #ifdefs für die kleinen Variationen. Wir finden es jedoch wichtig, dass ein Entwickler auf jeder der drei Plattformen (Mac, Windows Linux) arbeitet, da es selbst bei Verwendung der plattformübergreifenden Bibliothek zu einfach ist, auf einem Computer Änderungen vorzunehmen, um auf einem anderen Computer Probleme zu verursachen.

Wenn Sie die Leistung erhalten, die Sie benötigen, wählen Sie JVM. Wenn Sie nicht können, verwenden Sie QT oder wxWidgets, und ich würde QT gegenüber wxWidgets vorschlagen, da es weniger Arbeit ist, es schön aussehen zu lassen.


1
+1 für "unerlässlich, damit ein Entwickler auf jeder Plattform arbeitet". Plattformübergreifende Projekte werden schnell zu einer einzigen Plattform, wenn Sie jeweils nur für eine Plattform entwickeln.
AShelly

2

Als Echtzeitentwickler habe ich erfolgreich eine Option ähnlich 2 verwendet - separate plattformspezifische Module mit einer gemeinsamen API, die von der Kernlogik verwendet wird. Nichts, was ich getan habe, hatte eine Benutzeroberfläche - Netzwerk, Audio, Daten-Streaming - in diesem Fall ist es die plattformspezifische Hardware-Schnittstelle auf niedriger Ebene.

Ich habe es aus mehreren Gründen so gemacht:

1) Um auf jeder Plattform die optimale Leistung zu erzielen

2) Um die Funktionen zu nutzen, die nur auf einer Plattform angeboten werden

3) (J) Für einige Plattformen (eingebettete Systeme, Spielekonsolen ...) gab es keine VMs.


2

Es kommt darauf an, was dir wichtig ist :)

Als wir vor ungefähr 10 Jahren vor dieser Wahl für eine plattformübergreifende Mac / Windows-App standen, haben wir uns die verschiedenen plattformübergreifenden Optionen - Java, Qt, wxWidgets usw. - genau angesehen. Das Problem war das Erscheinungsbild Die Benutzeroberfläche war für uns sehr wichtig, und alle "plattformübergreifenden" Apps sahen kompromittiert aus. Am Ende haben wir die Kugel gebissen und unseren eigenen plattformübergreifenden Kern mit einer benutzerdefinierten Benutzeroberfläche für jede Plattform aufgebaut (geschrieben in PowerPlant für Mac und MFC unter Windows). Im Laufe der Zeit sind wir ziemlich gut darin geworden, und der "plattformübergreifende" Teil ist dicker geworden, ohne die Benutzeroberfläche zu beeinträchtigen.

Wir prüfen diese Entscheidung jetzt erneut für ein neues Projekt. Wenn ich mir jetzt die Optionen anschaue, würde ich wahrscheinlich mit Qt gehen - es ist kostenlos und scheint wirklich gut gereift zu sein. Java könnte eine Option gewesen sein, aber wir können den Leistungseinbruch nicht wirklich ertragen (wir machen 3D-Bildverarbeitung).

Wenn die Benutzeroberfläche für Sie wirklich wichtig ist, müssen Sie vermutlich viel Zeit investieren, um die Dinge auf jeder Plattform richtig aussehen zu lassen, egal ob Sie etwas wie Qt verwenden oder Ihre eigenen rollen. Für eine interne oder spezialisierte App, in der Benutzer eine weniger ausgefeilte Benutzeroberfläche möglicherweise eher akzeptieren, ist dies möglicherweise in Ordnung!


1

Jeder macht große Aufregung darüber, dass Sprachen wie Java "plattformübergreifend" sind, aber was sie wirklich sagen, ist, dass Sie einmal kompilieren und überall ausführen können. Selbst in einer Sprache wie Java (oder C # / Mono) benötigen Sie noch Abstraktionsschichten, um in einigen Bereichen mit betriebssystemspezifischen Details umgehen zu können.

C ++ und in der Tat die meisten Sprachen sind plattformübergreifend. Sie müssen nur kompilieren, um auf jede Plattform abzuzielen.

Der Schlüssel ist eher der Prozess als die Werkzeuge / Sprachen:

  1. Stellen Sie sicher, dass Sie über einen integrierten Erstellungsprozess verfügen, mit dem die Komponententests für alle Zielplattformen erstellt und ausgeführt werden .
  2. Stellen Sie sicher, dass jeder Entwickler auf allen Zielplattformen testet, bevor Sie Code einchecken. Dies bedeutet natürlich, dass jeder Entwickler Zugriff auf die entsprechende Anzahl von Computern / VMs hat.
  3. Gut abstrakt. Abstrakt alles, was in native apis ruft. Schreiben Sie Bibliotheken, die diese Aufrufe umschließen.
  4. Wenn Sie etwas anderes als eine recht einfache Formularbenutzeroberfläche tun, die nur dem kleinsten gemeinsamen Nenner entspricht, akzeptieren Sie einfach, dass der GUI-Code nicht plattformübergreifend ist. Abstraktieren Sie Ihre GUI / Präsentationsschicht und codieren Sie sie für jede Plattform separat. Ja, es gibt plattformübergreifende GUI-Toolkits, die für einfache Apps in Ordnung sind. Wenn Sie jedoch etwas Fortgeschritteneres tun, sollten Sie die nativen Plattformfunktionen codieren.

Diese Schritte sind unabhängig von der verwendeten Sprache / Toolset / Framework gleich.


1

Nutzen Sie das Web!

Im Ernst, wenn Sie das Beste für Ihr Geld wollen, schreiben Sie eine Webanwendung.

Warum?

  • Web-Clients benötigen normalerweise nicht viel PC-Leistung.
  • Web-Clients sind überall. Nicht nur PC / MAC / Linux, sondern auch Telefone, Mobilgeräte und mehr.
  • Nichts extra zum Herunterladen für Benutzer! (In der Regel, es sei denn, Sie möchten etwas Besonderes und verwenden Flash oder Silverlight.)
  • Alle gängigen Komponenten befinden sich auf der Serverseite und können Java, .NET, PHP oder eine Ansammlung vorhandener Komponenten sein. Der Kunde sollte sich nicht darum kümmern!

Sogar die beiden von Ihnen erwähnten Ansätze sind sehr ähnlich. Der Webbrowser rendert HTML für mehrere zugrunde liegende Architekturen. In ähnlicher Weise interpretiert die JVM Java-Code so, dass er für die zugrunde liegende Hardware sinnvoll ist. Das Web hat jedoch einfach eine breitere Kundenbasis!


0

Ich hatte ziemlich viel Glück mit Mono. Ich kann für Windows-Computer den gleichen Code schreiben wie für Linux-Computer, und zum größten Teil funktioniert er auf beiden. Und ich kann die Fähigkeiten nutzen, die ich bereits in C # und Winforms kenne.


Welche Benutzeroberfläche verwenden Sie oder meinen Sie für serverbasierte Apps? Ich bin neugierig, weil ich eine funktionierende App habe, die Winforms verwendet, und ich habe auf Mono portiert und es ist schön, aber es würde eine RIESIGE Menge Arbeit erfordern, um wie die "echten" Winforms zu sein. Vielleicht ist GTK # besser? MonoDevelop ist nett, aber vielleicht etwas klobig.
Dan Rosenstark

Mit Mono können beide Ansätze verfolgt werden. Wie Yar, welchem ​​folgst du und warum? Das ist hier die Frage.
Gulshan

Ja, ich wusste nicht, dass Sie nach perfekter Formtreue zwischen Plattformen suchen. Sie erhalten das vielleicht mit GTK #, aber Sie bekommen es auf Kosten von "hübsch", weil ein solches gemeinsames Toolkit den "kleinsten gemeinsamen Nenner" haben muss. Ich bin geneigt, StartClass0830 zuzustimmen: HTML5 wäre eine Menge Arbeit, aber Sie könnten einige wirklich coole plattformübergreifende Dinge damit machen.
Robert Harvey

0

Machen Sie zuerst einen Proof of Concept.

Wenn es sich um eine relativ komplexe Anwendung handelt, erhalten Sie durch das Ausarbeiten eines Proof-of-Concept eine Vorstellung davon, welche Sprachfunktionen Sie benötigen und welche Bereiche Sie benötigen, um Framework- oder Drittanbieter-Bibliotheken zu nutzen.

Die Sprachfunktionen und Bibliotheken, die Sie benötigen, bestimmen, welche Sprache Sie am Ende auswählen (und wie Sie sich dem plattformübergreifenden Support nähern).


0

Ich habe vor 15 Jahren ein System erstellt, beginnend mit einer Desktop-App, als Java noch in den Kinderschuhen steckte und nicht für die Erstellung solcher Apps bereit war. Ich wusste, dass ich einen Kern in C ++ haben musste, und habe ihn von Anfang an plattformübergreifend gestaltet, einschließlich der Verwendung von Größen (z. B. int32 anstelle von int oder long), damit er unter Mac, Windows und UNIX (vor Linux) ausgeführt werden kann Tage).

Zu der Zeit, als ich versuchte, nach einer guten plattformübergreifenden UI-Umgebung zu suchen, gab es einige, darunter XVT. Ich habe das Training für XVT durchlaufen und als ich anfing, eine echte App zu erstellen, wurde mir klar, dass ich auf der Plattform (beginnend mit dem Mac) kein sauberes, natives Erscheinungsbild erstellen konnte. Also gab ich diese Idee auf und baute eine native Mac-Benutzeroberfläche (PowerPlant) auf dem tragbaren Kern.

Einige Jahre später wechselten wir zu Windows (UI in MFC). Beim zweiten Mal war es schneller, eine Benutzeroberfläche zu erstellen. Wir haben für kurze Zeit eine Mac- und eine Windows-Benutzeroberfläche parallel gewartet und sind dann zu Windows übergegangen. Der Kern wechselte später zu verschiedenen UNIX- und Linux-Varianten, damit wir serverbasierte Berechnungen ausführen können. Der Core hat sich gut portiert, mit einigen Anpassungen, als wir ihn 64-Bit-fähig gemacht haben.

Jetzt benutze ich wieder einen Mac und ich wünschte, wir könnten zum Mac zurückkehren, aber die Größe und Komplexität der App machen dies zu einer schwierigen Wahl. Es ist immer noch sinnvoll, dass ein Großteil dieser App eine Desktop-App ist - es ist wie eine CAD-Umgebung. Aber anstatt die Benutzeroberfläche erneut in einer plattformspezifischen C / C ++ - Sprache zu erstellen (und weiterhin eine MFC-basierte Benutzeroberfläche beizubehalten), bin ich eher geneigt, den gesamten Stapel in Java neu zu schreiben, damit er auf mehreren Plattformen ausgeführt werden kann.

Es kann immer noch Gründe geben, einen Nicht-Java-Kern auszuführen, beispielsweise C ++. Aber ich würde gerne frühzeitige Leistungstests durchführen, um zu sehen, ob dies wirklich erforderlich ist. Und ich würde meine Benutzeroberfläche sorgfältig prüfen, um festzustellen, ob ich sie als Web-App erstellen könnte, die über Webdienste mit dem Kern verbunden ist, sodass ich eine Reihe von Clients haben kann - Desktop-Apps, mobile Apps, Web-Apps usw. Wenn ich ein Stück in C oder C ++ brauchte, könnte es unter einer Java-Ebene geschrieben werden? Oder als Webdienst?

Noch eine Überlegung - wie lange wird Ihre App noch verfügbar sein? Wie komplex wird es werden? Wenn Sie Ideen dazu haben, sollten Sie die mögliche Langlebigkeit der von Ihnen verwendeten UI-Bibliotheken und Ihre Fähigkeit im Laufe der Zeit berücksichtigen, dass Mitarbeiter bei deren Wartung helfen. Dies mag jetzt schwer zu überlegen sein, ist aber einen Gedanken wert.

-- Alex


Die JVM hat sich hinsichtlich der Abwärtskompatibilität der Laufzeitbibliothek als sehr stabil erwiesen. Für dieses Szenario wäre es sehr gut geeignet gewesen ...

0

Wenn Sie es zu einer Web-App machen können, machen Sie es zu einer Web-App. Mit Toolkits wie ExtJS ist es relativ einfach, gut aussehende GUI-ähnliche browserübergreifende Benutzeroberflächen zu erstellen.

Andernfalls sind Java oder QT + C ++ oder C + Wx mögliche Optionen, um eine Quelle für alle zu haben.

Ihr zweiter Ansatz ist geeignet, wenn die App auf jeder Zielplattform nativ aussehen und sich nativ anfühlen soll. Native Mac-Apps sehen anders aus und fühlen sich anders an als native Windows-Apps. Die Verwendung eines anderen Skins und von Keybinds reicht nicht aus, um dies abzudecken.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.