11
votes

Scala souligne les noms dans les noms

J'ai lu plusieurs directives de style et d'autres ressources indiquant que c'est une mauvaise idée d'utiliser des soulignements de soulignement dans les noms de méthode / variable / autres.

Quelles sont les raisons techniques de cela?

Je suis très habitué à E.G. APPETEUR DE PREPENDUX Fonctionne avec _. Il existe également des fonctions qui devraient être privées que je veux faire du public afin que je puisse y accéder via la replaction. D'autres conventions de dénomination telles que l'utilisation d'un suffixe "assistant" semblent assez encombrantes.

Toutes les pensées seraient appréciées!


0 commentaires

4 Réponses :


2
votes

Je pense que ces spécifications parlent simplement de soulignes dans les noms em> dans les noms em>.

dans quelle manière (sainf) devriez-vous écrire ce qui suit, sinon de cette façon? P>

object getterSetter {
    var _variable: Option[Double] = None
    def variable = _variable
    def variable_=(newVal: Double) { _variable = Some(newVal) }
}


4 commentaires

La préparation des traits de soulignement est une convention ; Vous devez toujours le déclarer privé. De plus, vous pouvez utiliser variableChriden ou n'importe quel nombre d'autres choses au lieu de _variable .


Oh, tu as raison. Doit avoir confondu cela. Mais variableHidden ? sérieusement?


J'utilise également _variable , mais l'argument de la réponse de Rex Kerr est intéressant.


@Alexey: Pas exactement. Vérifiez mon commentaire dessus.



5
votes

Je connais seulement la raison pour laquelle j'évite les soulignements dans les noms: ils constituent une partie importante de la syntaxe Scala qui apparaît partout. Bien sûr, vous peut les mettre en noms, mais il a tendance à ralentir l'analyseur humain de mon expérience.

Mais je dois avouer que j'utilise parfois un préfixe de soulignement pour variables privées en objets mutables, si je souhaite le nom non souligné pour les méthodes publiques. Ce serait bien si nous pouvions utiliser des primes (foo ') comme Haskell, mais je pense que cela serait lexicalement difficile.


0 commentaires

14
votes

L'opérateur Wildcard _ code> est fortement utilisé dans SCALA. Donc:

xs map (my_method)  // No similar form where _ stands for the list element


2 commentaires

Ceci est un cas très construit: vous avez un XS: SEQ [T: {DEF X: U}] . Pour que l'erreur se produise, vous avez besoin exactement d'un _x: {def appliquer (y: t): u} . Si l'une de ces trois contraintes n'est pas là, elle ne compile pas. Il doit être exactement nommé _x , doit être appelable avec un seul argument t , qui doit renvoyer un u . Je ne suis même pas légèrement convaincu.


@Flying Mouton - Il n'est pas probable que vous ayez une collision de nom de ce type; Le point est que lorsque vous lisez rapidement le code un peu familier, vous ne savez pas immédiatement si une méthode privée en code local ou une méthode publique sur l'élément de collecte est en jeu. Vous pouvez bien sûr comprendre assez rapidement, mais vous pouvez le comprendre même plus rapide si vous pouvez dire de la forme à distance.



2
votes

En plus du _ utilisé partout dans la langue non seulement comme une carte générique, mais aussi comme des parties d'API publiques comme dans les tuples ( SOYUTUPLE._1 etc.) est également interprété spécialement par le compilateur dans certains cas. Par exemple, dans Setters , qui doivent être suffixés avec _ = ou dans opérateurs unaires , qui doivent être préfixés avec unary_ < / code>.

Tout cela rend vraiment facile d'utiliser un "nom spécial" par accident ou mal interpréter un "nom ordinaire" quand quelqu'un a utilisé quelque chose de similaire mais pas exactement identique à un "nom spécial". Cela n'aura pas d'importance si cela se produisait par accident ou à cause du manque de connaissances, mais quand vous allez probablement passer quelques heures à chercher un bug. Alors ne les utilisez pas à moins que vous ne l'iez vraiment pas. Les DSL sont comme toujours une exception.


0 commentaires