2008-12-23 3 views
4

Le domaine de problème comporte une grande population de snarks nommés. Certains des snarks sont des boojums.Certains snarks sont des boojums: liste de boojums, ou propriété is_boojum sur tous les snarks?

Il y a au moins deux façons de modéliser ce:

 
// as a property: 
    class Snark { 
     string name; 
     bool is_boojum; 
    }; 

// as a list: 
    class Snark { 
     typedef long Id; 
     Id id; 
     string name; 
    }; 

    tree<Snark::Id> boojums; 

Il semble intuitif que si nous avons déterminé que snarks viennent chez le mâle et la femelle, nous ajouterons une propriété « sexe » à la définition de la classe snark; et si nous déterminions que tous sauf cinq snarks étaient des sujets vaincus, nous ferions une liste de royals.

Y a-t-il des principes que l'on peut appliquer ou est-ce une question de préférence architecturale?

+0

Félicitations pour avoir créé la question la plus déroutante que j'ai vue sur SO. Il m'a fallu 5 lectures juste pour * penser * Je sais ce que vous * pourriez * demander. – ctacke

+0

vous devez clarifier votre question. Je pense que je sais ce que vous voulez dire mais ce n'est pas clair ce que vous demandez. – frankodwyer

+0

Il s'agit d'une référence à un poème Lewis Carroll, Chasse du Snark. Snark et Boojum sont des variables métasyntaxiques (http://en.wikipedia.org/wiki/Metasyntactic_variable), comme foo et bar. Un snark est un objet, et boojum est un adjectif qui peut s'appliquer à cet objet. – Oddthinking

Répondre

2

Je crois que l'entropie de l'information associée à la classification peut être un guide pour la méthode à utiliser. Les classifications à faible entropie (la plupart des objets ont la même valeur) suggèrent une implémentation de la liste qui suit les cas exceptionnels, tandis que les classifications à forte entropie (vous ne pouvez pas faire de très bonnes prédictions sur la classification d'un objet).

6

Quel problème essayez-vous de résoudre? Si le but de l'enregistrement de la redevance des snarks est d'afficher une couronne sur leurs têtes dans le GUI, alors il est logique que ce soit simplement un attribut. (Alternativement, il pourrait y avoir une sous-classe RoyalSnark, avec une méthode Render substituée.)

Si le but est de trouver rapidement tous les snarks royaux, alors une liste est plus appropriée - sinon vous auriez besoin de regarder tous les snark et vérifiez son attribut.

+1

... et peut-être les deux. –

+0

+ 1 pour ceci et +1 @Faites le Lézard si c'était possible – Greg

1

Cette façon naturelle de le faire semble être une propriété dans tous les cas.

Vous pouvez utiliser une liste pour les performances ou pour optimiser l'espace. Les deux raisons me semblent être des cas potentiels d'optimisation prématurée, de rupture de l'encapsulation et/ou de stockage de données redondantes avec le risque de manque d'intégrité qui en découle (car je devrais être capable d'interroger l'objet lui-même il faut savoir que cette propriété est gérée d'une manière spéciale pour des raisons de performance). Vous pourriez je suppose cacher l'implémentation de liste derrière un getter, pour le faire se comporter comme une propriété.

De plus, si ces objets étaient stockés dans une base de données, le problème de performance disparaît car la couche DB peut créer la liste lors de l'exécution à l'aide d'une requête.

0

Si vous vous interrogez sur la modélisation de base de données, il est plus simple de traiter is_boojum comme une colonne d'attribut dans la table Snarks. Si vous devez rechercher tous boojums, la requête est simple:

SELECT * FROM Snarks WHERE is_boojum = 1 

Cela donne des réponses logiquement correctes, et il est facile à modéliser. Cela peut ne pas être si rapide, car l'indexation d'une colonne avec une faible sélectivité (plusieurs lignes avec des valeurs identiques) n'est pas très efficace et peut ne pas bénéficier du tout de l'index. Mais votre question portait sur la modélisation, pas sur l'optimisation.

2

En tant que classe dérivée:

class Snark 
{ 
    virtual void Approach(Creature& approacher) {}; 
}; 

class Boojum : public Snark 
{ 
    virtual void Approach(Creature& approacher) 
    { 
     approacher.softlySuddenlyVanishAway(); 
    } 
}; 
0

Hmmm. Ma première pensée est que, en effet, Boojum est un sous-type de Snark. mais la spécification semble s'opposer à cela, car "le snark était un boojum, voyez-vous". Eh bien, cela signifie que le snark est_a Boojum, et que cela rendrait le graphe d'héritage cyclique. Je ne peux pas avoir ça.

D'autre part, je do'nt pense qu'il ya une indication qu'un Snark peut devenir un Boojum; soit c'est un Boojum ou pas.

Je pense que probablement vous voulez un mixin Boojum -

abstract class Snark { /*...*/ }; 
class PlainSnark extends Snark {/*...*/}; 
class RoyalSnark extends Snark implements Boojum {/*...*/}; 
+0

Vous lisez la question différemment des autres réponses ... Vous supposez que Boojumness est indépendant de Snarkness, alors que j'ai supposé que seulement Les Snarks peuvent être des Boojums. Ce n'est pas clair à partir de la question qui est juste. En outre, comment "le snark était un boojum" implique-t-il "snark is_a Boojum?"? – Stobor

+0

Sur la question Bookum-Ness, je fais référence à la spécification d'origine. (http://en.wikipedia.org/wiki/The_Hunting_of_the_Snark). Quant à "était un" sens "est un", je me réfère à la grammaire anglaise. Boojum n'est pas nécessairement indépendant; il définit simplement une opération ("SilentlyVanish()") que les autres Snarks n'ont pas. –

+0

(Oui, j'ai vu la spécification ... :-)) Cependant, je ne suis toujours pas sûr de l'aspect de la grammaire. "La voiture était une Ford, vous voyez." n'implique pas que Car is_a Ford, en fait cela suggère le contraire. – Stobor

Questions connexes