2 votes

Fonctionnement opérationnel en Android/Java

Je suis en train de développer une application flashcard pour la première raison que je n'aime pas celles qui existent et la deuxième raison est que je veux améliorer mes compétences en java/Android.

Dans mon application, j'ai essayé d'utiliser la POO. Mes cartes sont stockées dans une base de données sqlite.

Maintenant ma question : Actuellement, mon objet "Card" qui représente une seule Flashcard a son propre DatabaseAdapter qu'il peut utiliser pour mettre à jour son propre état, c'est-à-dire ses points.

 Card card = new Card();
 card.setPoints(10); //<-- Also update its row in the database

Ou est-il préférable de faire quelque chose comme ça :

 DBAdapter dbAdapter = new DBAdapter();
 Card card = new Card();
 dbAdapter.setPoints(Card);//<-- Updates Card and Database!

Qu'est-ce qui est mieux selon vous ?

Merci d'avance !

4voto

Lews Therin Points 10471

Ce que vous avez fait dans le deuxième exemple n'est pas conseillé car vous créez un effet secondaire. Mettre à jour la base de données revient à mettre à jour la carte, ce qui est une erreur. La mise à jour de la base de données ne doit faire qu'une seule chose, à savoir mettre à jour la base de données.

Je préférerais la première méthode, car la carte sait comment se mettre à jour, mais vous faites la même erreur en mettant à jour la base de données. Laissez la base de données savoir comment se mettre à jour, et la carte savoir comment se mettre à jour. Je pense que cela permet une séparation nette des préoccupations.

Par exemple :

card.setPoints(points)//update card and only card
dbAdapter.setPoints(card) //update the database and nothing else.

3voto

Simon Points 8591

Définitivement le premier. La classe qui définit les points ne doit avoir aucune connaissance de la manière dont les points sont définis (ou stockés). C'est une "séparation des responsabilités".

Imaginez qu'à l'avenir vous décidiez de passer d'une base de données à un accumulateur de cristaux de dilithium ACME(TM). Quelle quantité de code faudrait-il changer dans l'option 1 par rapport à l'option 2 ?

1voto

AmitD Points 12541

Je suppose que pas les deux.

 dbAdapter.update(card.getId(),card.getPoint());

La syntaxe devrait être

  public boolean update(int id, int value)

Votre DbAdapter doit avoir uniquement des méthodes qui stockent ou récupèrent, suppriment des données ; elles ne doivent pas être spécifiques à la fonctionnalité de carte.

Dans l'exemple ci-dessus card.getId() renvoie à URI associé à Card et ensuite il met juste à jour la valeur entière, ainsi votre code a la séparation des responsabilités et l'isolation.

0voto

Luke Taylor Points 3032

Si les deux extraits de code mentionnés ci-dessus fonctionnent, je préférerais le premier au second, car le code semble plus lisible, plus intuitif et plus court !

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X