[RUBY] Ist es für den Benutzer einfach, Allzweckfunktionen zu implementieren? Seien wir uns dessen bewusst

Ich denke, wenn Sie ein Programm schreiben, können Sie Allzweckfunktionen in Klassen und Methoden ausschneiden und implementieren.

Betrachten Sie beispielsweise den Prozess, bei dem mehrere angegebene Benutzer an einem bestimmten Ereignis teilnehmen.

Überprüfen Sie zunächst die Implementierung, wenn sich die gesamte Verarbeitung in einer Methode befindet. (Ich habe es in Ruby geschrieben, aber wenn Sie andere Programmiersprachen beherrschen, können Sie ein Gefühl dafür bekommen.)

def main(user_ids, event_id)
  users = User.where(id: user_ids)
  event = Event.find(event_id)

  #Schließt teilnehmende Benutzer aus
  target_users = users.reject {|user| user.events.ids.include?(event.id) }

  #Teilnahme an der Veranstaltung
  target_users.each do |user|
    #Teilnahme an der Veranstaltung=>Datensatz zu EventUser hinzufügen
    EventUser.create!(user: user, event: event)
  end
end

Lassen Sie uns den Prozess der Teilnahme an Veranstaltungen als Methode aus den oben genannten herausschneiden. Dieses Mal habe ich dem Ereignismodell eine Methode hinzugefügt.

def main(user_ids, event_id)
  users = User.where(id: user_ids)
  event = Event.find(event_id)

  #Schließt teilnehmende Benutzer aus
  target_users = users.reject {|user| user.events.ids.include?(event.id) }

  #Teilnahme an der Veranstaltung
  event.join(target_users)
end

app/models/event.rb


def join(users)
  users.each do |user|
    #Teilnahme an der Veranstaltung=>Datensatz zu EventUser hinzufügen
    EventUser.create!(user: user, event: event)
  end
end

Wenn Sie den Vorgang des Beitritts zu einem Ereignis von einem anderen Ort aus ausführen möchten, können Sie es mit "event.join (users)" aufrufen.

Diese Implementierungsmethode weist jedoch einige Feinheiten auf. Der Punkt ist, dass der Anrufer nur die Benutzer übergeben darf, die teilnehmen können, mit Ausnahme der Benutzer, die bereits beigetreten sind.

In diesem Beispiel ist es für den Anrufer einfacher, Folgendes zu tun.

def main(user_ids, event_id)
  users = User.where(id: user_ids)
  event = Event.find(event_id)

  #Teilnahme an der Veranstaltung
  #Der Anrufer muss sich keine Sorgen machen, wenn Benutzer bereits beigetreten sind. OK, wenn Sie den Benutzer übergeben, der das Ziel sein kann
  event.join(users)
end

app/models/event.rb


def join(users)
  #Schließt teilnehmende Benutzer aus
  target_users = users.reject {|user| user.events.ids.include?(event.id) }

  target_users.each do |user|
    #Teilnahme an der Veranstaltung=>Datensatz zu EventUser hinzufügen
    EventUser.create!(user: user, event: event)
  end
end

Bei einer solchen Implementierung kann der Anrufer den Zielbenutzer weitergeben, ohne sich Gedanken darüber machen zu müssen, ob er bereits beigetreten ist.

Wenn Sie in dieser Reihenfolge erklären, mag es natürlich erscheinen, die dritte zu implementieren, aber in Wirklichkeit sehen Sie oft die im zweiten Zustand implementierte.

Dies liegt daran, dass es kein Unbehagen gibt, selbst wenn die Methode allein als "eine Methode bezeichnet wird, mit der Benutzer an Ereignissen teilnehmen können". Der zweite verallgemeinerte Teil ist unten abgedruckt. Wie wäre es allein mit dieser Methode?

app/models/event.rb


def join(users)
  users.each do |user|
    #Teilnahme an der Veranstaltung=>Datensatz zu EventUser hinzufügen
    EventUser.create!(user: user, event: event)
  end
end

Wenn Sie zum ersten Mal eine generische Methode erstellen, haben Sie möglicherweise nur wenige (oder nur einen) Aufrufer. In diesem Fall dauert es nicht lange, bis der Anrufer oder der Angerufene überprüft werden. Daher ist es schwierig, den Aufwand zu spüren, alles beim Anrufer überprüfen zu müssen.

Und sobald es so implementiert ist, wird der vorhandene Teil kopiert, wenn der Prozess der Teilnahme an der Veranstaltung auf die gleiche Weise implementiert wird. In diesem Fall funktioniert die Dynamik von "Weil die vorhandene so ist", und anstatt sich zu ärgern, wird sie als selbstverständlich angesehen.

Zusammenfassung

Ist es für den Benutzer einfach, allgemeine Funktionen zu implementieren? Seien wir uns dessen bewusst. Wenn der Benutzer verschiedene Einschränkungen berücksichtigen muss oder Prozesse ausgeführt werden müssen (Prozesse ohne Teilnehmer in diesem Beispiel), können diese Prozesse in Allzweckfunktionen integriert werden. Lassen Sie uns überlegen, ob es da ist.

Dies erleichtert nicht nur dem Benutzer, sondern verhindert auch Fehler wie Auslassungen.

Wenn Sie es für allgemeine Zwecke erstellen möchten, wird es auch verwendet. Wenn es schwierig zu verwenden ist, besteht eine hohe Wahrscheinlichkeit, dass nur die Person, die es implementiert hat, es verwenden kann (die Person, die es implementiert hat, kann es möglicherweise in einigen Monaten nicht verwenden). Denken wir an die Implementierung, die für Benutzer einfach zu bedienen und zu genießen ist! !!

Recommended Posts

Ist es für den Benutzer einfach, Allzweckfunktionen zu implementieren? Seien wir uns dessen bewusst
[Java] [Microsoft] Beachten Sie Folgendes, wenn Sie den SQL Server-JDBC-Treiber in eine JAR-Datei aufnehmen
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
Beim Importieren von CSV mit Rails war es wirklich einfach, den Befehl nkf zu verwenden
[Java] Dinge, die Sie bei der Ausgabe von FizzBuzz beachten sollten
Es ist schwierig, die leere Zeichenfolge und das Datum von DBUnit zu verwenden. Korrigieren Sie es also und verwenden Sie es.
Session war ein Cookie, das beim Schließen des Browsers gelöscht werden sollte, und eine Methode zum Austauschen: Rails Tutorial Hinweis - Was ist eine Rails-Sitzung?
Maßnahmen gegen das Vergessen, die Schriftart anzugeben, wenn titleTextAttributes angegeben wird
Beachten Sie, dass die Standardeinstellung für die Spring-Boot-Umleitung http ist
[Für Anfänger] Ruby soll Rubin sein, aber was ist damit?
Ein Beispiel für kleine Arbeiten, bei denen Sie den Definitionswert nach der Umgebung aufteilen möchten, sich dessen jedoch nicht bewusst sein möchten
Die Funktion ist sehr einfach zu bedienen
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Um auf einfach zu lesenden Code zu achten
Fälle, in denen Benutzer beim Bearbeiten einer App abgemeldet sind (Rails)
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
Im Thema "Gesamtkonzentration" wird "Verwendung von Docker" für den virtuellen Mameko zusammengefasst, der in mir schläft.
Da der Befehl du, der bei voller Kapazität verwendet wird, schwierig zu verwenden ist, habe ich versucht, ihn mit Rubin zu umwickeln
[Java] Wenn Sie das URL-Format mit Bean Validation überprüfen, ist es möglicherweise besser, @URL von Hibernate Validator nicht zu verwenden.
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Ist es Mainstream, das schließende Tag des <P> -Tags nicht in Javadoc zu schreiben?
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
[Swift] Wenn die Anwendung iOS 11 oder höher unterstützt, war es nicht erforderlich, Int und Int64 ordnungsgemäß zu verwenden