[RUBY] Mehr verwendbar Aufzählbar für Anfänger

Einführung

In diesem Artikel schreibe ich über viele Dinge im Zusammenhang mit Enumerable, auf die ich oft hinweise, dass ich tatsächlich Überprüfungen von Anfragen im Geschäftsleben durchführe. Nicht alle Methoden sind abgedeckt, also keine Angst. Klicken Sie hier für die englische Version

Was ist aufzählbar?

Mix-In zum Wiederholen von Klassen. Alle Methoden in diesem Modul werden mit jeder definiert, daher muss jede in der enthaltenen Klasse definiert werden.

https://docs.ruby-lang.org/ja/latest/class/Enumerable.html ... anscheinend ... Mit anderen Worten, Klassen, die normalerweise jeweils verwendet werden (z. B. Array, Hash, String), enthalten dieses Enumerable-Modul.

Wenn Sie jedes finden, verwenden Sie es

Wenn Sie jeden Prozess finden, können Sie dasselbe tun, ohne jeden zu verwenden. Lassen Sie uns anhalten und nach einer Möglichkeit suchen, ohne jede zu verwenden. Je nachdem, was Sie tun möchten, kann es auch sauberer sein, eine andere Enumerable-Methode zu verwenden.

Übe Aufzählung

Schauen wir uns neben den schwierigen Dingen auch die Dinge an, auf die ich oft hinweise. Versuchen Sie für geschäftliche Dinge, Variablen eine Bedeutung zu geben.

Case 1: select

Before

arr = [1, 2, 3, 4, 5]
new_arr = []
arr.each do |v|
  new_arr << v if v.odd?
end

p new_arr # => [1, 3, 5]

After

new_arr = arr.select(&:odd?)

p new_arr # => [1, 3, 5]

Case 2: map

Before

arr = [1, 2, 3, 4, 5]
new_arr = []
arr.each do |v|
  new_arr << v * 2
end

p new_arr # => [2, 4, 6, 8, 10]

After

new_arr = arr.map { |v| v * 2 }

p new_arr # => [2, 4, 6, 8, 10]

Case 3: inject

Before

arr = [1, 2, 3, 4, 5]
sum = 0
arr.each do |v|
  sum += v
end

p sum # => 15

After

arr = [1, 2, 3, 4, 5]
sum = arr.inject(:+)

p sum # => 15

Case 4: any?

Annahme

Der Reservierungsstatus ist wie folgt definiert. Ich möchte überprüfen, ob die Statusänderung korrekt ist

booking_statuses = {
  pending: 0,
  payment_requested: 1,
  paid: 2,
  cancelled: 3
}

Before


def validate_booking_transition(passed_status)
  if passed_status == booking_statuses[:cancelled]
    allowed = [
      booking_statuses[:pending],
      booking_statuses[:payment_requested],
      booking_statuses[:paid]
    ].include?(passed_status)
  elsif ...
  .
  .
  .
end

After

def validate_booking_transition(passed_status)
  if passed_status == booking_statuses[:cancelled]
    allowed = %i(pending payment_requested paid).any? do |v|
      passed_status == booking_statuses[v]
    end
  elsif ...
  .
  .
  .
end

Case 5: group_by

Before

arr = [{code: 'a', val: 1}, {code: 'a', val: 2}, {code: 'b', val: 3}, {code: 'b', val: 4}]
new_hash = {}
arr.each do |hash|
  k = hash[:code]
  new_hash[k] = [] if new_hash[k].nil?

  new_hash[k] << hash[:val]
end

p new_hash #=> {"a"=>[1, 2], "b"=>[3, 4]}

After

new_hash = arr.group_by { |h| h[:code] }.transform_values { |grouped_arr| grouped_arr.map { |h| h[:val] } }

p new_hash #=> {"a"=>[1, 2], "b"=>[3, 4]}

Erwägung

Betrachten wir jeden ein wenig. Für die Fälle 1 bis 3 ist es ein Muster, dass die Verarbeitung und die bequemen Methoden, die häufig in jedem Fall durchgeführt werden, verwendet werden. Es ist fast eine Einführung in Enumerable. In Fall 4 geht es um die Verwendung von Enumerable, und es gibt ein Muster, das redundante Dinge durch die Verwendung verschiedener Enumerable-Methoden präziser macht, je nachdem, was Sie tun möchten. (Ein kleines Geschäftslogikelement wird hinzugefügt, um das Bild zu vereinfachen.) Was ist mit Fall 5? In dieser Hinsicht einfach eine Zeile ausgeben und sich erfrischt fühlen! Ich habe Lust dazu, aber ich denke, es ist schwer zu verstehen. Wenn Sie genauer hinschauen, setzen Sie es in den Fällen 1 bis 4 in den iterativen Prozess ein.

Während Sie so etwas tun, in Fall 5

Wenn Sie genauer hinschauen, führen Sie mehr Karten im Block transform_values aus. Auf den ersten Blick scheint das Schreiben einfach zu sein, und Sie haben eine Doppelschleife erstellt. Wenn Sie mehrere Dinge in einer Iteration wie dieser ausführen müssen, ist die Verwendung jeder einzelnen möglicherweise einfacher zu verstehen und hat möglicherweise einen Vorteil in Bezug auf die Verarbeitungsgeschwindigkeit.

Was sind die Vorteile einer korrekten Verwendung der Enumerable-Methode?

Ich denke, dass der wichtigste Index für das Schreiben von Code auf vielen Entwicklungsseiten die Lesbarkeit und die einfache Wartung ist. Obwohl jede Methode nützlich ist, macht sie an sich keinen Sinn (es ist im Grunde nur eine Schleife), so dass es manchmal möglich ist, dass der Leser nicht weiß, was der Code-Schreiber beabsichtigt hat. Die ordnungsgemäße Verwendung der Enumerable-Methode verdeutlicht die Absicht des Verfassers und erleichtert zukünftige Codeänderungen. Unter einem anderen Gesichtspunkt als der Lesbarkeit denke ich, dass Sie sich der Auswirkungen und Nebenwirkungen klarer bewusst sein können. Es scheint jedoch lang zu sein, daher werde ich es hier weglassen. Wie in Fall 5 gezeigt, kann es jedoch sein, dass es besser ist, jedes Muster zu verwenden (insbesondere, wenn Sie die Enumerable-Methode in der Enumerable-Methode verwenden). Seien Sie also vorsichtig. Machen wir das.

Am Ende

Was denken Sie. Dieses Mal habe ich die Enumerable-Methode kurz anhand eines Beispiels erklärt. Gewöhnen wir uns daran und schreiben Code bequemer;)

Recommended Posts

Mehr verwendbar Aufzählbar für Anfänger
Java-Debug-Ausführung [für Java-Anfänger]
[Java] Grundlegende Aussage für Anfänger
[Für Super-Anfänger] DBUnit Super-Einführung
(Für Anfänger) [Rails] Installieren Sie das Gerät
[Für Super-Anfänger] Ameise Super-Einführung
Java für Anfänger, Daten verstecken
[Für Super-Anfänger] Maven Super-Einführung
Java-Anwendung für Anfänger: Stream
Halbierungsbaum-Memorandum für Anfänger (1)
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Anfänger spielen Janken-Spiele in Java
Umgebungsbau mit Docker für Anfänger
Java für Anfänger, Ausdrücke und Operatoren 1
[Für Anfänger] Führen Sie Selenium auf Java aus
Links zum Erstellen von Android-Apps (für Anfänger)
Java für Anfänger, Ausdrücke und Operatoren 2
[Folio LSP] Grob Docker (für Anfänger)
[Für Super-Anfänger] Struts2 Super Primer - Ausgabe 2018
Objektorientierter Kurs für Anfänger von Anfängern
Heroku über Heroku CLI starten (für Anfänger)
Empfohlene Lernmethode zum Programmieren von Anfängern
[Für Java-Anfänger] Informationen zur Ausnahmebehandlung
Klassen und Instanzen Java für Anfänger