Question

Il s'agit d'un logiciel de conception.

Est-ce une bonne idée d'utiliser la #si la directive du compilateur pour prendre en charge plusieurs plates-formes.Par exemple, j'ai trois fichiers:

IScreen.cs

public interface IScreen {
   ...
}

ScreenWin.cs

#if WIN

public class Screen : IScreen {
  ...
}

#endif

ScreenMac.cs

#if WIN

public class Screen : IScreen {
   ...
}

#endif

Ce qui semble cool à ce sujet est que je peux utiliser la BDD et avoir quelque chose comme:

Given a Screen exists with width: 1920 and height: 1080

et le bon Écran serait utilisé sur la base de la directive du compilateur.

Cela semble que vous aussi obtenir de meilleures performances que d'essayer d'utiliser un résumé de l'usine.

Quels sont les inconvénients?

Était-ce utile?

La solution

Comme @Oded a répondu, le bas-sode de l'aide au moment de la compilation directoves est que vous devez compiler un binaire spécifique à chaque plateforme.Le côté positif, c'est que vous n'avez pas un ballonnement de one-size-fits-all application qui est plus gros et plus lent sur chaque plate-forme juste, car il est indépendant de la plateforme.

Un autre bas-côté de la #, si, c'est que beaucoup de Visual Studio tools seulement tenir compte de la "actuellement active" du code.Par exemple, intellisense et le refactoring - si vous souhaitez renommer IScreen en IDisplay, alors que vous pouvez trouver refactoring travaillé et tous vos PC code a été mis à jour à merveille, mais tous vos Mac code serait gravement mis à mal, comme le refactoring n'auraient tout simplement pas "voir" le code de la branche.De même, il est facile de faire une modification dans le code sur le PC de branche et d'oublier de faire le changement correspondant à la Mac de la branche, de nouveau de le casser.

L'avantage d'une usine au lieu de "#if" est que d'une seule image binaire peut éventuellement être exécuté sur chaque plate-forme, et vous avez uniquement besoin de vérifier la plate-forme hôte une fois lors de la création de la mise en œuvre concrète (c'est donc toujours très efficace lors de l'exécution, mais sera plus importante que vous devez expédier toutes la plate-forme des variantes à l'intérieur d'une distribution)

Toutefois, il est possible d'obtenir le meilleur des deux mondes en utilisant une plus modulaire modèle de conception au lieu de #if:utiliser un assembly satellite pour la plate-forme des implémentations spécifiques.Dans cette approche, le code de l'application principale sera de spécifier le IScreen interface, et puis vous auriez Béton Screen (Mac) et Screen (PC) classes distinctes de la plate-forme spécifique des variantes d'un ScreenImplementation.dll de l'assemblée.Vous pouvez également expédier un installateur unique qui couvre toutes les plates-formes (par simplement le déploiement de la dll satellite appropriée pour la plate-forme hôte).Cela vous donne de l'efficacité marginale/taille de l'amélioration de l'utilisation de la #, si, mais withut avoir à gâcher votre code avec des conditions.(Bien sûr, cette approche modulaire de sens à la fois avec le #if et de l'Usine dessins, ils deviennent de plus d'une option de déploiement, plutôt que le cœur de la mise en œuvre de l'architecture une fois que vous divisez la plate-forme des implémentations spécifiques dans des assemblées distinctes)

Autres conseils

Les inconvénients comprennent la compilation de plusieurs binaires - une par plate-forme.

Si ce n'est pas prudent, vous risquez de finir par encombrer votre code avec la directive de préprocesseur dans de nombreuses parties de votre code.Voir Ce donc question sur l'inversion d'une telle basebase.

Si vous pouvez détecter la plate-forme dans le code, c'est une meilleure approche.

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