Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bon supposez que vous voulez additionner 1 et 2.
Naïvement vous écririez :
java a écrit:
int result;
result = 1+2;
System.out.println("trois = " + result);
Qu'est ce qui ne va pas ?
-> vous n'avez pas utilisé la POO : MAUVAIS
Réessayons :
Integer one, two, three;
one = new Integer (1);
two = new Integer (2);
three = new Integer (one.intValue() + two.intValue());
System.out.println("three = " + three);
Tout de suite, c'est plus beau
Mais on peut faire mieux, notamment transformer les entiers en String et vice-versa (il y a des pros du Java qui font ça naturellement)
java.math.BigInteger bigTwo = new java.math.BigInteger (two.toString());
three = new Integer (Integer.parseInt
(bigTwo.add(java.math.BigInteger.ONE).toString()));
System.out.println("big three = " + three);
Enfin un programme simple et lisible
Dernière modification par shahin (30-08-2007 08:57:48)
Hors ligne
Ce qui ne va pas en fait dans le code c'est que le compilateur est obligé de choisir la classe avec laquelle il va devoir interpreter les chiffres (on va devoir perdre quelques milliemes de secondes )
Et puis au passage, on peut faire la même remarque sur l'instantiation des String. A la longue il vaudra mieux déclarer une variable :
String mon_resultat = "trois = "
Pour ensuite l'utiliser lors de l'affichage :
System.out.println(mon_resultat + result);
Mais bon ça c'est vraiment quand on arrive avec un programme assez lourd qui peut tourner pendant plusieures minutes, voir plusieures heures (moi ça m'arrive, heuresement que la partie Salle de jeux existe dans PbaDonf ) alors un petit alègement au niveau du code peut permetre de gagner quelques minutes d'execution.
Hors ligne
Nephtis a écrit:
Ce qui ne va pas en fait dans le code c'est que le compilateur est obligé de choisir la classe avec laquelle il va devoir interpreter les chiffres (on va devoir perdre quelques milliemes de secondes )
Pas trop compris.
Mais c'est vrai qu'on pourrait faire une classe abstraite Addition et 3 classes concrètes (correspondant à mes 3 algo) + une classe factory qui choisirai l'objet ad hoc en fonction d'un fichier de configuration xml
http://c2.com/cgi/wiki?FactoryMethodPattern
Ou comment faire une addition en 200 lignes de code
Quid de
StringBuffer buff = new StringBuffer (30).append("trois = "); System.out.println(buff.append(result));
Hors ligne
shahin a écrit:
Nephtis a écrit:
Ce qui ne va pas en fait dans le code c'est que le compilateur est obligé de choisir la classe avec laquelle il va devoir interpreter les chiffres (on va devoir perdre quelques milliemes de secondes )
Pas trop compris.
Quand tu ecris 1+2 il faut que le compilateur considère les chiffre '1' et '2' comme des entier pour nous. Mais le probleme c'est que pour des entiers on peut les stocker de diverses manières (int, Integer).
Je sais pas trop comment marchent les compilateurs mais je suppose donc qu'il doit se rajouter une déclaration implicite du type int i1 = 1 et une ligne de code en plus c'est un minuscule espace temps perdu lors de l'execution (si cela fonctionne bien de cette manière évidemment)
Hors ligne
shahin a écrit:
Ou comment faire une addition en 200 lignes de code
Allez, c'est parti sur le thème "choisir la classe avec laquelle il va devoir interpreter les chiffres ":
package fr.galejade; public abstract class Addition { abstract int add (int a, int b); }
package fr.galejade; public class SimpleAddition extends Addition { int add(int a, int b) { return a + b; } }
package fr.galejade; public class ObjectAddition1 extends Addition { int add(int a, int b) { Integer i, j, result; i = new Integer (a); j = Integer.decode(b+""); result = new Integer (i.intValue() + j.intValue()); return result.intValue(); } }
package fr.galejade; public class ObjectAddition2 extends Addition { int add(int a, int b) { java.math.BigInteger b1 = new java.math.BigInteger (a+""); java.math.BigInteger b2 = new java.math.BigInteger (b+""); Integer result; result = new Integer (Integer.parseInt(b1.add(b2).toString())); return result.intValue(); } }
package fr.galejade; public class AdditionFactory { private static final AdditionFactory singleton = new AdditionFactory (); private AdditionFactory() { } public static AdditionFactory getInstance() { return singleton; } public Addition get () { String classAddition; Addition addition=null; /* Lire la classe à créer dans un p... de fichier xml * à faire */ classAddition = "fr.galejade.SimpleAddition"; try { addition = (Addition)Class.forName(classAddition) .newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return addition; } }
Last but not least :
int un=1; int deux = 2; int result; AdditionFactory additionFactory = AdditionFactory.getInstance(); Addition addition = additionFactory.get(); result = addition.add(un, deux); StringBuffer buff = new StringBuffer (30).append("trois = "); System.out.println(buff.append(result));
Et c'est dans le poche (comme dirait Jane Birkin)
Hors ligne
Nephtis a écrit:
Mais le probleme c'est que pour des entiers on peut les stocker de diverses manières (int, Integer)
Un entier c'est int.
Integer est juste un wrapper (une enveloppe).
Je te le fais en powerscript. En pb, les constructeurs ne sont pas paramétrés alors j'ai du ruser.
forward global type nvo_int from nonvisualobject end type end forward global type nvo_int from nonvisualobject end type global nvo_int nvo_int type variables private int ii_value end variables forward prototypes public subroutine of_set (integer ai_val) throws exception public function integer intvalue () public function string tostring () end prototypes public subroutine of_set (integer ai_val) throws exception; if isNull (ii_value) then ii_value = ai_val else Exception ex ex = create Exception ex.setMessage("this object cannot be modified") throw ex end if end subroutine public function integer intvalue ();return ii_value end function public function string tostring ();return string (ii_value) end function event constructor;setNull(ii_value) end event on nvo_int.create call super::create TriggerEvent( this, "constructor" ) end on on nvo_int.destroy TriggerEvent( this, "destructor" ) call super::destroy end on
Dernière modification par shahin (30-08-2007 12:05:54)
Hors ligne
shahin a écrit:
Ou comment faire une addition en 200 lignes de code
Heu, si je veux ajouter 1 jours et 5 heure à la date et l'heure du jour c'est combien de lignes ?
Hors ligne
shahin a écrit:
Ou comment faire une addition en 200 lignes de code
Je vous laisse imaginer combien de lignes il faut pour ajouter 3 jours et 5 heures à la date/heure du jour...
Hors ligne
Chrnico a écrit:
shahin a écrit:
Ou comment faire une addition en 200 lignes de code
Je vous laisse imaginer combien de lignes il faut pour ajouter 3 jours et 5 heures à la date/heure du jour...
C'est plus cher, il faut pas avoir d'oursins dans le poche
new GregorianCalendar().add(Calendar.DATE, 3).add(Calendar.HOUR_OF_DAY, 5)
Hors ligne
halalala quand je pense qu'il y a des intégristes qui prétendent vraiment que la programmation ça devrait être comme ça...
perso le seul truc que je fais vraiment gaffe à optimiser c'est les SQL's, je pense que dans 99.9999999% des cas d'opérations qui durent longtemps c'est du SQL et comme la DB est une ressource partagée entre plusieurs users et différents programme on doit rester performant et pas trop gourmand.
par contre les macs qui font des cacas nerveux à la vue d'un CAST() dans du code .NET ou qui crisent parceque on utilise la dot notation au lieu de Getitem ou autres exemples du genre ils me font bien rire, ils prennent 3 plombes et 10 fois plus de lignes de code pour arriver au même résultat et ne se rendent pas compte qu'ils viennent de gaspiller le pognon de la boite en réfléchissant pendant trop longtemps à la meilleur façon de... gagner 1/10 de seconde au lancement d'une fenêtre...
moi je dis la recherche de performance OUI mais d'abord où c'est vraiment nécéssaire et rentable.
Hors ligne
rincevent a écrit:
halalala quand je pense qu'il y a des intégristes qui prétendent vraiment que la programmation ça devrait être comme ça...
Et oui, maheureusement
rincevent a écrit:
perso le seul truc que je fais vraiment gaffe à optimiser c'est les SQL's
100% d'accord
rincevent a écrit:
...et ne se rendent pas compte qu'ils viennent de gaspiller le pognon de la boite en réfléchissant pendant trop longtemps à la meilleur façon de... gagner 1/10 de seconde au lancement d'une fenêtre...
Bien vu.
Cependant, réfléchir à faire du code lisible par un être humain, et maintenable est fondamental.
Hors ligne
shahin a écrit:
Cependant, réfléchir à faire du code lisible par un être humain, et maintenable est fondamental.
Bien sur mais entre
int result;
result = 1+2;
System.out.println("trois = " + result);
et
java.math.BigInteger bigTwo = new java.math.BigInteger (two.toString());
three = new Integer (Integer.parseInt
(bigTwo.add(java.math.BigInteger.ONE).toString()));
System.out.println("big three = " + three);
on voit tout de suite le plus lisible
Hors ligne
rincevent a écrit:
perso le seul truc que je fais vraiment gaffe à optimiser c'est les SQL's
J'ajouterai aussi qu'en client/serveur, il faut faire attention au trafic réseau en limitant les aller-retour entre les postes client et le serveur au maximum (surtout quand les serveurs sont à grande distance du poste client).
Les gros tuyaux, c'est pas donné et ça sature vite
Hors ligne
shahin a écrit:
C'était de l'humour Nephtis.
Et aussi répondre à une question
Oui c'est vrai que poche me surprends bien parfois
Hors ligne