Réflexion sur la logique Ruby

Incarnez ce que vous voulez faire avec le code

C'est facile à dire en un mot, mais difficile à chanter. Je peux utiliser plus d'expressions, mais je suis plutôt lié par les restrictions de ce que j'ai appris, et cela ne peut être utilisé que comme ça, tellement de gens se demandent comment faire ce qu'ils veulent faire dans le code ... Je suis encore immature. , J'ai beaucoup d'expériences comme celle-ci. Cette fois, je vais résumer ce que j'ai appris des problèmes dans mon code pour chaque cas et organiser mes pensées.

Premièrement, l'expression est redondante

arr_year.rb


     date = []

     registerd_list.each do |data|
       date.push data.createdAt
     end

     cnt = 0
     date.each do |data|
       if date.year == data.year
         cnt += 1
       end
     end
     cnt

Il s'agit d'un substitut qui boucle les données d'un objet qui hérite d'une certaine classe Enumerable, plonge la date de création dans les données dans un tableau et ne compte que ceux dont l'année correspond au présent. .. C'est bien, mais

arr_year_kai.rb


registerd_list.select {|data| data.created_at.year == date.year}.size

Il peut être exprimé en une seule ligne. Nous utilisons ici les méthodes de sélection et de taille. ruby a pas mal de méthodes qui peuvent être utilisées pour chaque classe. Il existe de nombreuses méthodes de manipulation de tableaux.

class Array Ruby Reference

sélectionner la méthode

Renvoie un tableau contenant tous les éléments pour lesquels la valeur qui a évalué le bloc était vraie pour chaque élément. Renvoie un tableau vide si aucun des éléments n'est vrai.

C'est pratique. C'est une méthode qui a la capacité de chacun et si de faire une boucle et d'y mettre des conditions.

méthode de taille

Renvoie la longueur du tableau. Renvoie 0 si le tableau est vide.

C'est la même expression que length ou count.

Vous pouvez chaîner des méthodes avec {} .size. Il semble que vous puissiez également faire end.size. Avec cela, le traitement de plusieurs lignes de code peut être écrasé en une seule ligne. Non, j'ai peur.

Deuxièmement, il existe de nombreuses notations littérales

Quel est le nombre utilisé dans un seul coup, également appelé nombre magique? Lors de la relecture du code qui devient, ou lorsque quelqu'un le lit, il est nécessaire de l'éliminer au maximum en disant qu'il est difficile de comprendre ce que représente ce nombre, ou d'imaginer quelque chose comme donner du sens. Il y a.

Exemple d'élimination du nombre magique

magick_num.rb


 def self.get_year

     year = Time.new.year + 1
     years = []
     while year > 2017 do
       year = year - 1
       years.push year
     end
     years
   end

Il s'agit d'un processus fait pour créer un formulaire de sélection de 2017 à cette année, mais je pense que ce sera +1 ou -1 ou quelque chose du genre, mais en fait, si vous ne le faites pas, il sortira de 2017 à cette année C'est vrai. Puisqu'il s'agit d'un objet Time de cette année.

improved_year.rb


 def self.get_years
     (2017..Time.new.year).to_a.reverse
   end

Oui, cela a été fait en une seule ligne. J'utilise to_a et reverse qui utilisent l'objet range et y créent la chaîne de méthodes.

méthode to_a

Renvoie soi-même. Cependant, lorsqu'il est appelé pour une instance d'une sous-classe de Array, il retourne une conversion de lui-même en Array.

méthode inverse

reverse crée et renvoie un nouveau tableau de ses éléments dans l'ordre inverse. inverse! Trie lui-même de manière destructive. inverse! retourne soi-même.

En disant qu'en réorganisant et en inversant les éléments, il a été possible de l'arranger proprement à partir de la dernière année, et le nombre magique a également disparu.

Comparez les jours avec les nombres

w.rb


      if full_week_of_one_month.wday ==  0
        calculation_result_of_amounts.push cnt
        cnt = 0
      else
        calculation_result_of_amounts.push " "
      end

Ce qui précède fait partie du code lors de la création d'un tableau de résultats de calcul, mais je voulais pousser uniquement un jour spécifique, donc j'utilise le jour dans l'expression conditionnelle. En rubis, 1 est lundi et 0 est dimanche, donc je voulais juger dimanche, donc j'ai utilisé 0, mais il semble que ce soit 6.

w_kai.rb


      WEEK_SUNDAY = 0

      if full_week_of_one_month.wday ==  WEEK_SUNDAY
        calculation_result_of_amounts.push cnt
        cnt = 0
      else
        calculation_result_of_amounts.push " "
      end

Dans un tel cas, donnez du sens aux nombres et résolvez-les. Si elle est rendue constante, elle peut être réutilisée ailleurs. Cela permet de comprendre plus facilement ce qu'ils signifient lors de la comparaison.

Troisièmement, comprendre l'initialisation

Importance de l'initialisation et de l'affectation. C'est assez naturel pour respirer, mais c'est facile à oublier. Le code ci-dessous boucle indéfiniment. C'est parce que, bien sûr, nous n'avons pas réintégré l'année, donc elle continuera à être plus longue que 2017.

infiniting_roop.rb


def self.get_year
     year = Time.new.year + 1

     while year > 2017 do
       year - 1
       p year
     end
   end

Si vous le corrigez, cela ressemblera à ce qui suit. Si vous le remettez dans la variable, l'année -1 sera utilisée comme année dans l'expression conditionnelle lors de la prochaine boucle, vous n'aurez donc qu'à soustraire jusqu'à ce que la condition soit atteinte en utilisant le nombre d'années correctement soustrait.

modified_roop.rb


def self.get_year
     year = Time.new.year + 1

     while year > 2017 do
       year = year - 1
       p year
     end
   end

Utilisation de l'initialisation

Il s'agit d'une partie du code en cours de traitement pour passer au décompte de la semaine suivante après avoir agrégé les données pendant une semaine. C'est un processus qui boucle le contour pour une date d'un mois, crée une boucle qui agrège la date d'une semaine, pousse les données dans le tableau lorsqu'une semaine est atteinte et initialise le décompte à ce stade. .. C'est une traduction qui le met dans la boucle en tant qu'expression conditionnelle et renvoie la valeur numérique cnt à 0.

calk_date.rb


    cnt = 0
    amounts_of_calculation_result = []
    (beginning_week..last_week_of_next_month).each do |date|
      users_dates.each do |user_date|
        if date.year == user_date.year && date.day == user_date.day
            cnt += 1
        end
      end

      if date.wday ==  WEEK_SUNDAY
        amounts_of_calculation_result.push cnt
        cnt = 0
      end
    end
    amounts_of_calculation_result

Non, c ’est difficile, c’ est compliqué.

Ainsi, lorsque vous pensez à la logique, il existe de nombreuses méthodes, évitant ou donnant un sens aux expressions littérales, et utilisant l'initialisation pour exprimer ce que vous voulez faire. Il s'agit de combiner les expressions dont vous disposez pour créer une logique. Je voudrais sortir chaque fois que je n'oublie pas les expressions que je peux utiliser.

Recommended Posts

Réflexion sur la logique Ruby
À propos des symboles Ruby
À propos des tableaux Ruby
À propos de l'héritage Ruby
À propos de Ruby Hash
À propos des symboles Ruby
À propos des méthodes Ruby
À propos du module Ruby's Kernel
À propos des messages d'erreur Ruby
À propos de Ruby Hash (suite)
Explication sur l'objet Ruby Range
À propos des hachages et symboles Ruby
Ruby à propos de divers processus itératifs
À propos de Ruby, modèle objet
Explication sur l'objet Ruby String
À propos du comportement de ruby Hash # ==
À propos des guillemets simples et doubles Ruby
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
[Super Introduction] À propos des symboles dans Ruby
À propos =
À propos de l'héritage orienté objet et du rendement Ruby
Explique les objets Ruby Array
Avez-vous arrêté de penser à utiliser BeanUtils.copyProperties?
[Ruby on Rails] À propos du rappel Active Record