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
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 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.
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?
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]}
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.
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.
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