Über Logik nachdenken Ruby

Verkörpern Sie, was Sie mit Code tun möchten

Es ist leicht in einem Wort zu sagen, aber es ist schwer zu singen. Ich kann mehr Ausdrücke verwenden, aber ich bin an die Einschränkungen des Gelernten gebunden, und dies kann nur so verwendet werden, dass sich viele Leute fragen, wie sie das tun sollen, was sie im Code tun wollen ... Ich bin noch unreif. Ich habe viele solche Erfahrungen. Dieses Mal werde ich für jeden Fall zusammenfassen, was ich aus den Problemen in meinem Code gelernt habe, und meine Gedanken organisieren.

Erstens ist der Ausdruck redundant

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

Dies ist ein Ersatz, der die Daten eines Objekts schleift, das eine bestimmte Enumerable-Klasse erbt, das Erstellungsdatum in die Daten in ein Array eintaucht und nur diejenigen zählt, deren Jahr der Gegenwart entspricht. .. Das ist in Ordnung, aber

arr_year_kai.rb


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

Es kann in nur einer Zeile ausgedrückt werden. Wir verwenden hier die Auswahl- und Größenmethoden. Ruby hat eine Menge Methoden, die für jede Klasse verwendet werden können. Es gibt einige Methoden zur Array-Manipulation.

class Array Ruby Reference

Methode auswählen

Gibt ein Array zurück, das alle Elemente enthält, für die der Wert, der den Block ausgewertet hat, für jedes Element wahr war. Gibt ein leeres Array zurück, wenn keines der Elemente wahr ist.

Es ist bequem. Es ist eine Methode, die die Fähigkeit eines jeden hat, Bedingungen zu wiederholen und einzufügen.

Größenmethode

Gibt die Länge des Arrays zurück. Gibt 0 zurück, wenn das Array leer ist.

Es ist der gleiche Ausdruck wie Länge oder Anzahl.

Sie können Methoden mit {} .size verketten. Es scheint, dass Sie auch end.size machen können. Damit kann die Verarbeitung mehrerer Codezeilen in nur einer Zeile zerquetscht werden. Nein, ich habe Angst.

Zweitens gibt es viele wörtliche Notationen

Welche Zahl wird in einem einzigen Schuss verwendet, auch als magische Zahl bezeichnet? Wenn Sie den Code zurücklesen, der wird, oder wenn jemand ihn liest, müssen Sie ihn so weit wie möglich entfernen, indem Sie sagen, dass es schwierig ist, zu verstehen, was diese Zahl darstellt, oder etwas zu erfinden, wie beispielsweise eine Bedeutung zu geben. Es gibt.

Beispiel für die Beseitigung der magischen Zahl

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

Dies ist ein Prozess, der durchgeführt wurde, um ein ausgewähltes Formular von 2017 bis zu diesem Jahr zu erstellen, aber ich denke, dass es +1 oder -1 oder so sein wird, aber wenn Sie dies nicht tun, wird es von 2017 bis zu diesem Jahr herauskommen Korrekt. Da es sich um ein Zeitobjekt aus diesem Jahr handelt.

improved_year.rb


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

Ja, es wurde in nur einer Zeile gemacht. Ich benutze to_a und reverse, die das range-Objekt verwenden und dort die Methodenkette bilden.

to_a Methode

Gibt sich selbst zurück. Wenn jedoch eine Instanz einer Unterklasse von Array aufgerufen wird, wird eine Konvertierung von sich selbst in Array zurückgegeben.

umgekehrte Methode

reverse erstellt ein neues Array seiner Elemente und gibt es in umgekehrter Reihenfolge zurück. umgekehrt! Sortiert sich destruktiv. umgekehrt! gibt sich selbst zurück.

Indem man sagt, dass es durch Neuanordnen und Umkehren der Elemente möglich war, sie ab dem letzten Jahr ordentlich anzuordnen, und die magische Zahl ist ebenfalls verschwunden.

Tage mit Zahlen vergleichen

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

Das Obige ist ein Teil des Codes beim Erstellen eines Arrays von Berechnungsergebnissen, aber ich wollte nur an einem bestimmten Tag pushen, daher verwende ich den Tag im bedingten Ausdruck. In Ruby ist 1 Montag und 0 Sonntag, also wollte ich Sonntag beurteilen, also habe ich 0 verwendet, aber es scheint, dass dies 6 ist.

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

Geben Sie in einem solchen Fall den Zahlen eine Bedeutung und lösen Sie sie. Wenn es konstant gemacht wird, kann es an einem anderen Ort wiederverwendet werden. Dadurch wird es einfacher zu verstehen, was Sie unter dem Vergleich verstehen.

Drittens verstehen Sie die Initialisierung

Bedeutung der Initialisierung und Zuordnung. Es ist natürlich genug, um zu atmen, aber es ist leicht zu vergessen. Der folgende Code wird auf unbestimmte Zeit wiederholt. Das liegt daran, dass wir das Jahr natürlich nicht wieder aufgenommen haben und es daher weiterhin größer als 2017 sein wird.

infiniting_roop.rb


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

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

Wenn Sie das Problem beheben, sieht es folgendermaßen aus. Wenn Sie es wieder in die Variable einfügen, wird das Jahr -1 als das Jahr im bedingten Ausdruck verwendet, wenn die nächste Schleife auftritt. Sie müssen also nur subtrahieren, bis die Bedingung erreicht ist, indem Sie die Anzahl der Jahre verwenden, die ordnungsgemäß subtrahiert wurden.

modified_roop.rb


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

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

Verwendung der Initialisierung

Dies ist ein Teil des Codes, der verarbeitet wird, um zur Zählung der nächsten Woche zu gelangen, nachdem die Daten für eine Woche aggregiert wurden. Es ist ein Prozess, der die Gliederung für das Datum eines Monats durchläuft, eine Schleife erstellt, die das Datum einer Woche darin aggregiert, die Daten nach Erreichen einer Woche in das Array überträgt und die Zählung an diesem Punkt initialisiert. .. Es ist eine Übersetzung, die sie als bedingten Ausdruck in die Schleife einfügt und den numerischen cnt-Wert auf 0 zurückgibt.

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

Nein, es ist schwierig, es ist kompliziert.

Wenn Sie also über Logik nachdenken, gibt es zahlreiche Methoden, um wörtliche Ausdrücke zu vermeiden oder zu verstehen und die Initialisierung zu verwenden, um auszudrücken, was Sie tun möchten. Es geht darum, die Ausdrücke zu kombinieren, die Sie zum Erstellen von Logik benötigen. Ich möchte jedes Mal ausgeben, wenn ich die verwendbaren Ausdrücke nicht vergesse.

Recommended Posts

Über Logik nachdenken Ruby
Über Ruby-Symbole
Über Ruby-Arrays
Informationen zur Ruby-Vererbung
Über Ruby Hash
Über Ruby-Symbole
Über Ruby-Methoden
Über Rubys Kernel-Modul
Informationen zu Ruby-Fehlermeldungen
Über Ruby Hash (Fortsetzung)
Erläuterung des Ruby Range-Objekts
Über Ruby-Hashes und -Symbole
Ruby über verschiedene iterative Prozesse
Über Ruby und Objektmodell
Erläuterung zum Ruby String-Objekt
Über das Verhalten von Ruby Hash # ==
Über Ruby einfache Anführungszeichen und doppelte Anführungszeichen
Informationen zum Ruby-Produktoperator (&) und zum Summenoperator (|)
[Super Einführung] Über Symbole in Ruby
Über =
Über objektorientierte Vererbung und über Ertrag Ruby
Erklärt Ruby Array-Objekte
Haben Sie aufgehört, über die Verwendung von BeanUtils.copyProperties nachzudenken?
[Ruby on Rails] Informationen zum Active Record-Rückruf