[RUBY] A propos de l'attribution d'un nom aux méthodes de modèle Rails

introduction

En ce qui concerne la dénomination des Rails, il existe de nombreuses descriptions pour le modèle, le contrôleur et les tables, mais il semble qu'il n'y ait pas beaucoup d'écrit sur les noms de méthode, les noms de variables et les noms de portée.

Un bon ou un mauvais nommage a un gros impact sur la lisibilité du code, mais d'un autre côté, nous qui ne sommes pas bons en anglais donnons souvent des dénominations sanglantes et accumulons souvent des dettes techniques.

En premier lieu, ruby a une spécification de langage qui est consciente du goût d'écriture anglais ("poi" jusqu'au dernier), donc je pense que les noms de méthodes, les noms de variables et les noms de portées devraient suivre dans une certaine mesure cette manière. Par conséquent, j'ai reconsidéré les lignes directrices que ces noms devraient suivre.

Je vais l'écrire de différentes manières, donc j'aimerais le subdiviser. Cette fois, j'ai pensé à nommer la méthode, la portée et (un peu) variable du modèle, mais je penserai au contrôleur plus tard.

TL; DR (édition du modèle)

Nommer la cible format
portée "Adjectif (phrase)","préposition_nom",«Vibration»,"Ancienne forme participative du verbe"
Méthode avec action "Autre verbe" → L'objet de l'autre verbe doit être l'objet récepteur!
Méthode de jugement "Adjectif (phrase)?」,"préposition_nom?」,"Vibration ing?」,"Ancienne forme participative du verbe?」
Méthode sans effet "Nomenclature (phrase)" → Peut être utilisé comme propriété
Méthode pour transformer l'objet lui-même 「to_nom"
variable "Nomenclature (phrase)"
Variables (exceptions) "Ancienne forme participative du verbe_préposition(_Nomenclature) »→ Évitez si vous pouvez l'éviter

Faites attention à la partie du mot que vous utilisez. Et le plus important est de lire et de comprendre le sens.

Détails

Nom de la portée

Doit être un adjectif ou une phrase adjectif. Le nom de la portée post-qualifie le nom du modèle. Utilisez la partie «quoi» de «quel OO» comme nom de portée. Le nom du modèle est entré dans 〇〇.

Si la portée est nommée de manière à être post-modifiée avec une phrase adjectif, elle ne cassera pas dans la grammaire anglaise même lorsque la portée est enchaînée. Book.in_sale.published_by("O'Reilly") ← Book (which is) in sale published by O'Reilly

Exemple typique

Nom du modèle. Verbe + ing ou nom du modèle. Ancienne forme participative du verbe

Shop.selling_books #Magasins vendant des livres
Task.not_running #Forme négative
Book.published #Ancienne forme participative
Book.published_by("O'Reilly") #Portée qui prend également des arguments

Book (which is) published by O'Reilly

C'est un bon nom pour ressembler à une nomenclature avec le (qui est) omis.

Nom du modèle. Préfixe + nez

Shop.without_blue_roof
Devil.in_the_prada
Man.with_the_machine_gun

Nom du modèle. Adjectif

Mission.impossible
Daemon.alive
Picture.not_displayable
Tower.taller_than(100)
Session.expired #Supplément)expired peut être considéré comme un adjectif ou une forme participative passée d'un mot automatique (il n'y a pas de grande différence)

Motif inutile

Parfois, je vois les noms de portée dans le style : filtered_xxxx, mais ces noms sont redondants car les fonctions de portée sont réduites en premier lieu.

Nous déconseillons également : can_xxxx. Le jugement d'une bonne dénomination est de savoir si ce qui est, qui a été omis en tant que «nom du modèle (qui est) la portée», est réactivé et grammaticalement réduit.

Nom de la méthode

La manière de penser est très différente selon que la méthode implique une action (changement de variables, etc.) ou une méthode qui n'a pas d'action.

Méthode avec action

"Que faire" avec "sujet (objet appelant)" comme "objet (récepteur)". La partie «que faire» est le nom de la méthode. En conséquence, il modifie l'état des variables internes, agit sur les objets externes et accède aux services externes.

cow.grow # <=  I grow up the cow.En conséquence, la vache.L'âge est incrémenté, et ainsi de suite.
file.delete # <= I delete the file.En conséquence, le fichier disparaît sur le système de fichiers externe (pour le programme).
job.perform # <= I perform the job.

Parfois, je vois des méthodes où le récepteur (objet) est le sujet, mais ce n'est pas bon. Cela peut sembler bon pendant un moment, mais à long terme, il n'est plus orienté objet et commence à s'effondrer.

#mauvais exemple
manager.evaluate(member) # <=Un manager évalue son membre tel qu'il est.

Méthode sans action

Méthodes de prédicat

Les méthodes basées sur le jugement (non agissant) qui renvoient «vrai» ou «faux» ont une approche de dénomination distinctement différente de celle des méthodes normales (agissant). Seulement dans ce cas, le récepteur est traité comme le sujet.

Par exemple, l'instruction qui détermine si Shop est à l'état ouvert

shop.open? # <= Is the shop open?

Dans d'autres langues, nous faisons souvent des méthodes de jugement avec la colle avec le verbe be shop.is_open. Dans Ruby / Rails, le verbe be est généralement omis et un «?» Est ajouté à la fin. Je pense que c'est une culture propre à la spécification du langage qui «?» Peut être utilisé, et en premier lieu, «S + V + C» devient «V + S + C?», Donc «est entre le sujet et le complément «N'entre pas.

Seulement dans le cas d'une méthode de jugement, le nom de la méthode doit être "complémentaire". (S = objet, V = omis, C = nom de la méthode) → Semblable à la dénomination des portées, elle est basée sur "adjection?", "Préfixe + nez?", "Vibration + ing?", Ou "forme participative passée du verbe?".

Y a-t-il ou non can_xxx, can_be_yyy? Je pense qu'il vaut mieux l'éviter autant que possible. J'y penserai plus tard.

Méthode de déni du système de jugement

Ne créez pas autant que possible une méthode appelée shop.not_open?. Tout ce que vous avez à faire est d'écrire «! Shop.open?». Si les conditions de jugement se compliquent, la lisibilité de la méthode diminuera également, donc je pense qu'il est bon de la concevoir de manière à ne pas inclure la signification du déni en premier lieu.

Une méthode qui n'a aucun effet mais qui ne juge pas

Pour les méthodes qui ne retournent pas «true» / «false», il semble préférable de définir celles qui peuvent être utilisées comme propriétés de l'extérieur en tant que propriétés. La dénomination à ce moment est du même style que le "nom de variable" décrit plus loin.

Ou, si vous voulez convertir l'objet lui-même dans un autre format, vous devez le nommer to_xxx. N'utilisez pas convert_to_xxx.

Par exemple

class Sylinder
  attr_accessor :bore, :stroke

  def initializer(bore, stroke)
    @bore = bore
    @stroke = stroke
  end

  def displacement # <=Parce qu'il n'affecte pas l'état interne de l'objet:calculate_N'utilisez pas de noms de méthodes comme le déplacement
    (@bore/2) * (@bore/2) * Math::PI * @stroke
  end
end

Nom de variable

Fondamentalement, je souhaite utiliser une nomenclature comme nom de variable. Les variables sont des attributs appartenant à l'objet (ou à la classe). Le nom de l'attribut est un nom. Vous pouvez affiner la signification en ajoutant un acronyme ou une cote de possession avant la nomenclature.

user.email
user.first_name

Exceptionnellement, une variable qui contient des informations auxiliaires sur une action sur l'objet peut avoir un nom de variable sous la forme de la forme partielle passée du verbe + le préfixe (+ nomenclature). Si vous pouvez l'exprimer sans utiliser de tels noms de variables, je pense que c'est plus facile à lire plus tard si vous l'évitez.

article.created_at
article.published_by
article.referenced_in_indices

Considération

Spécification du langage Ruby

automator.call bob if not bob.awake?

De l'endroit où vous pouvez appeler l'argument de la méthode sans parenthèses comme, et de l'endroit où les mots-clés «not», «et» sont définis A l'origine, il est possible d'écrire dans un langage naturel ** comme ** avec une description moins symbolique. Le stress de la lecture de code peut être réduit en concevant la dénomination des portées, des méthodes et des variables de sorte que l'expression ressemble à un langage naturel lors de l'appel.

Bases de la grammaire anglaise

On sait que la grammaire anglaise est essentiellement classée dans les cinq modèles de phrases suivants.

  1. S+V
  2. S+V+C
  3. S+V+O
  4. S+V+O+O
  5. S+V+O+C

Je pense que les composants du modèle de phrase et les concepts correspondants dans la programmation Rails sont les suivants.

S: Sujet (partie principale) → Appelant (sujet) V: verbe → méthode O: Objet (nom) → Récepteur (objet qui a la méthode) et argument de méthode (dans le cas du modèle de 4ème phrase) C: Complément (avocat / complément / phrase adjectif / phrase complémentaire) → Valeur de substitution

Le "O" en S + V + O est le "O" en Orienté objet.

Expressivité que les langages orientés objet devraient couvrir

Fondamentalement, il semble bon de penser que l'appel de méthode exprime la phrase du modèle de troisième phrase. En dehors de cela, sera-t-il implémenté comme une affectation ou un changement de propriété, ou sera-t-il implémenté en le convertissant en modèle de troisième phrase?

Premier modèle de phrase: S + V

Pas tellement. En effet, l'orientation objet est un paradigme dans lequel l'appelant agit sur le récepteur pour implémenter le processus. Je pense que le simple file.delete () est en fait le modèle de troisième phrase.

file.delete # <= I deletes the file.

Modèle de deuxième phrase: S + V + C

Puisque O (Object) n'apparaît pas, il s'agit également d'un cas rare en tant que formulaire de méthode. Si tel est le cas, je pense que l'objet appelant attribuera quelque chose à sa propriété, ou quelque chose comme ça.

Les variations de V (verbe) qui prennent ce modèle de phrase sont les suivantes.

Type d'état: être, regarder, sembler, apparaître, garder, rester, mentir Variantes: devenir, obtenir, tourner, grandir, fabriquer, venir, partir, tomber Type sensoriel: odeur, goût, sensation, son Source: https://www.eng-builder.jp/learning/sentence-pattern2/

En d'autres termes, bien que ces verbes diffèrent selon qu'ils sont accompagnés de changements ou non, ils expriment tous que S est à l'état de C («S = C») en conséquence. Lors de la description de cette expression par programmation, dans la plupart des cas, il semble que cela puisse être réalisé en attribuant une valeur à la propriété qui représente l'état de l'objet.

alice.health = :fine # <= Alice becomes fine.

Modèle de troisième phrase: S + V + O

C'est facile à comprendre. Cela semble être le plus.

file.delete # <= I delete the file.
window.move_to(100, 300) # <= I move the window to (100, 300).

Je pense que l'argument donné est souvent utilisé comme une phrase complémentaire pour modifier la phrase entière. En bref, l'argument est un paramètre qui ajuste l'action sur l'objet. Je pense que le paramètre devrait être const dans la méthode appelée, mais je n'y ai pas encore pensé.

Modèle de quatrième phrase: S + V + O1 + O2

Les variations de V (verbe) qui prennent ce modèle de phrase sont les suivantes.

give, show, offer, hand, pass, send, teach, tell, pay, lend, do

En tant que tendance, on peut voir que S signifie donner O2 à O1. Lors de l'écriture en programmation orientée objet, je pense que cela peut souvent être exprimé en attribuant / ajoutant des propriétés.

alice.belongings.push book # <= I give Alice a book
alice.give book # <= I give Alice a book

Modèle de cinquième phrase: S + V + O + C

Les variations de V (verbe) qui prennent ce modèle de phrase sont les suivantes.

make, get, keep, leave, think, believe, find, call, name

On peut voir que tous sont des verbes qui expriment l'état O = C. Un verbe qui signifie reconnaître que "un état de O est C" ou "un état de O est C" en conséquence, bien qu'il y ait une différence que S travaille sur O ou non. Cela pourrait être réécrit en une représentation SVC plus simple en utilisant uniquement C et O lorsque vous essayez de l'implémenter orienté objet.

Room.tidiness = :clean # <= I make the room clean.
cat.name = "Tom" # <= I name the cat "Tom."

Résumé

Je ne sais pas parce que c'est compliqué. Le texte est devenu non coordonné.

Page référencée

L'objet est l'objet How To Name Variables And Methods In Ruby

Recommended Posts

A propos de l'attribution d'un nom aux méthodes de modèle Rails
À propos des rails 6
Modèles de rails et conventions de dénomination des tables
À propos du routage des rails
[Rails] À propos des conventions de dénomination
À propos des méthodes singulières
À propos de la méthode de HttpServlet ()
[Rails] À propos d'ActiveJob,!
[Rails] Association de modèles (Association)
À propos du contrôleur Rails
À propos des méthodes Ruby
[Rails] À propos des fichiers de migration
[Rails 6] À propos des principaux joyaux
À propos de la spécification de version des rails
À propos des méthodes d'instance Ruby
À propos de l'appel des méthodes d'instance
[rails] concevoir les valeurs par défaut
rails Paramètres forts
[Débutant] À propos de la session Rails
À propos des méthodes de validation dans JUnit
chemins de rails et méthodes d'URL
rails modèle g Débit global
[Rails] À propos de la structure des dossiers scss
À propos de la méthode Pluck et de la méthode ID
Méthode de classe variable de classe Java
[Rails] À propos du test de réponse Rspec
À propos de Ruby, modèle objet
À propos de la méthode de raclage des rails Mechanize
Règles de dénomination lors de la création de nouveaux contrôleurs et modèles avec rails
À propos des méthodes fréquemment utilisées dans la conception
À propos des méthodes Java statiques et non statiques
À propos des méthodes equals () et hashcode ()
À propos du symbole <%%> dans Rails erb
[Rails] À propos de la mise en œuvre de la fonction similaire
[Pour nos nouveaux arrivants] À propos des méthodes isXXX
[Rails] À propos de la méthode d'assistance form_with [Basic]
Considération sur les rails et l'architecture propre
Méthodes Ruby souvent utilisées dans Rails