JavaScript Quiz #5

Suite du quiz JavaScript précédent.

Soit le bloc JavaScript suivant :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4.  
  5. this.isMajeur = function() {
  6. alert("1");
  7. return (this.age >= 18);
  8. }
  9. }
  10.  
  11. Personne.prototype.isMajeur = function() {
  12. alert("2");
  13. return (this.age >= 18);
  14. }

On crée ensuite l'objet Personne suivant :

  1. var jean = new Personne("Jean", 43);

Une alerte va alors s'afficher. A votre avis, qu'affichera-t-elle ? 1 ou 2 ? Et pourquoi ?

Lire la suite...

JavaScript Quiz #4

Vous savez sans doute que l'on peut faire de l'objet avec JavaScript. Mais la syntaxe révèle quelques subtilités, qui sont révélatrices de la manière dont JavaScript implémente l'objet.

C'est ce qui fera l'objet ( ;-) ) de ce quiz JavaScript et des quelques uns qui suivront.

Soit la "classe" Personne, avec deux attributs nom et age et une opération booléenne isMajeur. On peut implémenter ceci comme suit :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4. this.isMajeur = Personne_isMajeur;
  5. }
  6.  
  7. function Personne_isMajeur() {
  8. return (this.age >= 18);
  9. }

Gros problème : on peut appeler directement Personne_isMajeur() comme une fonction, au lieu de l'invoquer sur un objet Personne.

Certains vont alors réécrire ce qui précède comme suit :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4.  
  5. this.isMajeur = function() {
  6. return (this.age >= 18);
  7. }
  8. }

Mais d'autres auront plutôt tendance à le réécrire comme ceci :

  1. function Personne(nom, age) {
  2. this.nom = nom;
  3. this.age = age;
  4. }
  5.  
  6. Personne.prototype.isMajeur = function() {
  7. return (this.age >= 18);
  8. }

Quelle différence y a-t-il entre ces deux dernières écritures ?

Lire la suite...

JavaScript Quiz #3

Qu'insère le bloc JavaScript suivant dans la page HTML ?

  1. var flagBidon = true;
  2.  
  3. function test() {
  4. var x = 5;
  5.  
  6. document.write(x);
  7. document.write("<br/>");
  8.  
  9. if (flagBidon) {
  10. var x = 10;
  11. document.write(x);
  12. document.write("<br/>");
  13. }
  14.  
  15. document.write(x);
  16. document.write("<br/>");
  17. }
  18.  
  19. test();
Lire la suite...

JavaScript Quiz #2

Qu'insère le bloc JavaScript suivant dans la page HTML ?

  1. var x = 9;
  2. function test() {
  3. document.write(x);
  4. document.write("<br/>");
  5.  
  6. var x = 10;
  7.  
  8. document.write(x);
  9. document.write("<br/>");
  10. }
  11. test();
  12. document.write(x);
Lire la suite...

Java Quiz #27

Que pensez-vous de ce code?
(Quiz proposé par Grégory Boissinot)

  1. class Animal {}
  2.  
  3. class Dog extends Animal {}
  4.  
  5. class Main
  6. {
  7. public static void printAnimals(List<Animal> animals)
  8. { ... }
  9.  
  10. public static void printAnimals(Animal[] animals)
  11. { ... }
  12.  
  13. public static void main(String args[])
  14. {
  15. Dog gromit = new Dog();
  16. Dog[] dogArray = {gromit};
  17. printAnimals(dogArray);
  18. List<Dog> dogList=new ArrayList<Dog>();
  19. dogList.add(gromit);
  20. printAnimals(dogList);
  21. }
  22. }
Lire la suite...

JavaScript Quiz #1

Un petit quiz JavaScript, pour changer. Voici une fonction de validation de dates, écrite en JavaScript :

  1. /**
  2. * Vérifie que la date passée sous la forme d'une chaîne de caractères
  3. * (exemple : "15/11/2008") est valide
  4. */
  5. function validateDate(dateAsString) {
  6. // Vérifie que la date est du format "JJ/MM/AAAA"
  7. var regex = new RegExp("^[0-9]{2}[/][0-9]{2}[/][0-9]{4}$", "g");
  8.  
  9. if (regex.test(dateAsString)) {
  10. // Vérifie en plus que les champs jour, mois et année sont
  11. // cohérents et correspondent à une date pas totalement farfelue.
  12. var fields = dateAsString.split("/");
  13. var day = parseInt(fields[0]);
  14. var month = parseInt(fields[1]);
  15. var year = parseInt(fields[2]);
  16.  
  17. if (day > 0 && day < 32 &&
  18. month > 0 && month < 13 &&
  19. year > 1970 && year < 2200) {
  20. return true;
  21. }
  22. }
  23. return false;
  24. }

Question : Certains jours de l'année 2009 ne passent pas la validation alors qu'ils le devraient. Lesquels, et pourquoi ?

Lire la suite...

Java Quiz #26

Pour changer un peu, ce quiz a été rédigé comme une question de la certification SCJP (type de question, formatage du code, etc), afin de vous montrer à quoi cela ressemble. Saurez-vous y répondre ?

Considérant le code suivant, lesquelles de ces propositions sont justes ?

  1. interface Interface1 {
  2. String FOO = "foo1";
  3. }
  4.  
  5. interface Interface2 {
  6. String FOO = "foo2";
  7. }
  8.  
  9. public class InterfaceMultipleInheritance implements Interface1, Interface2 {
  10. public static void main(String[] args) {
  11. System.out.println(FOO);
  12. }
  13. }
  1. Le code ne compile pas
  2. Le code compile mais provoque une erreur au runtime
  3. Le code compile et affiche "foo2"
  4. Le code compile et fonctionne si on commente la ligne 11
  5. Le code compile et fonctionne si la valeur assignée aux deux constantes FOO est la même
  6. Autre
Lire la suite...

Java Quiz #25

Que pensez-vous de ce code ?

  1. /**
  2.  * Renvoie un nombre aléatoire entre 0 (inclus) et 'maxValue' (inclus).
  3.  * @param maxValue Borne supérieure
  4.  * @param even Indique si le nombre doit être pair (true) ou impair(false)
  5.  * @return Le nombre aléatoire
  6.  */
  7. public static final int getRandomNumber(int maxValue, boolean even)
  8. {
  9. if (maxValue <= 0)
  10. { throw new IllegalArgumentException("Invalid 'maxValue' value");
  11. }
  12.  
  13. int value;
  14. if (even)
  15. { value = new Random().nextInt(maxValue / 2 + 1) * 2;
  16. }
  17. if (!even)
  18. { value = new Random().nextInt((maxValue + 1) / 2) * 2 + 1;
  19. }
  20. return value;
  21. }

Réponse après les fêtes !

Note : on m'a fait remarquer à juste titre que l'algorithme de génération des nombres était faux ; je l'ai donc corrigé (et testé cette fois...). Rassurez-vous, cela ne change en rien le point technique que ce quiz vise à exposer.

Lire la suite...

Java Quiz #24

Que fait le code suivant ? (astuce : résolution en deux étapes)

  1. public class Switcher {
  2. public static void main(String[] args) {
  3. int i = 0;
  4. int j = 0;
  5. switch (i) {
  6. case j:
  7. System.out.println("A");
  8. case j + 1:
  9. System.out.println("B");
  10. i = 3;
  11. break;
  12. default:
  13. System.out.println("E");
  14. break;
  15. case j + 2:
  16. System.out.println("C");
  17. case j + 3:
  18. System.out.println("D");
  19. i = 10;
  20. break;
  21. }
  22. }
  23. }
Lire la suite...

Java Quiz #23

Saurez-vous analyser ce code sans le copier/coller dans un IDE ?

  1. /** Gestionnaire de configuration. Immutable. */
  2. public class SettingsManager implements Serializable {
  3.  
  4. /** Ensemble des settings, classés par leur nom */
  5. private final Map<String, ? extends Serializable> settings = Collections.EMPTY_MAP;
  6.  
  7. /** Constructeur */
  8. public SettingsManager(Map<String, ? extends Serializable> settings)
  9. { this.settings = settings;
  10. }
  11.  
  12. /** Permet de récupérer un Setting selon son nom. Peut renvoyer null. */
  13. public Serializable getSetting(String settingName)
  14. { return this.settings.get(settingName);
  15. }
  16. }
Lire la suite...

- page 3 de 6 -