2009-09-09 7 views
3

Sur un projet ciblant autant de téléphones à fonctions que possible (Nokia 3110 Classic, Samsung E250, Motorola SLVR L7, etc.), comment devrait-il être conçu à un niveau élevé en termes de structure de code? Je ne parle pas du soutien par combiné, car nous utilisons le polonais pour cela. Je suis un développeur C# expérimenté qui passe au développement J2ME au sein de mon entreprise. Il y a quelques mois, la direction a embauché un développeur senior J2ME, car les développeurs existants n'avaient aucune expérience J2ME. Je rejoins maintenant cette équipe avec un autre développeur C#, et nous avons tous les deux des réserves sur ce que nous voyons. Alors que le logiciel fonctionne et répond aux exigences de l'entreprise, la conception de l'application me semble totalement erronée. Plutôt que d'utiliser OO, la plupart du code est composé de méthodes statiques et de constantes, et est dans le moins de classes possibles (15, pour autant que je sache), à ​​cause des "contraintes de mémoire sur les combinés". Certains d'entre eux sont des milliers de lignes. Apparemment, aucun des éléments d'interface utilisateur intégrés n'est utilisé à l'exception de Canvas, car ils "ne fournissent pas assez de contrôle". Toutes les formes/fenêtres/pages (pas sûr du bon terme) ont une méthode statique dans une classe, dans laquelle nous avons le code pour mettre en place l'interface utilisateur de ce formulaire/fenêtre/page. Il se présente comme suit:Bon projet J2ME

UiElement items[] = new UiElement[8 + (fieldCount * 4)]; 
int y = 0; 
items[y++] = new UiElement("name", UiElement.TYPE_TEXT_FIELD, "Name", TextField.ANY, true, "", true, null, -1, 0); 
items[y++] = new UiElement("address", UiElement.TYPE_TEXT_FIELD, "Mobile", TextField.PHONENUMBER, true, "", true, null, -1, 0); 
// ... 
items[y++] = UiElement.LINE; 
items[y++] = new UiElement("button", UiElement.TYPE_BUTTON, "Save", -1, false, "", true, null, UiElement.TYPE_LINK, ActionHandler.LINK_UPDATE_USER); 
items[y++] = new UiElement("", UiElement.TYPE_RED_BUTTON, "Delete user", -1, false, "", true, null, UiElement.TYPE_LINK, ActionHandler.LINK_DELETE_USER); 
items[y++] = UiElement.LINE; 
items[y++] = new UiElement("", UiElement.TYPE_LINK_ARROWS, "Back to choose category", 0, false, "", true, null, -1, ActionHandler.LINK_MC_SELECT_CATEGORY); 
items[y++] = UiElement.LINE; 

Le constructeur principal UIElement est

public UiElement(String RMSref, int inputType, String displayText, int additionalInputType, boolean mandatory, String aditional, boolean selectable, Image img, int displayType, int actionLink) 

A la fin de cela, un appel est fait pour enregistrer le tableau des éléments sur une classe qui étend la toile. Cette classe a une méthode de peinture avec un énorme bloc de commutation, qui se branche sur inputType de UiElement. De là, il va à une méthode statique sur la classe "graphics", qui a des méthodes pour chaque type différent de "contrôle" pour gérer la peinture de ce "contrôle". En fait, il semble que tout soit procédural quand il le peut, et n'utilise OO que lorsqu'il le faut. J'ai demandé au senior dev pourquoi nous n'avons pas de classe Control de base, puis des sous-classes, chacune avec une peinture autonome, des propriétés, etc., au lieu de cette classe générique UiElement, et c'est apparemment parce que beaucoup de classes utiliser trop de mémoire. On m'a également dit que certains téléphones ont des temps d'exécution Java buggés, de sorte qu'ils ne libèrent pas la mémoire correctement. C'est aussi la raison pour laquelle il n'y a qu'un seul Canvas.

Comme autre exemple, toute la sortie de texte est effectuée à l'aide de polices bitmap, plutôt que d'utiliser le rendu interne des polices du téléphone. On nous a dit que c'est pour fournir un rendu uniforme à travers les combinés, plutôt que de compter sur leurs polices et tailles internes.

Est-ce la bonne façon de le faire? Les choses qu'on nous a dit sont-elles correctes? J'espère essayer d'éviter ce tournant dans une soumission à TheDailyWTF.

+1

Je voudrais écouter votre développeur J2ME senior car il semble qu'il sait exactement ce qu'il fait pour la plate-forme cible. Et, espérons qu'il ne voit pas cela comme étant vraiment insultant de dire que son design, qui est exactement ce que tout bon J2ME ferait, devrait être un Daily WTF. – Fostah

+0

En relisant ma question, elle a commencé à lire comme un article de TDWTF, ne manquant que la phrase typique de "Et personne ne savait mieux jusqu'à ce qu'il soit trop tard." C'est pourquoi je demande - honnêtement, je ne connais pas mieux, et je suis heureux de savoir si son modèle est la bonne façon de faire les choses. Je ne veux pas dire que c'est une attaque contre lui, et je suis désolé si cela se présente de cette façon. –

Répondre

5

bienvenue dans le monde de j2me.

Les choses se sont améliorées un peu au fil du temps.Mais ce que vous voyez est en fait la façon de faire des choses sur le plus vieux des téléphones (en particulier Nokia série 40 (génération 1)) et anciens samsungs. C'est un fait que toute classe ajoutée fera augmenter la taille de votre pot. Et puisque certains téléphones imposent une limite de 64 Ko, tout octet compte.

Si ces anciens téléphones ne sont plus ciblés, vous pouvez abandonner cette ancienne pratique et aller plus de la manière OO.

Les polices bitmap sont également vraies. Sur chaque marque de téléphone (même les différents modèles de la même marque) les tailles de polices propres au téléphone varient énormément. Sur un Motorola si l'on demande une petite police, on obtient une énorme police. Mieux encore, toute police demandée sur le motorola est énorme et impraticable. Les avantages et les inconvénients des polices de téléphone: - Les polices de téléphone ne coûtent pas de précieuse mémoire jar. Les polices bitmap sont coûteuses - Les polices bitmap se ressemblent sur n'importe quel téléphone - Les polices de téléphone peuvent être dessinées dans n'importe quelle couleur (les polices bitmap doivent être incluses double si vous voulez les avoir en 2 couleurs). - Les derniers téléphones Nokia dessinent réellement les polices de téléphone anti aliasé donnant de très bons résultats. Les polices Bitmp ne seront jamais anti-aliasées à moins qu'elles ne le soient déjà dans le bitmap, ce qui signifie que vous ne pouvez les utiliser que sur une couleur d'arrière-plan (celle qui est anti-aliasée aussi).

De toute façon, il semble que vous avez un développeur là-bas avec beaucoup d'expérience (bagages?) De codage j2me. Peut-être un peu trop. Si vous n'avez pas besoin de cibler d'anciens téléphones, nettoyez le code et rendez-le plus moderne.

+0

Bitmap La police peut être palettisée, ainsi vous pouvez économiser l'espace de Jar. Même le Blackberry 8320 pas si vieux a beaucoup de problèmes tout en ayant un grand nombre de classes. Si vous lisez leur documentation développeur, vous trouverez des choses comme "Ne pas utiliser les interfaces" – Azlam

+0

azlam: ils le peuvent, mais cela signifie que vous devez changer la palette au moment de l'instanciation de l'image, et avoir essentiellement 2 copies non compressées en mémoire en même temps. Donc, si la mémoire d'exécution est limitée, cette approche a aussi sa part de problèmes – Toad

2

En développement J2ME Nous ne pouvons pas avoir de principes POO en cours, le meilleur moyen est de tout garder en classe unique même sans avoir de paquets pour une utilisation optimale de la mémoire. Mais dans la perspective de programmation, nous allons pour un certain niveau de concepts OO comme la séparation du code en ensemble utile de classes et de paquets. Mais il vaut mieux ne pas opter pour ces concepts de sous-classification. J2ME Polish est vraiment utile pour développer des applications J2ME spécialement génériques. IMO vous allez dans le droit chemin, nous ne pouvons pas avoir tous OOP appliquée lors du développement d'applications J2ME en raison de la taille de tas limitée, surtout lorsque vous allez pour une application générique J2ME concernant un grand nombre de dispositifs de combiné.

1

Mon £ 0,02 valeur:

Les composants de l'interface utilisateur intégrée (LCDUI) sont généralement hideux. Ils peuvent être utiles si vous voulez que votre application ressemble à une application "native du combiné"; Cependant, vous avez très peu de contrôle sur leur apparence. Ce qui semble joli sur un combiné aura l'air horrible et déplacé sur un autre. Il est très très difficile d'écrire du code inter-combiné à l'aide de LCDUI et j'éviterais comme la peste. Le fait de rouler vos propres composants à base de canevas signifie que vous avez un meilleur contrôle de leur apparence et de leur comportement sur l'ensemble des combinés. En ce qui concerne les polices, personnellement, je n'aime pas me soucier des polices bitmap. Ils sont lents, lourds, encombrants, et peuvent être difficiles à regarder comme vous avez besoin d'implémenter votre propre crénage etc, et quoi de l'internationalisation? Certes, certaines polices de téléphone sont abominables (anciens Motos en particulier comme Reinier mentionné). Cependant, rappelez-vous que l'utilisateur sera habitué à eux sur ce combiné, et une conception soigneuse de l'interface utilisateur (et la mise en œuvre des composants) signifie que vous pouvez travailler autour de toute police de taille (notez que la raison pour laquelle les anciens Motos vous donnent un gros si vous demandez pour les petits, c'est qu'ils ont réellement une seule police).

Il y a beaucoup, beaucoup de bogues obscurs de combiné que vous devrez contourner, selon ce que votre application fait. Oui certains combinés ont des bizarreries sur l'allocation GC/mémoire qui peut vous mordre. Cependant, seulement si vous ciblez des combinés anciens/à mémoire basse appropriés, vous devez aller à l'extrême "mettre tout en une seule classe/méthode" extrême. Tout effort que vous mettrez dans ce département sera discutable par rapport à la surcharge des polices bitmap IMO.

HTH

0

Je poste le deuxième ici. Je veux ajouter que les chaînes incorporées dans le code sont un cauchemar de maintenance, mieux vaut les avoir dans une classe comme CustomStrings. Pareil avec les noms d'image/assets, c'est juste plus facile à maintenir.

Un autre point que je veux faire est pour l'objectif de lancement initial pour les combinés haut de gamme (plus grand que 64k taille de pot de limite). C'est très indolore de cette façon. Plus tard, vous pouvez ajouter un support pour le combiné bas de gamme.

De même que l'ingénieur J2ME senior semble connaître son chemin, écoutez-le sur les problèmes inhérents au développement de J2ME, pas nécessairement pour les solutions.