Abstraktion the “DRY” way.
Fragt man Bard oder ChatGPT nach der Bedeutung von Monad, wird auf Gottfried Wilhelm Leibniz verwiesen.
- Monaden werden als unteilbare, immaterielle und metaphysische Substanzen beschrieben, die die fundamentalen Bausteine der Realität darstellen.
- Jede Monoide hat eine einzigartige Wahrnehmung und spiegelt das gesamte Universum aus ihrer eigenen Perspektive wider.
Monoide werden in der Gruppentheorie verwendet. Ihre zentrale Eigenschaft: Sie geben Ergebnisse
zurück, die der gleichen Menge angehören. Sie sind algebraische Strukturen, die wesentliche Eigenschaften von Funktionen kapseln. Konkret werden
if - then - else -end
Strukturen abstrahiert. Damit wird der
Programmcode im Hauptprogramm übersichtlicher.
Ein Minimalbeipiel:
class Auth
extend Dry::Monads[:result]
def self.authenticate name
name == 'correct' ? Success( name: name ) : Failure( error: "No such User" )
end
end
Die Methode Auth.authenticate hat als Input-Größe einen String. Sie gibt entweder ein
DRY::Monads::Result::Success oder ein DRY::Monads::Result::Failure-Objekt zurück.
Ruft man die Monad-Klassenmethode auf, dann erhält man das evaluierte Objekt. Dies kann überall dechiffriert werden. Es besteht eine grundsätzliche Verwandschaft mit Schrödingers-Katze.
a = Auth('Helga')
a.value! unless a.failure?
# Ausgabe eines Default-Wertes für failure
a.value_or "not authenticated"
==> { name: 'Helga' }
Einen Schritt weiter geht die do notaton.
Class Runner
include Dry::Monads::Do.for(:call)
def call
value = A.authenticate( 'correct')
yield value
end
end
Ein Aufruf von Runner.new.call gibt entweder die dechiffrierte Success-Antwort zurück
oder das DryMonadResult::Failure-Objekt.
Zur Weiterverarbeitung der dechiffrierten Messages bietet das Gem die Methoden bind und fmap.
Erstere übergibt die Message an einen Block, letztere stellt einen Block zur Modifizierung bereit.
Class Runner
include Dry::Monads::Do.for(:call)
def call
A.authenticate( 'correct').bind do |value|
# Anweisungen, die ein Success voraussetzen
end
end
end
(to be continued)