web-dev-qa-db-fra.com

julia: OOP ou pas

Je travaille sur Juno avec Julia.

Je ne sais pas si Julia importe OOP ou non.

Par exemple, y a-t-il quelque chose comme class ou struct de c ++?

Comment le déclarer avec des membres tels qu'une donnée ou une fonction?

30
Yves

En cas de doute, lisez la documentation ...

https://docs.julialang.org/en/v1/manual/types/#Composite-Types-1

Longue histoire courte:

struct MyType
    a::Int64
    b::Float64
end

x = MyType(3, 4)

x.a

EDIT: les méthodes sont définies en dehors de la définition du type, par exemple.

function double(x::MyType)
    x.a *= 2
end

Les méthodes ne pas résident dans le type, comme elles le feraient en C++ ou en Python, par exemple. Cela permet à l’une des fonctions clés de Julia, la répartition multiple, de fonctionner également avec les types définis par l’utilisateur, qui se trouvent exactement au même niveau que les types définis par le système.

33
David P. Sanders

Julia n'est pas totalement orientée objet, car vous ne pouvez pas attacher de méthodes aux objets de Julia ("types"). Les types semblent cependant très similaires aux objets. Cependant, comme ils n'ont pas leurs propres méthodes associées et qu'il n'y a pas d'héritage, les objets eux-mêmes ne font pas l'acte. Au lieu de cela, vous avez des fonctions qui agissent sur les objets.

La différence est ball.checkCollision () vs checkCollision (balle, murs). En réalité, ce n'est pas un gros problème. Vous pouvez faire quelque chose comme l'héritage en faisant en sorte qu'un type ait un champ d'un autre type, et plusieurs envois vous permettent d'écrire des fonctions qui font différentes choses en fonction des objets que vous leur donnez, qui peuvent être presque comme des méthodes objet. La vraie différence réside dans l'emplacement où vous enregistrez la fonction et les types dans un fichier. Vous pouvez donc faire un genre de style orienté quasi-objet dans Julia, mais il est toujours nettement différent des langues OOP.

20
Chris Rackauckas

J'aimerais mentionner cette conversation utile au sein du groupe d'utilisateurs de Julia Julia et programmation orientée objet .
Pour moi, Julia n’est pas comme un langage OO conventionnel, et j’aime toujours penser à Julia, plutôt qu’à un langage Method Oriented plutôt qu’à Object Oriented, Si vous essayez de créer une structure de données encapsulées et de fonctionnalités dans Julia, vous allez bientôt vous retrouver dans le pétrin. 

8
Reza Afzalan

Je ne suis pas un expert sur la langue mais ma compréhension est la suivante: oui ... et non.

Il a l'équivalent de classes et de structures, mais il n'y a pas de méthodes sur ces objets autres qu'un constructeur.

Dans les principaux langages orientés objet, tels que C++, Java, Python et Ruby, les types composites sont également associés à des fonctions nommées, et la combinaison est appelée un "objet". Dans des langages orientés objet plus purs, tels que Python et Ruby, toutes les valeurs sont des objets, qu’elles soient composites ou non. Dans les langages moins orientés objet, y compris C++ et Java, certaines valeurs, telles que les entiers et les valeurs à virgule flottante, ne sont pas des objets, tandis que les instances de types composites définis par l'utilisateur sont des objets véritables associés à des méthodes. Dans Julia, toutes les valeurs sont des objets, mais les fonctions ne sont pas associées aux objets sur lesquels elles agissent. Ceci est nécessaire car Julia choisit la méthode d'une fonction à utiliser par plusieurs envois, ce qui signifie que les types de tous les arguments d'une fonction sont pris en compte lors de la sélection d'une méthode, et pas seulement le premier (voir Méthodes pour plus d'informations sur les méthodes et l'envoi. ). Ainsi, il serait inapproprié que les fonctions «appartiennent» uniquement à leur premier argument. Organiser les méthodes en objets de fonction plutôt que d'avoir des paquets de méthodes nommés «à l'intérieur» de chaque objet finit par être un aspect très bénéfique de la conception du langage.

2
Tim B

Oui. Il ne peut tout simplement pas hériter de "classes" concrètes, mais seulement de classes abstraites.

Les fonctions à envoi multiple sont une généralisation stricte des méthodes à envoi unique et sont plus polymorphes. Vous devez juste les définir en dehors d'une définition de classe, car ils peuvent "appartenir" à plusieurs objets.

Les méthodes traditionnelles dans une langue OO constituent un cas particulier de fonctions de Julia dans lesquelles la répartition est uniquement basée sur le premier argument.

2
saolof

La réponse est que Julia est plus proche de c que de c ++. Ainsi, OOP est limité dans Julia n'ayant que c :: struct plutôt que c ++ :: class. Par conséquent, il ne s'agit que d'encapsulation de données ou de structure de données ou de personnalisation de types plutôt que de véritables objets OOP au sens strict.

0
geekborj