J'ai une classe avec deux fonctions importantes:
x.SaveSomething().DoSomeThing();
7 Réponses :
Les méthodes idéalement nécessaires pour suivre un certain ordre d'exécution indiquent ou impliquent la nécessité de mettre en œuvre, un flux de travail de quelque sorte.
Il y a quelques modèles de conception prenant en charge l'ordre d'exécution linéaire du flux de travail, tels que comme le modèle de méthode de modèle ou stratégie . P>
prendre le méthode de modèle approche , votre classe FOO aura une base abstraite qui définit l'ordre d'exécution de De cette façon, les consommateurs de classe n'auront accès qu'à Il y a un autre modèle qui traite avec type de flux de travail / de transition d'état de situations. Vous pouvez vous référer à chaîne de commandement et état motifs. P> En réponse à votre commentaire:
Ceci suit la même idée de modèle, vous ajoutez une autre étape de votre modèle, imaginez que vous souhaitez valider les résultats avant d'enregistrer, vous pouvez étendre votre modèle à devenir: p> et de Cours pour un flux de travail plus élaboré, je vous ai référé à la tendance de l'état à la fin de ma réponse d'origine, vous pouvez avoir un contrôle plus granulaire sur la condition de transition d'un état à un autre. p> p> do () code> et
enregistrez () code>, quelque chose comme: p>
Doandsave () code> et ils n'infligent pas l'ordre d'exécution que vous avez destiné. P>
Et si les résultats du milieu sont nécessaires par une autre partie? Par exemple, si Dosomething () code> Les résultats doivent être affichés à l'utilisateur, puis s'ils sont d'accord (cliquez sur certains où) puis
Sauvette () CODE> arrive?
S'il vous plaît voir ma réponse modifiée .. La section de commentaire n'a pas pu accueillir une réponse longue.
Notez juste que ce serait aussi vague pour les responsables de la méthode Doandsave (). Dans ce cas, notez l'importance du commentaire @anas Karkoukli ajouté. Le commentaire devient ce qui va s'assurer que le code n'est pas brisé par les responsables.
Une option pour aider à éviter que l'erreur utilise est de préciser en passant une variable. En faisant cela, il soulève un drapeau pour l'utilisateur dont ils ont besoin pour obtenir les résultats (c'est-à-dire dossuel ()) avant d'appeler la sauvegarde (...).
Confondu un peu avec cette réponse, car il n'ya aucun moyen de ne pas éteindre la seconde partie. +1 de toute façon
Edit: Removed 1ère partie. Vous avez raison - il est plus d'une tangente qu'un répondant directement à la question. Bon appel.
Avantages: P>
faire code> et
Enregistrer les méthodes ne semble pas être une paire commandée à moi. Vous devez les commander uniquement parce que vous ne retournez pas l'état du calcul de la méthode code> code>. Si vous écrivez
méthode code> en tant que méthode qui renvoie les résultats au code du client, vous pouvez réécrire
Enregistrer code>, afin de recevoir les résultats sous forme de paramètre. P >
Enregistrer la méthode ne se soucie pas de la manière dont le client a obtenu le paramètre. Cela vient de le recevoir à ce jour. Li>
do code> plus facilement, car les méthodes deviennent moins couplées. li>
Enregistrer code> à une autre classe, si vous avez besoin d'écrire une logique complexe Enregistrez une logique ou implémenter un motif de référentiel. li>
ol>
L'expansion sur la réponse de Levinaris (+1 si j'avais le représentant), vous pourriez aussi avoir un Enregistrer () code> sur les résultats objet retourné par
DoSomthing () code procédé>. Donc, vous obtiendrez quelque chose comme ceci:
var obj = new Foo();
// Get results
var results = obj.DoSomething();
// Check validity, and user acceptance
if(this.AreValidResults(results) && this.UserAcceptsResults(results))
{
// Save the results
results.Save();
}
else
{
// Ditch the results
results.Dispose();
}
J'aime la réponse d'Anas Karkoukli, mais une autre alternative est une machine à états. C'est un peu slap-tiret, mais vous obtenez l'idée. P> Le problème Avec la réponse d'ANAS, c'est que toutes les fonctions sont exécutées en une seule étape, ce qui signifie que vous ne pouvez pas accéder aux étapes intermédiaires de l'objet. Une machine à états oblige les développeurs à suivre le flux de travail, mais chacun à chaque étape du flux de travail, ils peuvent examiner les propriétés de l'objet avant de passer à la suivante. P> P>
excellent livre de Steve McConnel code complet em> passe un chapitre entier de discuter cette question. Il est le chapitre 14 dans la deuxième édition. Si l'ordre des déclarations est important, il est très bon de faire respecter cette commande avec les données. Ainsi, plutôt que p> Results r = calculateResults();
saveResults(r);
Oui, puis les résultats code> sont utilisables, par exemple:
updatebi (r); code>
On dirige-t-il? Utilisation: P> myFoo.DoSomething().Save();
//or something like:
var result = myFoo.DoSomething();
if (result.GetData().Importance > threshold) result.Save();
Ce n'est pas vraiment un examen de code, car ce n'est pas complet. Vous voudrez peut-être publier ceci sur le débordement de la pile, car c'est une question de conception.
@ S.Lott Oui, c'est, mais je pense que le code n'est pas complet ici. Je posterai le code complet, en tant que nouvelle question, mentionnant 2 ou 3 de réponses ici et ensuite, il ressort plus de revue de code. BTW, cette question est pertinente pour lien . Après 1,5 année de premier lancement lorsque tous les membres de l'équipe sont nouveaux (dans ce projet, pas dans la programmation!).
Le contrôle de code est pour le code complet. Après toutes les décisions de conception. C'est ce que "examen" signifie - cela signifie après que tout le travail est effectué pour la créer. Une question de conception passe sur le débordement de la pile.
Ce n'est pas un code, c'est pseudocode pour une conception. Il n'appartient pas à l'examen du code. Si vous lisez la FAQ d'évaluation du code, vous verrez clairement indiqué que les meilleures questions de pratique comme celle-ci sont hors tension.