avatarBisi Media

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

5070

Abstract

do that:</p><div id="2e8b"><pre>eventHandler<span class="hljs-selector-class">.Handle</span>(event1, <span class="hljs-built_in">ExampleMiddlewareFoo</span>(<span class="hljs-built_in">ExampleMiddlewareBar</span>(handle)))</pre></div><h1 id="a8a5">Managing Events with Handlers and Middleware</h1><p id="f869">Most articles I read explain how to use this design pattern; this one deals with implementing the internal logic. So let's start coding.</p><p id="35c4">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a> to help you follow along.</p><h2 id="0f88">Designing events</h2><p id="b622">First, we are going to enumerate the list of events that our system can handle. The way we create enumeration in Go is a bit different than in other programming languages. In Go, we are going to use a set of constants sharing the same <code>type</code>. Here I define a type <code>EventType</code>that represents a string with the event's name.</p><div id="b181"><pre>// <span class="hljs-keyword">type</span> <span class="hljs-type">used </span>to enumerate events <span class="hljs-keyword">type</span> <span class="hljs-type">EventType </span>string</pre></div><div id="4817"><pre>const ( event1 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event1"</span> event2 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event2"</span> )</pre></div><p id="e041">Next, we define the event itself. In our example, the<code>Event</code> as a type which can be selected among the list of <code>EventType</code> created above.</p><div id="2bc9"><pre><span class="hljs-keyword">type</span> <span class="hljs-type">Event</span> struct { <span class="hljs-type">Type</span> <span class="hljs-type">EventType</span> <span class="hljs-type">Data</span> interface{} }</pre></div><h2 id="df6c">Create an event sender (for test purpose)</h2><p id="60aa">To test our system, we will need to create a small function to send events every 2s. Each<code>Event</code> is transmitted via a <a href="https://tour.golang.org/concurrency/2">channel</a> and, the <code>eventSender</code> below sends a random <code>Event</code> of type <code>event1</code> or <code>event2</code> to a channel.</p><blockquote id="53f3"><p><i>Channels are a type which you can send and receive values, they are great for communication among goroutines. In other words, there are perfect for sending and receive event through your application.</i></p></blockquote><div id="ffd1"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">eventSender</span><span class="hljs-params">(c <span class="hljs-keyword">chan</span> EventType)</span></span> {</pre></div><div id="7f57"><pre> for { // Send <span class="hljs-selector-tag">a</span> random event <span class="hljs-selector-tag">to</span> the channel rand<span class="hljs-selector-class">.Seed</span>(<span class="hljs-selector-tag">time</span><span class="hljs-selector-class">.Now</span>()<span class="hljs-selector-class">.Unix</span>()) events := []EventType{ event1, event2, } n := rand.<span class="hljs-built_in">Int</span>() % <span class="hljs-built_in">len</span>(events)</pre></div><div id="6101"><pre> c <- events[n] <span class="hljs-comment">// send event to channel</span></pre></div><div id="5285"><pre> // <span class="hljs-keyword">wait</span> a <span class="hljs-built_in">bit</span> <span class="hljs-built_in">time</span>.Sleep(<span class="hljs-number">2</span> * <span class="hljs-built_in">time</span>.Second) } }</pre></div><h2 id="000c">Handler and dispatcher</h2><p id="e562">We first need a struct to hold the list of events we want to listen to and which function to call whenever that event is transmitted. This struct also contains the channel used for communicating events.</p><div id="280d"><pre><span class="hljs-comment">// Create a struct to hold config</span> <span class="hljs-comment">// And simplify dependency injections</span> <span class="hljs-keyword">type</span> EventHandler <span class="hljs-keyword">struct</span> { <span class="hljs-comment">// Event channel</span> Events <span class="hljs-keyword">chan</span> Event <span class="hljs-comment">// hold the registedred event functionss</span> EventMap <span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span> }</pre></div><p id="aa6c">Next, we need to provide an initializing constructor for our <code>EventHandler</code>.</p><div id="a4ed"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">NewEventHandler</span><span class="hljs-params">()</span></span> *EventHandler { eventMap := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span>) event

Options

s := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">chan</span> Event)</pre></div><div id="78bb"><pre> return <span class="hljs-variable">&</span>EventHandler<span class="hljs-punctuation">{</span> <span class="hljs-symbol"> Events:</span> events, <span class="hljs-symbol"> EventMap:</span> eventMap, <span class="hljs-punctuation">}</span> <span class="hljs-punctuation">}</span></pre></div><p id="98fe">Then, we can create our <code>Handle</code> function that associates the event with a callback function.</p><div id="308c"><pre><span class="hljs-comment">// register the handler function to handle an event type</span> func (h *EventHandler) <span class="hljs-built_in">Handle</span>(e EventType, f <span class="hljs-built_in">func</span>(Event)) { h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span> = <span class="hljs-built_in">append</span>(h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span>, f) }</pre></div><p id="e42a">Finally, we create the <code>EventDispatcher</code> function, the core of this mechanism. The <code>EventDispatcher</code>process any event sent to a channel, check its type, and if any function has been registering for that type, we call all registered functions.</p><div id="6597"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(h *EventHandler)</span></span> EventDispatcher() { <span class="hljs-keyword">for</span> evt := <span class="hljs-keyword">range</span> h.Events { log.Printf(<span class="hljs-string">"event recieved: %v"</span>, evt) <span class="hljs-keyword">if</span> handlers, ok := h.EventMap[evt.Type]; ok { <span class="hljs-comment">// If we registered an event</span> <span class="hljs-keyword">for</span> _, f := <span class="hljs-keyword">range</span> handlers { <span class="hljs-comment">// exacute function as goroutine</span> <span class="hljs-keyword">go</span> f(evt) } } } }</pre></div><h1 id="13e4">Using our system</h1><p id="4d4e">Everything is ready; we can start using our event handling system.</p><ol><li>Instantiate our event Handler</li><li>Register which event to listen to and what function to callback</li><li>Start the event sender</li><li>Start the event dispatcher</li></ol><div id="62ab"><pre><span class="hljs-keyword">func</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {</pre></div><div id="5b09"><pre> <span class="hljs-variable">eventHandler</span> := <span class="hljs-function"><span class="hljs-title">NewEventHandler</span>()</span></pre></div><div id="d244"><pre> eventHandler.Handle(event1, <span class="hljs-keyword">func</span><span class="hljs-params">()</span> { <span class="hljs-built_in">log</span>.Printf(<span class="hljs-string">"event Handled: %v"</span>, event1) })</pre></div><div id="5c56"><pre> <span class="hljs-variable">go</span> <span class="hljs-function"><span class="hljs-title">eventSender</span>(<span class="hljs-variable">eventHandler.Events</span>)</span></pre></div><div id="30f2"><pre> eventHandler<span class="hljs-selector-class">.EventDispatcher</span>()</pre></div><div id="9bf2"><pre>}</pre></div><p id="e590">The result should be along those lines:</p><figure id="5ee7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*_D-GCRSu3K8CgTBXewJjJQ.gif"><figcaption></figcaption></figure><p id="19d6">Since we only handle an event of type <code>event1</code>, only <code>event1</code> shows as <code>Hansled</code>. All is good!</p><p id="d48a">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a>.</p><h1 id="6f5e">Interesting Articles tackling the same topic</h1><ul><li><a href="https://drstearns.github.io/tutorials/gomiddleware/">Middleware Patterns in Go</a></li><li><a href="https://sathishvj.medium.com/web-handlers-and-middleware-in-golang-2706c2ecfb75">Web Handlers and Middleware in GoLang</a></li><li><a href="https://readmedium.com/lightweight-event-management-implemented-by-go-a654d59ac65">Lightweight event management implemented by Go</a></li><li><a href="https://readmedium.com/the-7-most-important-software-design-patterns-d60e546afb0e">The 7 Most Important Software Design Patterns</a></li></ul><p id="13e7"><i>Do you want <b>unlimited access</b> to all my content and many other writers’ content on Medium? Consider using my affiliate link to <a href="https://couedeloalexandre.medium.com/membership">become a Medium member today</a></i></p><h2 id="853a">Further reads</h2> <figure id="81d2"> <div> <div> <img class="ratio" src="http://placehold.it/16x9"> <iframe class="" src="https://couedeloalexandre.medium.com/embed/list/3f9d03f2cb8f" allowfullscreen="" frameborder="0" height="184" width="undefined"> </div> </div> </figure></iframe></div></div></figure></article></body>

The Untold Story of Parenting in Africa

What we can learn from the lost culture of child-rearing in a Dark Continent

Photo by Trevor Cole on Unsplash

It is no surprise that the majority of books on African parenting is from the western world. And right now, African parental values are being forgotten for the ‘well established’ western practices.

Africans, who have not fully experienced the indigenous culture, believe that cultural awareness makes them primitive.

Well, I don’t blame them.

No one ever told them about the beauty of the indigenous parenting of their fathers. No one ever told them the story of child-rearing in time past.

I’m going to attempt to do so.

So, ladies and gentlemen, let us begin.

The African Culture

Parenting styles all over the world differ from each other due to some factors like; culture, personality, parental background, educational level, socio-economic status, family size, and religion.

Of these factors, culture influences African parenting the most.

“Culture is the way groups of people live.”

Regardless of where we live in the world, we share some “human cultural traits, “ which are universal.

Some of them include; verbal language communication, classification of people according to age and gender, classification of people according to their marital status or parenthood (like father, mother, wife), and so on.

These traits are passed from generation to generation, from a more experienced adult to a learning child.

This transmission is done mainly through exposure. For instance, children in the Gabra community (camel-herding nomads mainly found near the Chalbi Desert of northern Kenya and the highlands of southern Ethiopia) spend a lot of time with their parents and grandmothers.

Their nomadic lifestyle enables them to train their children to take care of livestock – mainly milking and feeding. Which the children learn by intently watching their parents as they carry out the activity.

In most parts of Africa, the root of parental culture stems from the family – the extended family.

The Traditional Extended Family in Africa

When we speak of the family in the African context, we are referring to the extended family. As far as child-care is concerned in this region, the responsibility of a child is not only to the biological parents of that child. But to the entire extended family.

There is a popular adage for this which says:

“A single hand cannot nurse a child.”

In this system, a brother can train his younger siblings, so that they, in turn, can train his children.

With this, a child will always have a parent even if his biological parents are dead because the extended family is there to cushion the child.

In instances when the extended family may not be together, and the nuclear family lives with other nuclear families who may not be their relatives. Then any aged person around is allowed to train the child. This type of extended family is called the “compound house” family.

Another uniqueness of this extended family system is that children (especially the girls) live with their families until they are ready for marriage.

Even if the young adult is staying with the nuclear family, the practice is that you must marry before you leave the house.

The beauty of the traditional African family is that it helps develop a strong sense of social responsibility in a child from his early years. He or she learns to be a respectful, responsible, and supportive member of the community.

Perhaps, one of the most effective ways of ingraining African morals and virtues to its children is through “folktales and storytelling.”

The African Folktales

Folktales are stories handed down among people by oral tradition from mouth to ear.

On cool evenings, stories portraying attributes such as giving, caring for one another, greed, and selfishness are told by an adult (usually the grandparents).

These aged people serve as parents, and their word of advice during the storytime, helps shape the younger ones.

For instance, in some parts of Southern Nigeria, the “Tortoise” is mostly used in folktales to depict acts of greed, wisdom, pride, and rebellion.

The stories rarely ended with the words, “and they lived happily ever after.”

Usually, they taught a lesson. And most times, the selfish person (the Tortoise) learns the lesson the hard way.

Another traditional practice – aside from folktales, that foster good parenting in youths (especially the girls), is thePuberty or Initiation rite.”

Initiation to Adulthood

The initiation rite (or puberty rite) is a significant traditional practice in Africa that marks the beginning of adulthood in youths.

Photo by Ethan McArthur on Unsplash

Today, this practice is under threat by modernization, education, and religion. And it is no longer as important as it used to be.

Puberty rite is a traditional practice that is performed mainly on adolescent girls to initiate them to womanhood.

After the successful completion of the ceremony, it is believed that the girls will make good women in the community and good wives to their husbands.

Though certain puberty rite practices may differ amongst certain African tribes, nonetheless, they follow a general pattern.

First, the families of the young girls are notified. Then the girls are prepared, followed by the initiation ritual. And finally, the girls are reintegrated into their families as adults – never to be known as girls anymore, but full-grown women.

During the initiation, the girls are taught by older women on issues such as marriage, housewifery, how to dress, pregnancy, childbirth, and parenting.

“In Igbo land, Nigeria, the young girls would gather to learn private lessons of life from older women. Their hairs would be plaited, and their bodies polished with fine red camwood. And beautiful songs and dancing would permeate the night.” – Patricia Mawusi Amos

In some parts of Ghana, before the final initiation, the girls are seen as unclean. They are taken to a riverside and washed three times every day. This will last for the period of the ceremony.

The last day of the initiation is the most remarkable. On this day, the girls are adorned in rare apparel and placed in an open place to signify to the public that they have now “entered womanhood.” And also to showcase themselves to the men who would want them as wives.

At the end of it all, the girls are taken home to their parents. Now they have the right to marry any man who comes to seek their hand in marriage.

Final thoughts

Over the years, traditional African parenting has gone through the influence of modernization – which is not a bad thing, but some of its rich parental values are lost, never to be seen again.

The extended family system, for instance, is under pressure and is rapidly failing to fulfill its primary role of socialization.

Africa has a rich culture, and some of its traditional parental values are still in use in our society today. In my opinion, we shouldn’t completely neglect it, because it is that which makes us who we are.

Sheikh Zayed Al Nahyan says it better:

“He who does not know his past cannot make the best of his present and future, for it is from the past that we learn.”

Parenting
Culture
World
Society
History
Recommended from ReadMedium