78 votes

programmation orientée objet

La programmation orientée objet, d'une manière ou d'une autre est très possible dans R. Cependant, contrairement, par exemple en Python, il existe de nombreuses façons d'atteindre l'orientation de l'objet:

Ma question est:

Quelles grandes différences de distinguer ces façons de la programmation orientée-objet dans la R?

Idéalement, les réponses ici servira de référence pour les programmeurs R d'essayer de décider qui OO méthodes de programmation répond le mieux à leurs besoins.

En tant que tel, j'ai fais une demande pour plus de détails, présentés de manière objective, basée sur l'expérience, en s'appuyant sur des faits et des références. Les points Bonus pour clarifier la façon dont ces méthodes carte standard OO pratiques.

33voto

Ari B. Friedman Points 24940

S3 classes

  • Pas vraiment d'objets, plus d'une convention de nommage
  • Basé autour de la . syntaxe: E. g. pour l'impression, print des appels print.lm print.anova, etc. Et si pas trouvé,enprint.default

S4 classes

Les classes de référence

proto

  • ggplot2 a été écrit à l'origine en proto, mais finira par être réécrite en utilisant S3.
  • Pur concept (prototypes, et non des classes), mais semble difficile dans la pratique
  • La prochaine version de ggplot2 semble s'éloigner d'elle
  • Description du concept et de la mise en œuvre

R6 classes

  • Par référence
  • Ne dépend pas de S4 classes
  • "La création d' un R6 classe est similaire à la classe de référence, sauf qu'il n'y a pas besoin de séparer les champs et les méthodes, et vous ne pouvez pas spécifier les types des champs."

19voto

Josh O'Brien Points 68397

Edit sur 3/8/12: La réponse ci-dessous répond à un morceau de posté la question, qui a depuis été retiré. J'ai copié ci-dessous, afin de fournir le contexte de ma réponse:

Comment les différents OO méthodes de la carte à la plus standard OO méthodes utilisées par exemple en Java ou en Python?


Ma contribution concerne votre deuxième question, comment R OO méthodes de la carte à la plus standard OO méthodes. Comme je l'ai pensé à ce sujet dans le passé, j'ai retourné encore et encore pour deux passages, l'un par Friedrich Leisch, et l'autre par John Chambers. Les deux font un bon travail d'articuler pourquoi OO-comme la programmation en R a une saveur différente que dans de nombreuses autres langues.

Tout d'abord, Friedrich Leisch, de la Création de Packages R: Un Tutoriel" (avertissement: PDF):

S est rare, parce que c'est à la fois interactif et dispose d'un système pour l'orientation de l'objet. La conception de classes, il est clair, de programmation, mais à rendre utile comme une analyse interactive des données de l'environnement, il est logique que c'est un langage fonctionnel. Dans la "vraie" programmation orientée objet (POO) langages comme C++ ou Java de la classe et de la méthode, les définitions sont étroitement liés ensemble, méthodes font partie des classes (et donc des objets). Nous voulons incrémentale et interactive des ajouts comme les méthodes définies par l'utilisateur pour les classes pré-définies. Ces ajouts peuvent être faits à n'importe quel point dans le temps, même à la volée à l'invite de ligne de commande alors que nous analyser un ensemble de données. S essaie de faire un compromis entre l'orientation de l'objet et à l'utilisation interactive, et bien que les compromis ne sont jamais optimal par rapport à tous les objectifs qu'ils essaient d'atteindre, ils travaillent souvent étonnamment bien dans la pratique.

L'autre passage est de John Chambers superbe livre "Logiciel pour l'Analyse des Données". (Lien pour le passage cité):

La programmation orientée objet la programmation modèle diffère de la langue de tous, mais le premier point, même si S et quelques autres langages fonctionnels des cours de soutien en et les méthodes. Les définitions de méthode dans une OOP système sont locales à la classe; il n'est pas nécessaire que le même nom pour une méthode signifie la même chose chose pour une autre classe. En revanche, les définitions de méthode dans la R de ne pas résider dans une définition de classe; sur le plan conceptuel, ils sont associés avec le générique fonction. Définitions de classe entrez dans la détermination de la méthode de sélection, directement ou par héritage. Les programmeurs habitués à la programmation orientée objet modèle sont parfois frustré ou confus que leur programmation n'a pas de transfert de R directement, mais il ne peut pas. L'utilisation fonctionnelle des méthodes est plus compliqué, mais aussi plus à l'écoute pour avoir significative des fonctions, et ne peut pas être réduite à la OOP version.

14voto

jbryer Points 385

S3 et S4 semble être la langue officielle (c'est à dire intégrée) approches de la programmation orientée-objet. J'ai commencé à utiliser une combinaison de S3 avec des fonctions intégrées dans le constructeur de la fonction/méthode. Mon objectif était d'avoir un objet$method() la syntaxe de type, de sorte que j'ai semi-privées. Je dis semi-privé, car il n'y a aucun moyen de vraiment les cacher (autant que je sache). Voici un exemple simple qui ne fait pas faire quoi que ce soit:

#' Constructor
EmailClass <- function(name, email) {
    nc = list(
        name = name,
        email = email,
        get = function(x) nc[[x]],
        set = function(x, value) nc[[x]] <<- value,
        props = list(),
        history = list(),
        getHistory = function() return(nc$history),
        getNumMessagesSent = function() return(length(nc$history))
    )
    #Add a few more methods
    nc$sendMail = function(to) {
        cat(paste("Sending mail to", to, 'from', nc$email))
        h <- nc$history
        h[[(length(h)+1)]] <- list(to=to, timestamp=Sys.time())
        assign('history', h, envir=nc)
    }
    nc$addProp = function(name, value) {
        p <- nc$props
        p[[name]] <- value
        assign('props', p, envir=nc)
    }
    nc <- list2env(nc)
    class(nc) <- "EmailClass"
    return(nc)
}

#' Define S3 generic method for the print function.
print.EmailClass <- function(x) {
    if(class(x) != "EmailClass") stop();
    cat(paste(x$get("name"), "'s email address is ", x$get("email"), sep=''))
}

Et certains de code de test:

    test <- EmailClass(name="Jason", "jason@bryer.org")
    test$addProp('hello', 'world')
    test$props
    test
    class(test)
    str(test)
    test$get("name")
    test$get("email")
    test$set("name", "Heather")
    test$get("name")
    test
    test$sendMail("jbryer@excelsior.edu")
    test$getHistory()
    test$sendMail("test@domain.edu")
    test$getNumMessagesSent()

    test2 <- EmailClass("Nobody", "dontemailme@nowhere.com")
    test2
    test2$props
    test2$getHistory()
    test2$sendMail('nobody@exclesior.edu')

Voici un lien vers un blog que j'ai écrit au sujet de cette approche: http://bryer.org/2012/object-oriented-programming-in-r je serais heureux de recevoir vos commentaires, critiques et suggestions à cette approche que je ne suis pas convaincu moi-même si c'est la meilleure approche. Toutefois, pour le problème que j'essayais de résoudre, il a beaucoup travaillé. Plus précisément, pour le mainteneur de paquet (http://jbryer.github.com/makeR) je n'ai pas envie aux utilisateurs de modifier les champs de données directement parce que j'avais besoin pour s'assurer qu'un fichier XML qui représentait mon objet de l'état de rester en synchronisation. Il a parfaitement fonctionné tant que les utilisateurs respectent les règles que j'ai aperçu dans la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X