web-dev-qa-db-fra.com

Pourquoi est-il possible d'écrire une fonction en dehors d'une classe dans Kotlin?

Je ne comprends pas pourquoi il est possible d'écrire une fonction en dehors d'une classe dans Kotlin? Est-ce une bonne pratique?

Par exemple, il est possible dans Kotlin d'écrire une fonction en dehors de ma classe MainActivity:

fun hello(){}

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        hello()
    }
}

En Java, c'est impossible! Ce n'est pas ainsi qu'un langage orienté objet fonctionne normalement, non?

Dans la documentation, ils parlent de Fonctions locales pour la fonction classique et Fonctions membres pour la fonction définie dans une classe ou un objet mais ils n'expliquent pas quand il est préférable d'utiliser un ou l'autre.

23
Jéwôm'

En Java, c'est impossible! Ce n'est pas ainsi qu'un langage orienté objet fonctionne normalement, non?

Arrêtez-vous une seconde et revoyez la nature de la méthode statique de Java. Une classe est censée être un modèle pour les objets, décrire leur comportement et leur état. Mais vous pouvez appeler une méthode statique sans créer d'instances.

Comment cela s'intègre-t-il dans l'image orientée objet? Comment une méthode statique "appartient" à la classe dans laquelle elle est déclarée?

En fait, les méthodes statiques sont un hack en Java, elles polluent et abusent de la notion de classe OOP. Mais vous vous y êtes habitué au fil des ans, donc vous ne le sentez plus.

Conceptuellement, une méthode statique est une fonction de niveau supérieur et Java utilise le nom de sa classe déclarante comme espace de noms. Contrairement à cela, Kotlin vous permet de déclarer des fonctions de niveau supérieur sans abuser de la classe pour l'espace de noms.

33
Marko Topolnik

Oui, c'est une bonne pratique. Kotlin n'est pas un langage purement orienté objet, il n'est donc pas obligé de suivre comment "un langage orienté objet fonctionne normalement" (même si d'autres langages orientés objet, tels que C++, Ruby et Python, autorise également les fonctions de niveau supérieur).

Il est préférable d'utiliser une fonction de niveau supérieur lorsque la logique de cette fonction n'appartient clairement à aucune classe.

13
yole