8
votes

Meilleure pratique Lorsque l'ordre des appels en classe est important?

J'ai une classe avec deux fonctions importantes:

x.SaveSomething().DoSomeThing();


4 commentaires

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.


7 Réponses :


13
votes

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 .

prendre le méthode de modèle approche , votre classe FOO aura une base abstraite qui définit l'ordre d'exécution de do () et enregistrez () , quelque chose comme: xxx

De cette façon, les consommateurs de classe n'auront accès qu'à Doandsave () et ils n'infligent pas l'ordre d'exécution que vous avez destiné.

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.

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: xxx

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.


3 commentaires

Et si les résultats du milieu sont nécessaires par une autre partie? Par exemple, si Dosomething () Les résultats doivent être affichés à l'utilisateur, puis s'ils sont d'accord (cliquez sur certains où) puis Sauvette () 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.



6
votes

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 (...). XXX


2 commentaires

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.



2
votes

faire 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 . Si vous écrivez méthode en tant que méthode qui renvoie les résultats au code du client, vous pouvez réécrire Enregistrer , afin de recevoir les résultats sous forme de paramètre.

Avantages:

  1. Vous n'avez plus besoin de commander des méthodes plus, car 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.
  2. Vous pouvez trouver un test de test do plus facilement, car les méthodes deviennent moins couplées.
  3. Vous pouvez déplacer votre méthode Enregistrer à une autre classe, si vous avez besoin d'écrire une logique complexe Enregistrez une logique ou implémenter un motif de référentiel.

0 commentaires

2
votes

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();
}


0 commentaires

2
votes

J'aime la réponse d'Anas Karkoukli, mais une autre alternative est une machine à états. XXX

C'est un peu slap-tiret, mais vous obtenez l'idée.

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.


0 commentaires

2
votes

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);


1 commentaires

Oui, puis les résultats sont utilisables, par exemple: updatebi (r);



3
votes

On dirige-t-il? XXX PRE>

Utilisation: P>

myFoo.DoSomething().Save();
//or something like:
var result = myFoo.DoSomething();
if (result.GetData().Importance > threshold) result.Save();


0 commentaires