2010-11-23 30 views
1

je un ensemble de Individual s au premier:Un groupe d'étudiants a juste un nom au début. Dès leur premier examen, ils auront à la fois le nom et le score. Comment concevoir ceci est un moyen simple?

class Individual { 
    double characteristics[]; 
    abstract double CalculateValue(); 
    ... 
} 

Chaque individu a un ensemble de caractéristiques. Ces caractéristiques seront mises en œuvre par l'utilisateur de ma bibliothèque par héritage:

class MyIndividualABC : Individual { 
    public MyIndividualABC() { 
     characteristics = new double[2]; 
     characteristics[0] = 123; 
     characteristics[1] = 456; 
    } 

    public override double CalculateValue() { 
     return characteristics[0]/characteristics[1]; //for example 
    } 
} 

Je vais donc les prendre et donner à chacun d'eux un score (en fonction de leur valeur). Je vais appeler cela faire une itération.

class EvaluatedIndividual { 
    double value; 
    double score; //score was calculated based on value 
} 

De iteration2 et au-delà, je serai toujours à avoir des objets à la main de type EvaluatedIndividual. Mais la première fois, je vais devoir mener avec des objets de type Individual.

Je n'aimerais pas avoir à traiter la première itération différemment des autres. Comment dois-je aborder cela?

Une analogie serait d'avoir une classe d'étudiants. Avant le premier examen, vous connaissez simplement leurs noms, et à partir du 1er examen, vous aurez à la fois leurs noms et la moyenne des résultats de leurs examens jusqu'à ce moment.

J'ai mis au point 3 différentes façons de gérer cela:

  1. J'ai une méthode Start() sur mon programme, puis un Iteration(). Le Start() prend Individual[] tandis que le Iteration() prend EvaluatedIndividual[]. Hacky, mais fera des merveilles. Utilisera ceci si rien ne se passe mieux.

  2. EvaluatedIndividual hérite de Individual. Cela semble propre, mais je ne suis pas trop sûr à ce sujet parce que je voudrais Individual être une interface et mon idée serait de permettre au client de ma bibliothèque/framework d'en hériter et de définir un ensemble de méthodes/champs sur Individual comme il le souhaite (Individual pourrait avoir plusieurs valeurs qui seraient prises en considération pour le calcul value, par exemple). Si je suis cette approche, je devrais lui faire implémenter un cours de EvaluatedIndividual. L'individu est formé par la valeur et à la fois evaluation et wasEvaluated. Au début wasEvaluated était faux, donc toute tentative de rassembler value lève une exception. Je ne suis pas particulièrement comme ça, mais je ne sais pas pourquoi.

Comment avez-vous abordé cela? Ceci est probablement un modèle assez commun, mais je crains que je ne connais aucun motif GoF qui correspond à ce scénario :(

Merci

+0

Vous voulez dire qu'une instance de 'Individual' devient un' EvaluatedIndividual' après un examen? Le monde change vraiment vite ... –

Répondre

0

Hé, si ce n'est pas une sorte d'exercice en classe, n » Les modèles de GoF ne sont pas pour tout ce que vous savez

+3

Cela devrait être un commentaire. – dbemerlin

3

Je suis tout pour simple, je voudrais juste avoir un cours ici.En C# peut-être utiliser Nullable<T>:

double? Score {get;set;} 

En Java (qui manque évidemment Nullable<T>), peut-être juste exposer le score avec un drapeau isEvaluated (ou un compte du nombre d'examens évalués) - si cela est false (ou 0) vous ignorez simplement le score.

+0

J'ai probablement trop simplifié la situation dans le PO. J'ai une personne qui sera évaluée en tenant compte des caractéristiques qui seront définies par la mise en œuvre de l'interface individuelle. Avec ces caractéristiques, je vais construire la «valeur» qui sera utilisée pour marquer l'individu. –

+0

édité l'OP au début. –

+0

@devouredelysium - so ... ajouter une interface que chaque implémentation peut implémenter? Cependant, je maintiens toujours qu'une seule interface est nécessaire ... –

2

J'ai une classe avec une valeur spéciale pour score qui indique que l'individu n'a pas été évalué:

class Individual { 
    private double value; 
    private double score = -1; // score was calculated based on value, 
           // -1 means not evaluated 

    public boolean isEvaluated() { return score != -1; } 
} 

héritage à mon humble avis est un surpuissant ici.

+0

Un vilain garçon a obtenu 0 à l'examen, et il a dessiné un lapin sur son papier, ainsi le professeur a pris 1 point supplémentaire. Finalement, il a obtenu -1 à l'examen. Peut-être que changer -1 en 'double.minvalue' est mieux? –

+0

@vitaut: Accord de cent pour cent. L'héritage n'est pas une exagération ici, mais complètement hors de question. Cela ne convient pas ici. –

+0

@Danny: Cet enseignant mérite une lettre de résiliation que ce soit, en particulier lors de son examen de dessin/art. –

0
class Individual { 
    double score; 
    ScoreState scoreState; 
} 

J'ai trouvé chaque fois que je besoin d'un état, je dois 2, et je peu besoin 2 + n, donc peut-être aussi bien faire un ENUM, cela permet à des situations comme « en attente d'examen » et d'autres considérations, qui peuvent être utiles à l'avenir, et il empêche contre un excès de drapeaux, ce qui peut être source de confusion.

+0

Ce n'est pas vraiment le point de ce que je cherche. Chaque individu a un ensemble de caractéristiques qui seront évaluées. Le client de mon framework voudra définir quelles sont ces caractéristiques et comment les prendre en compte. Peut-être que ce n'était pas évident à partir de l'OP. Ayant enums mènera juste à si code. –