Quelle est la meilleure approche en termes de modularité et d’indépendance de la plateforme ?

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

  •  09-06-2019
  •  | 
  •  

Question

J’espère que cette question ne paraît pas aussi large qu’il y paraît au premier abord.Je conçois une application logicielle dans mon <sarcasm>volumineux</sarcasm> temps libre.J'aimerais qu'il soit à la fois multiplateforme et modulaire.À ce stade, comme je suis encore en phase de planification, je peux choisir pratiquement n'importe quel langage et ensemble d'outils.

Cela rend les choses plus difficiles, pas plus faciles, car il existe apparemment de nombreuses façons d'atteindre les deux objectifs (modularité, agnosticisme de la plate-forme).

Mon principe de base est que la sécurité, le stockage des données, l'interaction avec le système d'exploitation et la configuration doivent tous être gérés par une application "conteneur" - mais la plupart des autres fonctionnalités seront fournies via des modules plug-in.Si je devais le décrire à un niveau élevé (sans dévoiler complètement mon idée), ce serait une seule application capable d'effectuer de nombreuses tâches différentes, toutes dédiées au même objectif (il y a beaucoup de choses disparates à faire, mais toutes les données doivent interagir et être hautement disponibles).

Ce n’est pas une idée nouvelle et pas particulièrement exotique.Pourtant, je ne me demande pas tant comment le faire (je peux penser à de nombreuses façons), mais quelle méthode est la meilleure.

Par exemple, je sais qu'Eclipse incarne pratiquement ce que je décris, mais je trouve que les applications Java en général (et Eclipse ne fait pas exception) sont trop volumineuses et trop lentes pour ce dont j'ai besoin.Idem pour les applications de bureau écrites en Python et Ruby (qui sont d'excellents langages !)

Cela ne me dérange pas de recompiler la base de code pour différentes plates-formes en tant qu'exécutables natifs.Pourtant, C et C++ ont leurs propres problèmes.

En tant que développeur C#, j'ai une préférence pour le code managé.Mais je ne suis pas encore du tout convaincu par Mono (je pourrais en être convaincu).

Quelqu'un a-t-il des idées/expériences/frameworks préférés spécifiques à partager ?

Était-ce utile?

La solution

Juste pour citer un exemple :pour les applications .NET, il existe le CAB (Composite Application Block) et le Composite Application Guidance pour WPF.Les deux sont principalement des implémentations d'un ensemble de plusieurs modèles de conception axés sur la modularité et le couplage lâche entre les composants similaires à une architecture de plug-in :vous disposez d'un framework IOC, de classes de base MVC, d'un courtier d'événements faiblement couplé, d'un chargement dynamique de modules et d'autres éléments.

Je suppose donc que ce type d’infrastructure de modèles est ce que vous essayez de trouver, mais pas spécifiquement pour .NET.Mais si vous considérez le CAB comme un ensemble d'implémentations de modèles, vous pouvez constater que presque tous les langages et plates-formes disposent d'une forme de framework déjà intégré ou tiers pour des modèles individuels.

Donc mon avis serait :

  1. Étudiez (si vous n'êtes pas familier avec) certains de ces modèles de conception.Vous pouvez prendre comme exemple le framework CAB pour la documentation WPF : Modèles dans la bibliothèque d'applications composites
  2. Concevez votre architecture en pensant aux modèles qui, selon vous, seraient utiles pour ce que vous souhaitez réaliser. d'abord sans réfléchir à des implémentations de modèles ou à des produits spécifiques.
  3. Une fois que vous avez défini plus spécifiquement vos « exigences architecturales », recherchez des cadres individuels qui aident à réaliser chacun de ces modèles/fonctionnalités pour le langage que vous décidez d'utiliser et créez votre propre cadre d'application en fonction de ceux-ci.

Je suis d’accord que le plus dur est de rendre toute cette plateforme indépendante.Je ne peux vraiment pas penser à une autre solution pour choisir un langage mature indépendant de la plate-forme comme Java.

Autres conseils

Envisagez-vous une application de bureau ou Web ?

Tout le monde ici semble penser que Mono est génial, mais je ne pense toujours pas qu'il soit prêt pour une utilisation industrielle, j'assimilerais mono à l'endroit où se trouve le vin, excellente idée ;quand ça marche, ça marche bien, et quand ça ne marche pas... et bien, tu n'as pas de chance.mod_mono pour Apache est extrêmement problématique et difficile à faire fonctionner correctement.

Si vous visez le bureau, rien ne vaut le framework Eclipse RCP (Rich Client Platform) : http://wiki.eclipse.org/index.php/Rich_Client_Platform.

Vous pouvez créer Windows, Linux, Mac sous le même code et tous les composants de l'interface utilisateur sont natifs du système d'exploitation.Et RCP gagne haut la main en modularité, il a une architecture de plug-in inégalée (d'après ce que j'ai vu)

Je travaille avec RCP depuis un an et demi maintenant et je ne sais pas par quoi d'autre pourrait le remplacer, il est n°1 dans son créneau.

Si vous êtes totalement opposé à Java, j'examinerais wxWidgets avec Python ou C++

Si vous souhaitez être indépendant de la plate-forme, vous devrez alors faire un compromis entre performances et effort de développement.C++ est peut-être plus rapide que Java (c'est discutable FWIW), mais vous obtiendrez beaucoup plus facilement l'indépendance de la plate-forme avec Java.Python et Ruby sont dans le même bateau.

Je doute que .NET soit beaucoup plus rapide que Java (ce sont deux langages VM après tout), mais le gros problème avec .NET est l'indépendance de la plate-forme.Mono a un objectif noble et des résultats étonnamment bons jusqu'à présent, mais il le fera toujours je rattraperai Microsoft sur Windows.Vous pourrez peut-être accepter ses limites, mais ce n'est toujours pas la même chose que d'avoir des environnements multiplateformes identiques à ceux de Java, Python et Ruby.Aussi:les outils de développement et de support .NET sont fortement orientés vers Windows, et le seront probablement toujours.

OMI, votre meilleur pari est de cibler Java...ou, à tout le moins, la JVM.Si vous n'aimez pas le langage Java (et en tant que développeur C#, je suppose que ce n'est pas le cas), vous avez au moins des options comme Jython, JRuby et Scala.Avec la JVM, vous bénéficiez d'une très bonne indépendance de plateforme, de bonnes performances et d'un accès à un grand nombre de bibliothèques et d'outils de support.Il existe presque toujours une bibliothèque, un port ou une implémentation Java qui fera ce dont vous avez besoin.Je ne pense pas qu'aucune autre plate-forme n'offre le même nombre d'options ;cette flexibilité a une réelle valeur.

Quant à la modularité :il s'agit davantage de la manière dont vous créez le logiciel que de la plate-forme que vous utilisez.Je ne connais pas grand-chose aux architectures de plugins telles que vous les décrivez, mais je suppose que cela sera possible sur à peu près n'importe quelle plate-forme moderne que vous choisirez.

Si vous envisagez de développer Python, vous pouvez toujours utiliser pyrex pour optimiser certaines des parties les plus lentes.

Avec mon expérience limitée en Mono, je peux dire que j'y suis assez convaincu.Le fait qu'il y ait un développement actif et de nombreux efforts continus pour le mettre à niveau avec les dernières technologies .Net est encourageant.Il est incroyablement utile de pouvoir utiliser les compétences .Net existantes sur plusieurs plateformes.J'ai eu des problèmes similaires avec les performances lorsque j'ai tenté d'accomplir certaines tâches de base dans Python + PyGTK - peut-être qu'elles peuvent être exécutées entre de bonnes mains, mais il est agréable de ne pas avoir à se soucier des performances 90 % du temps.

Pour les applications de bureau, l'écrire dans un langage interprété et utiliser une boîte à outils d'interface utilisateur multiplateforme comme wxWidgets vous permettra de faire un long chemin vers l'indépendance de la plateforme (vous devez juste faire attention à ne pas utiliser d'autres modules qui ne sont pas multiplateformes). , utilisez des choses comme celles de Python os.path module, au lieu de faire des choses comme config_path = "/home/$USER")

Cela dit, pour faire un bien application multiplateforme, vous devrez faire certaines choses différemment sur chaque plateforme.

Par exemple, OS X est probablement le plus différent - les préférences sont généralement stockées dans ~/Library/Prefernces/ en tant que .plists, les interfaces utilisateur sont généralement basées sur des fenêtres flottantes, avec une seule barre de menu ancrée en haut de l'écran.

Je suppose que c'est là que la modularité entre en jeu.Avec l'exemple de préférences ci-dessus, vous pourriez avoir une classe UserConfig, dont vous disposez de versions spécifiques au système d'exploitation.Celui de Windows stocke les données de configuration dans le dossier approprié Application Data dossier ou le registre.Celui de Mac OS utilise des fichiers .plist sur ~/Library/Preferences/, et celui d'Unix utilise ~/.dotfiles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top