L'utilisation est simple dans les deux cas, mais qu'est-ce que cela signifie d'activer l'entrée de paramètres dans Parser1, par rapport à l'autre?
C'est un changement de conception fondamental. Et le design doit transmettre l'intention et le sens. Avez-vous besoin d'avoir des objets séparés pour chaque chaîne que vous souhaitez analyser? En d'autres termes, pourquoi avons-nous besoin d'une instance d'analyseur avec stringX et d'une autre instance avec stringY? Qu'en est-il de l'analyse et de la chaîne donnée que les deux doivent vivre et mourir ensemble? En supposant que «l'implémentation [d'analyse] sous-jacente» (comme le dit Robert Harvey) ne change pas, cela ne semble d'aucune utilité. Et même alors son IMHO discutable.
Comment le concept d'une classe change-t-il lors du passage de données au constructeur au lieu des paramètres de méthode?
Les paramètres du constructeur me disent que ces choses sont requises pour un objet. Un bon état n'est pas garanti sans eux. De plus, je sais comment / pourquoi un analyseur est fondamentalement différent d'un autre.
Les paramètres du constructeur m'empêchent d'avoir à en savoir trop sur la façon d'utiliser la classe. Si, à la place, je suis censé définir certaines propriétés - comment savoir cela? Toute une boîte de vers s'ouvre. Quelles propriétés? Dans quel ordre? Avant d'utiliser quelles méthodes? etc.
Une autre question se pose lorsque je me rends compte qu'une interface n'aurait aucun sens dans la deuxième implémentation:
Une interface, comme dans l'API, est les méthodes et propriétés exposées au code client. Ne vous enveloppez pas public interface { ... }
exclusivement. Ainsi, la signification de l'interface est dans le dilemme du paramètre soit-ou constructeur vs méthode, PAS public interface Iparser
vspublic sealed class Parser
La sealed
classe est bizarre. Si je pense à différentes implémentations d'analyseur - vous avez mentionné "Iparser" - alors l'héritage est ma première pensée. C'est juste une extension conceptuelle naturelle de ma pensée. IE tous les ParserX
s sont fondamentalement Parser
s. Comment le dire autrement? ... Un berger allemand est un chien (héritage), mais je peux entraîner mon perroquet à aboyer (agir comme un chien - "interface"); mais Polly n'est pas un chien, prétendant simplement, ayant appris un sous-ensemble de dogness. Les classes, abstraites ou non, servent parfaitement d' interfaces .