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.
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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!
quelle
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:
Diese Schritte sind unabhängig von der verwendeten Sprache / Toolset / Framework gleich.
quelle
Nutzen Sie das Web!
Im Ernst, wenn Sie das Beste für Ihr Geld wollen, schreiben Sie eine Webanwendung.
Warum?
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!
quelle
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.
quelle
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).
quelle
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
quelle
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.
quelle