Functors quand devrais-je les utiliser?
Je n'arrive pas à les envelopper ma tête autour d'eux.
Que je comprends que c'est l'ajout dynamique de la logique à une classe. Sont les classes dans le cadre préparé pour cela?
Pourquoi devrais-je étendre la classe et ajouter les fonctionnalités de l'extension. Je voudrais être accessible partout dans le monde et autant que je sache, beaucoup plus facile à entretenir.
J'ai Lu il y a 4 types functor:
Comparer
Fermeture
Prédicat
Transformateur
Nous devrions probablement traiter chacun d'entre eux.
p.s. est-il quelque chose de semblable dans vb?
Je peux donc en l'état je pense que les expressions lambda sont des foncteurs. Cette opération efface les choses pour moi un peu 🙂 (hehe)
- Les expressions Lambda sont les foncteurs?
- Les fonctions anonymes sont les foncteurs?
Mais j'ai posé cette question parce que j'ai couru dans un autre type de fucntors notamment ceux-ci:
delegate void FunctorDelegate(int value);
class Addition {
FunctorDelegate _delegate;
public Addition AddDelegate(FunctorDelegate deleg) {
_delegate += deleg;
return this;
}
public int AddAllElements(IList< int> list) {
int runningTotal = 0;
foreach( int value in list) {
runningTotal += value;
_delegate(value);
}
return runningTotal;
}
}
Puis en l'appelant avec ceci:
int runningTotal = new Addition()
.AddDelegate(new FunctorDelegate(
delegate(int value) {
if ((value % 2) == 1) {
runningOddTotal += value;
}
}))
.AddDelegate(new FunctorDelegate(
delegate(int value) {
if ((value % 2) == 0) {
runningEvenTotal += value;
}
}))
.AddAllElements(list);
Donc pas de fantaisie lambda style de choses.
Maintenant, j'ai cet exemple mais il n'est pas clair du tout pourquoi c'est une "bonne" solution.
Sont délégués (foncteurs) ont utilisé les expressions lambda ou les méthodes anonymes "dans la plupart des cas" juste là comme un raccourci pour le programmeur? Il y a aussi loin que je peux voir quelques cas seulement où ils sont en fait le choix préféré pour un problème.
source d'informationauteur albertjan
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes confus termes de langues différentes. Vous semblez être à l'aide de "Foncteur" dans le C++ ou Java sens, par exemple,voir la page de wikipedia. En C++, c'est un objet d'une classe qui surcharge la fonction d'appel de l'opérateur, de sorte qu'il peut être utilisé comme une fonction, mais avec l'état.
C'est logiquement la même chose en tant que délégué à une méthode d'instance en C# (ou tout .NET de la langue).
Il y a trois façons d'écrire une telle chose. Tout d'abord, vous pouvez écrire une méthode ordinaire, puis attribuez le nom de la méthode à un délégué variable.
Seconde, vous pouvez utiliser la méthode anonyme syntaxe, introduit en C# 2.0:
Troisièmement, vous pouvez utiliser lambda syntaxe, introduit en C# 3.0:
L'avantage de la dernière deux est que le corps de la méthode peut lire et écrire des variables locales dans le contenant de la méthode.
L'avantage de la lambda la syntaxe sur la anon-méthodes qu'il est plus succinct et il n'type d'inférence sur les paramètres.
Mise à jour: L'avantage de anon-méthodes (
delegate
mot-clé) sur les lambdas, c'est que vous pouvez omettre les paramètres tout à fait si vous n'en avez pas besoin:Je ne connais qu'un exemple de situation où c'est la peine de savoir, qui est lors de l'initialisation d'un événement de sorte que vous n'avez pas à vérifier
null
avant de le tirer:Évite beaucoup de bêtises ailleurs.
Enfin, vous mentionnez qu'il existe quatre types de foncteur. En fait, il y a une infinité de peut-être délégué types, bien que certains auteurs peuvent avoir leurs favoris et il y aura évidemment quelques modèles communs. Un
Action
ouCommand
prend aucun paramètre et renvoievoid
et d'un prédicat prend une instance d'un type et retournetrue
oufalse
.En C# 3.0, vous pouvez concocter un délégué avec jusqu'à quatre paramètres de tous les types que vous aimez:
Re: Mise À Jour En Question
Vous demander (je pense) si il y a beaucoup de cas d'utilisation pour les lambdas. Il y a plus que ce qui peut éventuellement être répertoriés!
Vous le plus souvent les voir au milieu de la plus grande des expressions qui fonctionnent sur des séquences (listes calculées à la volée). Supposons que j'ai une liste de gens, et je veux une liste de personnes exactement quarante ans:
La
Where
méthode est une méthode d'extension sur leIEnumerable<T>
interface, oùT
dans ce cas est une sorte dePerson
classe.C'est connu dans .NET comme "Linq to Objects", mais connu par ailleurs comme pure programmation fonctionnelle sur des séquences ou des cours d'eau ou "paresseux" listes (toutes des noms différents pour la même chose).
.Termes NETS, je pense ce que vous décrivez est le
Delegate
- et il existe dans tous les .NET, et pas seulement C#.Je ne suis pas sûr qu'une "fermeture" qui serait un "type" de la même façon que un comparateur/prédicat/transformateur, car en C# en termes de fermeture est tout simplement un détail d'implémentation, mais peut être aucune de ces trois.
.NET, les délégués sont utilisés de deux manières principales:
Le premier est important, mais il semble que vous êtes plus intéressé par la seconde. En réalité, ils fonctionnent un peu comme unique méthode d'interfaces... envisager:
Une fermeture est plus où nous apporter plus de portée à partir de à l'extérieur le délégué en le délégué:
ici la
max
est capturé dans le délégué comme une fermeture.Re "Sont les classes dans le cadre prepaired pour cela?" - beaucoup, et LINQ va un long manière à permettre à ce même plus large. LINQ fournit les méthodes de vulgarisation sur (par exemple) tous
IEnumerable<T>
- ce qui signifie que les collections sans en fonction de délégué de l'accès à l'acquisition d'gratuitement:Ici la
Where
etOrderBy
méthodes d'extension LINQ méthodes qui prennent des délégués.Intéressant avec la terminologie; mon spontanée à l'interprétation du terme "Foncteur" était qu'elle se réfère à des méthodes anonymes. Donc, ça va être mon prendre sur elle.
Ce sont certains de mes utilisations courantes:
Comparaisons (généralement de tri d'une liste):
Je vais utiliser cette approche pour les comparaisons, plutôt que de l'avoir dans son propre méthode à l'aide d'un délégué pour cette méthode, dans le cas où ce type particulier qui se passe dans un seul endroit. Si il est probable que je veux utiliser la même comparaison ailleurs, il arrive à vivre dans son propre, réutilisable méthode.
Un autre de mes assez commune utilise est dans les tests unitaires, lorsque le test s'appuie sur certains cas d'être posée. J'ai trouvé que pour être essentielle lorsque l'unité de flux de test dans le Workflow Foundation:
Dans ce cas, il est plus simple d'avoir le gestionnaire d'événement déclaré que les méthodes anonymes car il utilise le
instance
variable qui est définie dans l'unité de test de la portée de la méthode. Avais-je intstead opté pour implelment le gestionnaire d'événements comme sa propre méthode que j'ai aussi besoin de trouver un moyen pour ramasserinstance
probablement par l'introduction d'un niveau de classe membre qui ne semble pas comme un design parfait dans une unité de la classe de test.Il y a plus de cas où je retrouve cela dans mon code, mais ils ont généralement une ou deux choses en commun:
Je suis sûr que vous voulez dire des Expressions Lambda. Ceux sont de Petites Fonctions, vous pouvez écrire très rapidement, et ils ont la caractéristique "=>" de l'Opérateur. Ce sont une nouvelle Fonctionnalité de C# 3.0.
Cet Exemple sera un classique du Transformateur; utilisation de celle que nous avons besoin d'un délégué à définir la signature de la Fonction Lambda.
Maintenant Déclarer un Lambda avec ce délégué:
Nous pouvons l'utiliser comme une fonction normale:
Ils sont utilisés dans les Requêtes LINQ beaucoup, par exemple pour Trier (Comparer), à la Recherche par le biais de (Prédicat).
Le livre "C# de Poche" (à l'exception de beign le meilleur à mon avis, une très bonne partie sur les Lambdas. (ISBN 978-0-596-51922-3 )
La vraie réponse est qu'un foncteur est un type d'objet mathématique, et est "réifiée" par des langues différentes de différentes manières. Par exemple, supposons que vous avez un "conteneur" de l'objet qui stocke un tas d'autres objets du même type. (Par exemple, un ensemble ou un tableau) Ensuite, si votre langue a une méthode qui vous permettent de "carte" sur le récipient, de sorte que vous pouvez appeler une méthode sur chaque objet dans le conteneur, puis le conteneur serait un foncteur.
En d'autres termes, un foncteur est un conteneur avec une méthode qui vous permet de passer d'une méthode à ses contenus choses.
Chaque langue a sa propre façon de faire cela, et ils ont parfois l'amalgame entre l'utilisation. Par exemple, C++ utilise des pointeurs de fonction pour représenter le "passage" d'une méthode, et appelle le pointeur de fonction d'un "foncteur." Les délégués sont juste une poignée de méthodes que vous pouvez passer. Vous êtes à l'aide de la terminologie de "mal", tout comme le C++ n'.
Haskell obtient droit. Vous déclarez un type implémente le foncteur de l'interface, et puis, vous obtenez la méthode de cartographie.
Fonctions (tels que les lambdas) sont les foncteurs trop, mais il peut être difficile de penser à une fonction comme un "conteneur". En bref, une fonction est un "conteneur" autour d'une valeur de retour, construit d'une manière telle que la valeur de retour (peut-être) repose sur les arguments de la fonction.