web-dev-qa-db-fra.com

Pourquoi Scala n'a pas de membres statiques dans une classe?

Je sais que tu peux les définir indirectement réaliser quelque chose de similaire avec des objets compagnons mais je me demande pourquoi, en tant que conception de langage, les statiques ont été supprimées des définitions de classe.

50
numan salati

J'ai également posté cette question sur scala users google group et Bill Venners, l'un des auteurs de la réponse "Programmation en scala", avait quelques idées.

Jetez un œil à ceci: https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/6vZJgi42TIMJ et https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/oTrLFtwGjpEJ

En voici un extrait:

Je pense qu'un objectif était simplement d'être plus simple, en faisant que chaque valeur soit un objet, chaque opération un appel de méthode. La statique et les primitives de Java sont des cas particuliers, ce qui rend le langage plus "compliqué" dans un certain sens.

Mais un autre gros problème, je pense, est d'avoir quelque chose que vous pouvez mapper la statique de Java en Scala (parce que Scala avait besoin d'une construction mappée à la statique de Java pour l'interopérabilité)) , mais qui bénéficie de OO héritage/polymorphisme. Les objets singleton sont de vrais objets. Ils peuvent étendre une superclasse ou mélanger des traits et être transmis comme tels, mais ils sont aussi de nature "statique" Cela s'avère très pratique dans la pratique.

Jetez également un œil à cette interview de Martin Odersky (faites défiler jusqu'à Innovations orientées objet dans Scala) http://www.artima.com/scalazine/articles/goals_of_scala .html

En voici un extrait:

Tout d'abord, nous voulions être un langage purement orienté objet, où chaque valeur est un objet, chaque opération est un appel de méthode et chaque variable est membre d'un objet. Donc, nous ne voulions pas de statique, mais nous avions besoin de quelque chose pour les remplacer, alors nous avons créé la construction d'objets singleton. Mais même les objets singleton sont toujours des structures globales. Le défi était donc de les utiliser le moins possible, car lorsque vous avez une structure globale, vous ne pouvez plus la changer. Vous ne pouvez pas l'instancier. C'est très difficile à tester. Il est très difficile de le modifier de quelque façon que ce soit.

Pour résumer:

Du point de vue de la programmation fonctionnelle, les membres statiques sont généralement considérés comme mauvais (voir ceci post par Gilad Bracha - le père des génériques Java. Cela concerne principalement les effets secondaires car de l'état global.) Mais scala devait trouver un moyen d'être interopérable avec Java (donc il devait supporter la statique) et minimiser (bien que pas totalement éviter) les états globaux créés en raison de la statique, scala a décidé de les isoler dans des objets compagnons.

Les objets compagnons ont également l'avantage d'être extensibles, c'est-à-dire. tirer parti de l'héritage et de la composition du mixage (distinct de l'émulation de la fonctionnalité statique pour l'interopérabilité).

16
numan salati

Le O dans OO signifie "Object", pas classe. Être orienté objet est tout au sujet des objets ou des instances (si vous préférez)

La statique n'appartient pas à un objet, elle ne peut pas être héritée, elle ne participe pas au polymorphisme. Autrement dit, la statique n'est pas orientée objet.

Scala, d'autre part, est orienté objet. Bien plus que Java, qui s'est particulièrement efforcé de se comporter comme C++, afin d'attirer les développeurs de ce langage.

Il s'agit d'un hack, inventé par C++, qui cherchait à jeter un pont entre les mondes de la programmation procédurale et OO, et qui devait être rétrocompatible avec C.Il admettait également des primitives pour des raisons similaires.

Scala supprime les statiques et les primitives, car ils sont une relique d'une époque où les anciens développeurs procéduraux devaient être apaisés. Ces choses n'ont pas leur place dans un langage bien conçu qui souhaite se décrire comme orienté objet.


Concernant pourquoi il est important que par vraiment OO, je vais copier et coller sans vergogne cet extrait de Bill Venners sur la liste de diffusion:

La façon dont je le vois, cependant, est que les objets singleton vous permettent de faire les choses statiques là où ils sont nécessaires de manière très concise, mais bénéficient également de l'héritage lorsque vous en avez besoin. Par exemple, il est plus facile de tester les parties statiques de votre programme, car vous pouvez créer des traits qui modélisent ces parties et les utiliser partout. Ensuite, dans le programme de production, utilisez une implémentation d'objet singleton de ces traits, mais dans les tests, utilisez des instances fictives.

Je n'aurais pas pu mieux dire moi-même!

Donc, si vous voulez créer un seul élément, la statique et les singletons peuvent faire le travail. Mais si vous voulez que cette chose hérite d'un comportement quelque part, alors la statique ne vous aidera pas.

D'après mon expérience, vous avez tendance à utiliser cette capacité beaucoup plus que vous ne l'auriez pensé à l'origine, surtout après avoir utilisé Scala pendant un certain temps.

56
Kevin Wright

Ce sont des choses qui me viennent à l'esprit quand je pense à la façon dont la statique pourrait compliquer les choses:

1) L'héritage ainsi que le polymorphisme nécessiteraient des règles spéciales. Voici un exemple:

// This is Java
public class A {
  public static int f() {
    return 10;
  }
}

public class B extends A {
  public static int f() {
    return 5;
  }
}

public class Main {
  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.f());
    B b = new B();
    System.out.println(b.f());
    A ba = new B();
    System.out.println(ba.f());
   }
}

Si vous êtes sûr à 100% de ce qui est imprimé, tant mieux pour vous. Le reste d'entre nous peut compter sur des outils puissants comme @Override annotation, qui est bien sûr optionnelle et conviviale "La méthode statique f() du type A doit être accessible de manière statique" avertissement. nous amène à

2) La "manière statique" d'accéder aux trucs est une autre règle spéciale, qui complique les choses.

) Les membres statiques ne peuvent pas être abstraits. Je suppose que vous ne pouvez pas tout avoir, non?

Et encore une fois, ce ne sont que des choses qui me sont venues à l'esprit après avoir réfléchi à la question pendant quelques minutes. Je parie qu'il y a un tas d'autres raisons, pourquoi la statique ne rentre tout simplement pas dans le paradigme OO.

4
agilesteel

C'est vrai, le membre statique n'existe pas, MAIS, il est possible d'associer un objet singleton à chaque classe:

class MyClass {
}

object MyClass {
}

pour obtenir des résultats similaires

2
Simone

La programmation orientée objet concerne les objets et leurs états (ne pas toucher les objets à état plein et sans état en Java). J'essaie de souligner "La statique n'appartient pas aux objets". Les champs statiques ne peuvent pas être utilisés pour représenter un état d'un objet il est donc rationnel de se retirer des objets.

1
Balaji Reddy