• [^] # Re: Performance

    Posté par . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 3.

    Pour le typage structurel, on peut tout à fait faire cela statiquement et sans écrire d'annotation.

    C'est ce que fait go. Typescript a un typage structurel vérifié à la compilation, mais il est optionnel.

    Enfin, pour ce qui est des objets et du typage structurel, la façon dont ils sont globalement utilisés en pratique cela en fait surtout des modules du pauvre. En OCaml on utilisera plutôt des modules, en Haskell des type classes, en Rust des traits et en C++ des template.

    L'intérêt c'est de pouvoir avoir un polymorphisme qui ne soit pas nommé. Quand on veut créer une méthode qui va manipuler des données qui ont un id qui est un UUID par exemple. Le typage structurel peut permettre d'avoir des données qui ne sont pas liées entre elles, mais qui possèdent toutes un id de la bonne forme.

    Je ne connais pas les autres, mais je ne suis pas certains que C++ permettent d'être aussi souple que go. En go (et c'est pour moi le gros intérêt), ta structure n'a pas a connaître la structure nécessaire à ta méthode pour être utilisable.

    package main
    import "fmt"
    type User interface {
     Greeting() string
    }
    type Plouf struct {
     FirstName, LastName, Addr string
    }
    func (p Plouf) Greeting() string {
     return fmt.Sprintf("Dear %s %s", p.FirstName, p.LastName)
    }
    func Foo(u User) {
     fmt.Println(u.Greeting())
    }
    func main() {
     u := Plouf{"Matt", "Aimonetti", "chez moi"}
     Foo(u)
    }

    Le type Plouf n'a aucun rapport avec l'interface User. Ça permet d'écrire après coup des fonctions qui définissent des interfaces décrivant le contrat que doivent remplir leur arguments sans impact sur les types créé ailleurs. Dans l'usage on peut généraliser une fonction à un ensemble de type qui sont dans différentes bibliothèques. Je sais pas si c'est très clair...

    En java je fais un hack a coup de lambda pour ça.