2009-07-30 7 views
1

Je suis curieux de savoir à ce sujet.Pourquoi toutes les fonctions du langage orienté objet permet de ne renvoyer qu'une seule valeur (Général)

chaque fois que j'écris une fonction qui doit renvoyer plusieurs valeurs, soit je dois utiliser passer par référence ou créer une valeur de stockage de tableau et lui passer.

Pourquoi toutes les fonctions Object Orinented languages ​​ne sont pas autorisées à renvoyer plusieurs paramètres lorsque nous les transmettons en entrée. Comme s'il y avait quelque chose de structuré dans la langue qui est limitant de faire cela. Ne pensez-vous pas que ce sera amusant et facile si nous sommes autorisés à le faire.

+4

Ce n'est pas vrai; certaines langues supportent les tuples. –

+0

@Ed regardez la discussion ci-dessous. –

+0

Il n'y avait aucune discussion ci-dessous quand j'ai posté ce commentaire. –

Répondre

2

Cela est probablement dû à la façon dont les processeurs ont été conçus et donc transmis à des langages modernes tels que Java ou C#. Le processeur peut charger plusieurs choses (pointeurs) dans des registres de paramètres mais n'a qu'un seul registre de valeur de retour qui contient un pointeur. Je suis d'accord que pas tous les langages OOP ne supportent que le renvoi d'une valeur, mais pour ceux qui "apparemment" font, je pense que c'est la raison pour laquelle.

De même pour renvoyer un tuple, une paire ou une structure d'ailleurs en C/C++, le compilateur retourne un pointeur vers cet objet.

+0

Oui, mais pourquoi ne pas utiliser plusieurs paramètres au lieu d'affecter plusieurs valeurs au même paramètre. – rkb

+0

Qu'entendez-vous par plusieurs valeurs/paramètres? –

+0

Je peux expliquer dans une machine inventée et un langage C-like, si vous le souhaitez. –

0

En PHP, c'est comme ça parce que la seule façon de recevoir une valeur est d'assigner la fonction à une variable (ou de la mettre à la place d'une variable). Bien que je sache array_map vous permet de faire return something & something;

4

Il n'est pas vrai que toutes les langues orientées objet suivent ce paradigme.

par exemple. en Python (de here):

def quadcube (x): 
    return x**2, x**3 

a, b = quadcube(3) 

a sera 9 et b sera 27.

+2

Est-ce que cela retourne vraiment deux entiers? J'étais sous l'impression que cela renvoyait un seul objet, un tuple (9,27), qui est automatiquement déballé lorsqu'il est assigné à 'a, b'. –

+0

hey c'est encore nouveau pour moi, cela fonctionne en C++ aussi. – rkb

+0

Quelle est la différence effective dans ce cas entre retourner plusieurs objets et retourner un tuple? – Chuck

1

Première réponse: Ils ne le font pas. de nombreux langages OOP vous permettent de retourner un tuple. Cela est vrai par exemple en python, en C++ vous avez pair<> et en C++ 0x un tuple<> à part entière est dans TR1.

Deuxième réponse: Parce que c'est comme ça que ça devrait être. Une méthode doit être courte et faire une seule chose et peut donc être argumentée, seulement besoin de retourner une chose.

+0

Mais renvoyer un tuple/une paire en C++ retourne un pointeur vers la valeur, pas les valeurs elles-mêmes. –

+0

Pas vrai. retourner un pointeur sur 'pair <>' n'a aucun sens. Vous le renvoyez toujours en valeur. – shoosh

3

La différence entre la traditionnelle

OutTypeA SomeFunction(out OutTypeB, TypeC someOtherInputParam) 

et votre

{ OutTypeA, OutTypeB } SomeFunction(TypeC someOtherInputParam) 

est juste du sucre syntaxique. En outre, la tradition de renvoyer un seul type de paramètre permet d'écrire dans le langage naturel lisible de result = SomeFunction(...). C'est juste la commodité et la facilité d'utilisation.

Et oui, comme d'autres l'ont dit, vous avez des tuples dans certaines langues.

0

Pour renvoyer plusieurs paramètres, vous renvoyez un seul objet contenant ces deux paramètres.

public MyResult GetResult(x) 
{ 
    return new MyResult { Squared = Math.Pow(x,2), Cubed = Math.Pow(x,3) }; 
} 

Pour certaines langues, vous pouvez créer des types anonymes à la volée. Pour les autres, vous devez spécifier un objet de retour en tant que classe concrète. Une observation avec OO est que vous finissez avec beaucoup de petites classes.

Les subtilités syntaxiques de python (voir la réponse de Cowan) relèvent du concepteur du langage. Le compilateur/runtime pourrait créer une classe anonyme pour contenir le résultat pour vous, même dans un environnement fortement typé comme le CLR .net.

Oui, il peut être plus facile à lire dans certaines circonstances, et oui ce serait bien. Cependant, si vous lisez Eric Lippert's blog, vous lirez souvent des dialogues et l'entendrez parler de la façon dont il y a beaucoup de fonctionnalités intéressantes qui peuvent être implémentées, mais beaucoup d'efforts sont consacrés à chaque fonctionnalité, et certaines choses ne se font pas la coupe parce qu'à la fin ils ne peuvent pas être justifiés.

+0

Egalement en C#, il y a un System.Collections.Generic.KeyValuePair, et .Net 4 est censé avoir des génériques Tuple <>. Voir SO question http://stackoverflow.com/questions/152019/tuples-in-c –

0

Ce n'est pas une restriction, c'est juste l'architecture des paradigmes de programmation orientée objet et structuré. Je ne sais pas si ce serait plus amusant si les fonctions renvoyaient plus d'une valeur, mais ce serait sûrement plus compliqué et plus compliqué. Je pense que les concepteurs des paradigmes de programmation ci-dessus y ont pensé, et ils avaient probablement de bonnes raisons de ne pas implémenter cette "fonctionnalité", car vous pouvez déjà retourner plusieurs valeurs en les regroupant dans une sorte de collection. Les langages de programmation sont conçus pour être compacts, donc les fonctionnalités habituellement inutiles ne sont pas implémentées.

Questions connexes