Recherche parmi toutes les instances d'une classe
Flo
Membre
Bonjour à tous,
Disons que j'ai une classe C (couche modèle) : C ->> C
Lorsque le constructeur de C est appelé pour créer c, il télécharge des données d (en mode synchrone).
Le problème c'est que ce nouveau c doit aussi créer d'autres c' que l'on initialise aussi à partir de d. Chaque instance de C ayant un code, je cherche un moyen de savoir si les nouveaux codes contenu dans d n'existe pas déjà pour ne pas ajouter deux c avec le même code. ???
J'ai pensé à plusieurs solution sachant que tous les codes doivent être accessibles par le constructeur de la classe C :
- Une variable de classe dans C contenant les références de toutes les instances
- Un singleton qui connaà®trait tous les c
Vous en pensez quoi ?
Disons que j'ai une classe C (couche modèle) : C ->> C
Lorsque le constructeur de C est appelé pour créer c, il télécharge des données d (en mode synchrone).
Le problème c'est que ce nouveau c doit aussi créer d'autres c' que l'on initialise aussi à partir de d. Chaque instance de C ayant un code, je cherche un moyen de savoir si les nouveaux codes contenu dans d n'existe pas déjà pour ne pas ajouter deux c avec le même code. ???
J'ai pensé à plusieurs solution sachant que tous les codes doivent être accessibles par le constructeur de la classe C :
- Une variable de classe dans C contenant les références de toutes les instances
- Un singleton qui connaà®trait tous les c
Vous en pensez quoi ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je ne comprends pas trop cette histoire de code. Le code dont tu parles c'est une partie des données de d et tu veux en quelque sorte partager les données de d entre les différentes instances c ?
En fait je suis sur une petite application de gestion de portefeuille boursier. Les marchés et les actions sont représentés par la même classe "Symbol". Du coup, un "Symbol" peut en contenir d'autres quand il s'agit d'un "Symbol" de marché.
Quand je souhaite ajouter un "symbol" de marché, le constructeur télécharge d'un coup les données concernant le marché et tous les "Symbol" actions associées. Si les "Symbol" d'actions associées n'existent pas il faut les créer sinon il faut récupérer ceux qui existent et les ajouter. D'où l'importance de pouvoir vérifier si les objets "Symbol" correspondant aux données n'existent pas.
La recherche s'effectue par le code qui est un attribut NSString de chaque symbol. Ce qu'il me faut c'est juste le moyen le plus "objet" et MVC pour un nouveau "Symbol" de marché de savoir si tous ces "Symbol" action qu'il contient n'existe pas déjà pour ne pas créer de doublons.
J'avais deux solutions pour ça :
- une variable de classe pour la classe "Symbol" contenant les références de toutes les instances
- un singleton genre SymbolManager accessible par le constructeur de la classe "Symbol" et référençant tous les instance de la classe "Symbol"
J'ai un peu de mal à restituer la situation de manière fidèle, désoléÂ
J'espère avoir été un petit peu plus clair, merci déjà pour ta réponseÂ
Je serais tenté par CoreData et les fetch request ...
Dans l'idée si on veut l'exprimer avec core data ça donnerait plutôt ça (voir image)
Sinon il n'y a que deux niveaux, marché et action exprimés par la même classe.
Le code de chacun est fournis par le site et est de la forme :
- UNECHAINE.EXTENSION
L'idée d'un NSMutableArray en variable de classe référençant toutes les instances de la classe Symbol me plaà®t bien moi, tu en penses quoi ?
Si tu envisages plusieurs marchés financiers, cela fait une sacré base de données. Evidemment si il s'agit du portefeuille d'un individu ou d'un groupe d'individu c'est moins conséquent.
C'est curieux je vois plus de solutions en C qu'en ObjectiveC, en maintenant trié des tableaux, avec recherche dichotomique. NSMutableArray, NSPointerArray, CFBag, je ne vois pas de collection qui possède la méthode insert:(id)anObject usingSortFunction:(NSInteger (*)(id, id, void *))compare context:(void*)context
Il me semblait que c'était possible pourtant non ? Parce que en terme d'accès c'est le plus pratique .
Sinon le singleton c'est vrai que c'est pas mal non plusÂ
J'ai fais un petit algo d'insertion dichotomique à un moment, j'avais posé la question sur ce forum et on m'avait répondu que les classe NSArray et NSDictionary étaient bien assez optimisées (ce qui n'est pas faux ;D)
Ha oui au passage, qui est le plus rapide en recherche sur un code ivar de type string, NSArray+NSPredicate ou NSDictionary ?
Possible peut-être, les collections peuvent s'étendre comme des listes chaà®nées dynamiquement, mais c'est au moins bizarre.
Oui je me souviens de cette discussion, mais la réponse était sur l'insertion d'un objet à un indice connu. Je ne sais pas si il existe des tests de rapidité pour les méthodes containsObject: ou indexOfObject: .
Si c'est possible en termes de capacité, je comparerais avec un système de tag comme indiqué plus haut.
J'ai (enfin) retrouvé la partie de la doc (en italique) sur laquel shlum m'avait demandé de me justifier ya un petit moment :P
Pour une NSMutableArray de 1 million d'instances, on obtient les comparaisons suivantes
Evidemment l'utilisation d'un tableau de booléens est largement plus efficace, mais containsObject: est tout de même impressionnant !
Sinon j'ai une petite question, si je délègue le travail de recherche d'une instance "Symbol" par son code à l'appDelegate, le fait qu'une classe du modèle accède au controller n'est pas contraire au MVC ?
Pour ma part, cela ne me choque pas, mieux je trouve cela correct : AppDelegate joue ici un rôle de contrôleur général du model et le fait de décider de ce qui est créé dans le model est pour moi attribué au contrôleur. Le rôle de la couche model, les méthodes qu'elle implémente, concerne plutôt la gestion, les fonctions d'initialisations.
En gros dans le parallèle qu'on pourrait faire avec une entreprise,
• Le model est une zone de stockage, de rangement, d'exécution de tâches courantes,
• Le contrôleur est une zone de décision, de choix/création du modèle, et de connexion/validation avec la partie clientèle que constitue la view.
Prenons un exemple concret:
Je fais une recherche (contrôleur) sur une base de données (modèle) qui me renvoie un nom de personne, mais en fait c'est une référence sur une table externe. J'ai donc 2 possibilités, soit résoudre cette référence externe directement dans le modèle, soit effectuer une deuxième requête au niveau du contrôleur.
Mais demander au modèle de passer par le contrôleur c'est
Hum... c'est bien ce que je pensais. :-\\
Merci pour vos réponses, je pense que je vais tester la solution du NSMutableArray en variable de classe, la doc apple n'a pas l'air d'être en désaccord avec cette solution