[RUBY] À propos des variables d'instance et attr_ *

Aperçu

Même si c'est une fonction pratique, il peut y avoir des inconvénients.

Par conséquent, l'utilisateur doit être en mesure de juger de l'équilibre entre les avantages et les inconvénients et de le mettre en œuvre de manière appropriée. J'ai pensé, je l'ai résumé dans un article.

Dans certains cas, la difficulté de la maintenance l'emporte en fait sur la difficulté, et est-ce encore nécessaire? J'espère qu'il vous sera utile d'envisager

Que se passe-t-il si vous utilisez d'abord attr_ *?

ʻAttr_reader: name` définit la méthode getter avec le nom de l'argument

def name
  @name
end

ʻAttr_writer: name` définit la méthode setter avec le nom de l'argument

def name=(val)
  @name = val
end

ʻAttr_accessor: name` est une méthode composite de lecture et d'écriture

Normalement, les variables d'instance accessibles par @ hoge à l'intérieur de l'instance sont publiques et la méthode est définie, de sorte que la valeur de la variable d'instance peut être touchée de l'extérieur.

À ce stade, il est également possible de définir une méthode de manière privée en utilisant private.

private
attr_reader :hoge

À propos des avantages et des inconvénients

mérite

Appel de l'extérieur

Il peut être utilisé de l'extérieur car il est coupé comme la méthode «publique», ce qui est le but initial.

Comme vous le savez tous ici.

Facilité de réparation

class Hoge
  private
  attr_accessor :hoge

  def initialize(hoge:)
    @hoge = hoge
  end

  def connect
    Service.call(hoge: hoge) # <-Ici
  end
end

Quand il est mis en œuvre comme ça

def hoge
  @hoge + 1
end

Si vous devez le réparer de cette manière, vous pouvez le remplacer pour le rendre plus facile à réparer.

Démérite

Connaissance de la portée

Vous devez penser correctement à «public» ou «privé», etc.

Définition de la méthode

La définition par inadvertance d'une méthode peut entraîner des noms de méthodes contradictoires

lisibilité

Exemple

class Hoge
  include Hoge::XXXable
  include Hoge::ZZZable

  private
  attr_accessor :hoge

  def initialize(hoge:)
    @hoge = hoge
  end

  def connect
    Service.call(param: param)
  end
end

module Hoge::XXXable
  include ::YYYable
  def param
    {
      hoge: hoge # <-Ici
    }
  end
end

Pour le module prérequis (module de découpe) inclus dans la classe cible de cette manière Il fait simplement référence à une variable d'instance mais peut être un appel de méthode

C'est

module Hoge::XXXable
  include ::YYYable
  def param
    {
      hoge: @hoge # <-Ici
    }
  end
end

Si c'est le cas, vous pouvez facilement comprendre que "la variable d'instance de la classe à inclure et à charger est définie" simplement en regardant la source dans le module.

Cependant, comme il s'agit de la méthode getter d'attr, si vous regardez simplement le module XXXable, où est défini le hoge? Je ne comprends pas. Alors quelque part en dessous? Le travail de recherche se produira.

Conclusion

** Facile à entretenir ** mentionné dans le mérite est applicable dans le sens où il est facile à écraser. Si le besoin est imprévisible à ce stade, n'est-il pas ** difficile à maintenir **?

N'est-ce pas un cas où ces inconvénients deviennent plus grands lors de son utilisation? Je vais réfléchir à l'opportunité de l'utiliser en réfléchissant à nouveau J'aimerais écrire un meilleur programme

Recommended Posts

À propos des variables d'instance et attr_ *
Différence entre les variables et les variables d'instance
Organiser les classes, les instances et les variables d'instance
[Java] Différences entre les variables d'instance et les variables de classe
À propos de la clôture de l'instance 2
À propos de Bean et DI
À propos des classes et des instances
À propos de gets et gets.chomp
À propos de l'appel des méthodes d'instance
À propos de la redirection et du transfert
À propos de l'encapsulation et de l'héritage
À propos de Serializable et serialVersionUID
[Java] Types de variables et types
[Java Silver] Que sont les variables de classe, les variables d'instance et les variables locales?
À propos de l'instruction et de l'instruction if
À propos des instances Java
À propos du verrouillage synchronisé et réentrant
Programmation Java (variables et données)
À propos des hachages et symboles Ruby
[Java] À propos de String et StringBuilder
À peu près la même et la même valeur
Différence entre classe et instance
À propos des classes et des instances (évolution)
À propos de la méthode Pluck et de la méthode ID
Prise en compte des classes et des instances
Méthode de classe variable de classe Java
À propos du package Java et de l'importation
À propos de Ruby, modèle objet
[Programmation complète] §4 Variables et constantes
À propos de la plage et de la portée dans lesquelles les variables Day16 peuvent être utilisées
Différence entre la méthode d'instance et la méthode de classe
À propos des méthodes Java statiques et non statiques
À propos de Biocontainers fastqc et Java
Série Java Primer (variations et types)
À propos des méthodes equals () et hashcode ()
[Java débutant] À propos de l'abstraction et de l'interface
À propos des guillemets simples et doubles Ruby
[Ruby] Classes, variables d'instance, instances, etc ...
À propos de la phase de paramétrage et de la phase d'exécution de Gradle
Différence entre la variable d'instance et la variable de classe
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
À propos de removeAll et de retentionAll de ArrayList
Traitement des relevés et des succursales
À propos de l'héritage orienté objet et du rendement Ruby
A propos des types primitifs et des types de référence Java
Considération sur les rails et l'architecture propre
Ceci et cela à propos de Base64 (Java)
À propos de Docker, faux serveur et conteneur