Veuillez excuser des éclats de stupidité alors que j'apprends les excuses de C # / .NET
Dites que j'ai trois classes avec plusieurs propriétés statiques (plus de trois mais pour les arguments.) P>
public void updateVary(string class, string vary)
{
string y = 'class'
SWITCH (y)
{
case FOO:
FOO.B = Vary;
break;
case BAR:
BAR.B = Vary;
break;
case YOO:
YOO.B = Vary;
break;
}
}
6 Réponses :
Si vous êtes un ventilateur de la manière JavaScript de résoudre plusieurs étuis de commutation tels que Ce
Vous pouvez toujours envelopper les gestionnaires de commutateurs en tant qu'actions et les jeter dans un dictionnaire. P>
Par exemple: (source obtenue à partir de ici ) p>
hmmm, je vais considérer ce @world, thnx, je vais espérer une réponse "plus simple" (oui je voulais mettre cela dans des citations), cela pourrait signifier que je ne suis pas intelligent ou que cela pourrait signifier que je suis juste Facile :)
Si vous n'avez pas besoin de classes en béton, vous pouvez abstraire la logique comme si:
public class Status {
public string A {
get; set;
}
public string B {
get; set;
}
public string C {
get; set;
}
}
public static class StatusManager {
private static Dictionary<string, Status> statusMap = new Dictionary<string,Status>();
public static Status GetStatus(string name) {
Status status;
if (!statusMap.TryGetValue(name, out status))
statusMap[name] = status = new Status();
return status;
}
public static void SetStatus(string name, Status status) {
statusMap[name] = status;
}
public static void UpdateVarx(string name, string varx) {
GetStatus(name).A = varx;
}
// ...
}
@Pete - Tu me demandes ou @craigjste? :-)
@pete je ne suis pas sûr si ça va mais je l'aime! - Au deuxième regard, il y aura probablement, mais je devrais me blesser sur l'utilisation des dict. C'est bon si ...
@CRAIGJSTE C'est un bon endroit pour commencer. Si quelque chose se blottit sur l'utilisation du dictionnaire sur msdn.com. Le dictionnaire est le moindre de vos problèmes ici = p
@Pete = Pensez-vous que je vais vous laisser sortir avec cela si facilement ... Maintenant, dites-moi ce que vous pensez que le vrai problème est ... :)
@Craigjste Pour être honnête, je ne suis pas sûr de ce que le problème est que je ne sais pas ce n'est pas le dictionnaire. Pour moi, cela semble être sûr que c'est facilement résolu à l'aide d'interfaces, mais je peux vous empêcher de mal comprendre le domaine du problème.
Puisque vous apprenez .NET / C #, je suppose que je devrais vous avertir, à l'aide de propriétés statiques n'est probablement pas la voie à suivre dans une programmation orientée objet.
statique est l'état mondial et est dangereux. Si vous finissez par utiliser un code multi-threadé, vous devez être très prudent. Si vous n'avez besoin que d'une seule instance, il suffit d'instancier un, mais n'allez pas créer des propriétés statiques sur une classe, sauf si vous avez une assez bonne raison de les ajouter (et je ne peux penser à aucun moment). P>
En fait, dans le code orienté objet bien conçu, vous n'avez probablement pas beaucoup si, commutateur, getters ou setters non plus. P>
Disons que vous avez besoin de comportements différents sur vos cours, vous pouvez le faire. manière. p> ou si dans votre exemple, toutes vos classes statiques ont les mêmes propriétés: P> public class Settings {
public int A {get; set;}
public int B {get; set;}
public int C {get; set;}
}
public class NeedsToUseOtherClass {
public NeedsToUseOtherClass() {
Settings foo = new Settings();
Settings bar = new Settings();
Settings yoo = new Settings();
foo.setA(25);
}
}
Que voulez-vous dire "dans le code bien conçu et orienté objet que vous ne devriez probablement pas avoir beaucoup de choses si, commutateur, getters ou setters non plus?"
Question pour vous ... @martin ... 'Seulement instancier l'un' - Si j'instancie au sommet de la classe, cela signifie-t-il que c'est seulement fait une fois?
@Josh M. Pour les getters and Setters, si vous les avez, cela signifie que vous exposez l'état interne de votre objet au lieu d'avoir des comportements sur vos objets, ce qui signifie que les consommateurs de votre objet en savent plus que ce qui saurait savoir. Pour le commutateur et les IFS, si vous avez un chèque contre un type (typeof), vous avez quelque chose qui ne va pas dans votre code. Vérifiez antiformaign.com pour plus de détails
@Craigjste dans la programmation orientée objet, une classe est une sorte de plan de plan pour un objet. Chaque fois que vous utilisez le nouveau mot clé, le constructeur d'une classe est appelé et vous recevez une nouvelle instance. Si vous utilisez le nouveau mot-clé uniquement une fois sur une classe, vous n'excédoyez que d'instancier un. Vous pouvez ensuite partager cette instance entre les appels de méthode, le stocker en tant que membre privé et l'utiliser en cas de besoin.
@Martin - La façon dont vous avez écrites est vraiment trompeuse. Mais je pense que vous voulez dire "Vous ne devriez pas utiliser si / commutateur sur un objet pour déterminer son type, puis effectuer une action donnée." (Droit?)
@JOSH M. Oui, mais souvent, si vous avez beaucoup d'IFS imbriquées, changez de cas, entraînant beaucoup d'indentation, il y a probablement quelque chose qui ne va pas avec votre code.
@Martin. Oui, accepté. En ce qui concerne le lien que vous avez posté, n'est-ce pas ( antiformaj.fr/articles ) évident à quiconque connaît les bases de la programmation? Je ne peux pas croire que cette "campagne" existe! ;-) Merci.
@Martin, BTW J'ai changé de statique pour instancier une fois dans la classe ... puis a utilisé un commutateur sur ID L'interface et wa-laa, faites .. merci!
@Martin, en fait, je pense que vous avez 1 ou 2 questions passées où je suis maintenant. Mais j'apprends. L'antifcampaign est un bon moyen d'ouvrir les yeux de quelqu'un qui commence à commencer au niveau de base ... Si des déclarations - qui auraient pensé ?? Je suppose que je suis un membre solide du groupe que @josh dit ne connaît pas les bases de la programmation ... :( eh bien!
Sous le code utilise toutes sortes de hacks, pas vraiment recommandé dans le code de production, à moins que vous n'ayez une très bonne raison.
une raison pour une raison descendante? J'ai averti au sommet en disant que ce n'est pas un bon code de code, je montais une possibilité.
Désolé mais je devais descendre. Ce n'est pas la bonne façon de résoudre le problème que vous avez indiqué «pas vraiment recommandé dans le code de production».
Ouais c'est ce que j'ai dit. Je pense que la technique est toujours utile dans de nombreux cas. C'était un moyen de montrer la possibilité.
Je me rends compte que vous avez averti au début mais je suis toujours débutant d'apprendre C #. Encore une fois, je descends rarement, mais je pensais juste que cette réponse alors qu'elle y travaille n'est pas correcte dans ce contexte, désolé :-)
Désolé d'être un bower gars :-)
Peut-être que je ne comprends pas le problème, mais si toutes vos classes ont les mêmes propriétés exactes, vous pouvez simplement passer l'objet (FOO, BAR ou YOO) dans les méthodes updatevarx ou updatevary et simplement implémenter une interface? Quelque chose le long de ces lignes:
@Pete, par Jomp je pense que vous l'avez !! (pour crédit supplémentaire - qui a dit que c'était Sherlock Holmes) ??
Si les propriétés de FOO sont statiques, elles ne sont pas considérées comme la mise en œuvre des propriétés de l'interface.
@CRAIGJSTE J'espère que mon pote. Il craint d'avoir un problème sans résolution.
@Codenaked C'est vrai, j'ai copié et collé son code. Je ne pense pas que les propriétés de l'état doivent être statiques, ce sont-ils? Je suppose que j'ai du mal à comprendre pourquoi ils sont statiques pour commencer.
@Pete - pas sûr :-) semblait comme ça.
@Pete je pense que c'est la version la plus facile de ce que je dois faire .. Mais je pense que @Martin est plus complet, hein ???
@Craigjste Bien sûr, il énumère les raisons pour lesquelles vous ne devriez pas faire ce que vous faites. Nos réponses sont suffisamment similaires où je les considérerais à égalité avec le bord qui lui allait pour les explications supplémentaires.
@Pete, vous dites-moi - ce sont des cours appelés des routines d'ordre qui effectuent des mises à jour à un certain nombre de variables d'état pour un nombre fixe de titres. Si j'instaine une seule instance, je n'ai pas besoin de leur statique ... mais je suis Exécution des routines de commande 1000 fois par minute .. Donc, je veux être sûr qu'il n'y a pas de statut en double sur certains où - très très important.
@CRAGJSTE Donc, si vous avez 3 instances de bar, vous voulez qu'ils partagent tous les mêmes propriétés de statut? La même chose pour FOO, vous voulez que toutes les instances de FOO partagent les propriétés de statut, mais les propriétés de statut de FOO sont indépendantes des propriétés de statut de la barre?
@Pete, foo, bar et yoo sont des titres disent que IBM, MSN et Yahoo et les propriétés d'état n'existeront que l'ordre le plus courant .. Ie. Je veux seulement une instance de la classe FOO, BAR et YOO qui a mis à jour des propriétés de temps en temps.
@Pete tellement, je pense que la réponse à votre question est oui, sauf que je n'ai que 1 instance de Foo 1 de bar et 1 de yoo, mais ils partagent tous les mêmes propriétés statiques qui sont mises à jour à des moments différents etc.
@Pete maintenant Qui a dit.
@Pete je change ma réponse - la vôtre est plus proche de ce dont j'ai besoin et plus simple ... merci.
@Pete Après les tests, votre réponse est brillante, simple et précise ... Si vous utilisez une instruction de commutation pour identifier quelle classe d'interface, je dois mettre à jour (foo, bar ou yoo), alors je n'ai besoin de méthodes du tout .. .
@craigjste bon! Je suis content que cela ait travaillé pour vous. Parfois, des problèmes qui semblent que le plus complexe dispose des solutions les plus simples
Vous pouvez utiliser le dictionnaire comme configuration et supprimer l'instruction de commutation.
Créez un dictionnaire et ajoutez des données ajoutées comme ci-dessous pour mapper
Pourquoi ils doivent être des propriétés statiques?
Parce que je ne veux pas de multiples instances d'entre eux ... mais Dunno à part ça .. ce sont des variables de statut pour un ensemble fixe de titres
"Veuillez excuser des éclats de stupidité" peut être la meilleure phrase que j'ai rencontrée ce matin. C'est hilarant, de manière non condescendante :)
J'ai dit que j'apprendais, qu'est-ce qui est smelly ?? merci@bolt
@Craigjste: Je pense qu'il fait référence à ce que nous appelons l'odeur de code.
Pouvez-vous expliquer un peu mieux ce que vous essayez d'accomplir? Pourquoi est-ce nécessaire? J'apprends aussi et je ne vois aucune utilisation pratique pour cela. Et la référence de l'odeur de code signifie simplement qu'il y a probablement quelque chose qui ne va pas avec votre code afin qu'il "sent". Cela ressemble à une implémentation horrible de quelque chose et il y a probablement une meilleure façon.
Peut-être une interface, mais s'ils ne sont que des variables d'état, pourquoi ne pas créer une nouvelle classe pour tenir les variables et avoir FOO, BAR et YOO, ce qui vous permet de faire référence à cette classe?
Les trois classes sont trois titres fixes (paires de devises à spécifiquer) l'état de la commande de mise à jour automatisée du système de négociation, le prix, la date, etc. (plus 20 variables) à plusieurs reprises ... lorsque je lance la commande Entrez et commandez le code de sortie - Ces classes doivent mettre à jour les variables statiques dans les classes qui contiennent des informations de commande pour chaque sécurité ... Aidez-moi à concevoir cela mieux .. s'il vous plaît.
@Pete - Si j'avais une classe qui détenait toutes les variables de statut pour toutes les questions, j'aurais toujours le même problème, (je pense). Foo Bar An Yoo ne sont que des noms de sécurité - pensez que JPY, USD et CAD par exemple ou IBM, MSN et Yahoo ..
Nice Question :-) Info: en.wikipedia.org/wiki/code_smell . Ne pas être pris personnellement ;-)
@bic je suis sûr que c'est "smelly" .. J'ai rencontré beaucoup de descripteurs qui signifient toutes la même chose .. J'ai besoin d'aide !!) J'aimerais savoir (évidemment) s'il y avait un meilleur moyen plus facile pour faire ça.... !!
@CRAIG - Si cela n'a pas été répondu à demain matin, je vais avoir une fissure à elle (1h du matin). On dirait que vous aurez besoin d'un «bassin de propriété» ou de quelque chose de similaire à ce que @Codenaked posté. Ce type de mission de propriété est courant dans les applications Web, c'est-à-dire. Références à base de clés aux valeurs.