2015-03-29 1 views
0

J'ai juste une petite question à poser. Est-ce une mauvaise pratique de programmation ou est-ce correct?La chaînage méthode/propriété est-il une bonne pratique?

En ce moment, j'ai quelque chose comme ceci:

TestClass testClass = ClassSelectorTool.Selector.SelectedClasses.ElementAt(index) 

Comme vous pouvez le voir. Il faut plusieurs appels pour obtenir la valeur que je voudrais. Y a-t-il une meilleure façon d'y parvenir? Ou est-ce correct?

Merci d'avance.

+0

Pouvez-vous identifier un préjudice spécifique que le code ci-dessus cause à votre programme? Si oui, alors vous devriez poser une question spécifique sur la façon d'éviter ce mal. Si non, je pense que vous avez déjà répondu à votre propre question. –

+0

Ceci est appelé "méthode de chaînage" et il est très subjectif/basé sur l'opinion. Ce n'est généralement pas le genre de question qui obtiendra une bonne réponse sur ce site. Une autre façon de le faire (si vous ne l'aimez pas) serait d'assigner les résultats de certains appels de méthodes à une variable et d'utiliser cette variable pour invoquer des méthodes supplémentaires. Personnellement, je déciderais en fonction du nombre de fois que je devrais faire référence à 'SelectedClasses', si j'en avais juste besoin une fois que j'utiliserais le chaînage des méthodes, sinon je l'assignerais à une variable. – user700390

+0

@VincentUgenti Oui c'est le nom! J'ai complètement dessiné un blanc et je ne me souviens pas de ce qu'on l'appelait. Mais ne serait-il pas plus approprié d'appeler le chaînage de propriété? – CodingMadeEasy

Répondre

0

Je pense que c'est bon tant que l'une des propriétés de votre chaîne n'est pas nulle, sinon vous obtiendrez une exception de référence nulle.

2

Chaînage de méthodes? Mais il n'y a qu'une seule méthode.

C'est un indicateur important de mauvaise conception lorsque vous devez traverser votre graphe d'objets avec de longues chaînes de propriétés afin de trouver ce que vous cherchez. Vous violez l'encapsulation en exigeant une telle connaissance intime du fonctionnement interne de votre ClassSelectorTool. Pourquoi ne pas créer une propriété sur ClassSelectorTool qui cache cette complexité à l'utilisateur de la classe?

class ClassSelectorTool 
{ 
    //............ 
    public IEnumerable<Foo> SelectedClasses 
    { 
     get 
     { 
      return Selector.SelectedClasses; 
     } 
    } 
} 

Alors maintenant:

ClassSelectorTool.SelectedClasses.ElementAt(index); 

Maintenant, l'utilisateur de cette classe n'a pas besoin de connaître les détails de mise en œuvre d'obtenir les classes sélectionnées (à savoir qu'il est traitée par un objet de sélection).

Moins de bruit.

Plus facile à entretenir.