Skip to main content

Object-Oriented Trinity - Part 2

If you have read my limited Bio information, you may have noticed that I am a Software Engineer and also an ordained Anglican priest.

In seminary, one assignment was to write a letter to a fictional friend, explaining the Trinity in some creative imagery. The doctrine of the Holy Trinity is and to some extent has always been one of the more numinous and abstruse in Christianity.

My paper sought to use Object-Oriented concepts to shed light on this great mystery of faith. This is second in a series of posts that somewhat adapts that paper to this different forum, and to my understanding as it stands now of both the Trinity and Object-Oriented programming and design. The first part is found here.

Hi Christian! The last time I wrote, I used the Object-Oriented design pattern of the Singleton to look at the Trinity and its claim that God is One. But as you rightly point out in your reply, that barely scratched the surface of the doctrine of the Trinity. Let's go deeper.

When we say God is Trinity, we are saying not only that God is One but also that this one, particular God is also Three. This single, identifiable divine Being consists of three distinct entities, what Christians have traditionally called “Persons.” Our historic labels for these three are God the Father, God the Son and God the Holy Spirit. If the label “Person” causes grief, think of them as distinct beings or “independent realities.”

The first of these “Persons” is God the Father. Don't let the qualifier trip you up; it is not claiming a divine Male-ness. You could substitute God the Mother or God the Parent if you prefer, although those labels would not be well-received everywhere. God the First? God the Begetter? How's that for an old-fashioned word! But it comes closer to what the doctrine of Trinity is trying to communicate.

The name "God the Father" comes from the unique relationship with God the Son, who is the second “Person” in the Trinity. We use human parentage language - like begetting! - to say that the Son comes from the Father. We say that the Father “begets” the Son. A modern rephrasing might be that the Father “generates” the Son. From long habit, I will use God the Father in this letter, hope that's OK!

In our software world, it’s tempting to say that God the Father generating God the Son follows one of the creational design patterns.

For example, consider the Builder design pattern. In the Builder pattern, a client caller can request the construction of a complex object with minimal information - such as the class type and the content. All of the complexities of actually creating and initializing the object the Builder builds are hidden from the client.

Let's not worry about who or what would be the calling client that would trigger God the Builder to generate God the Son. It would not be us humans or any created thing. If you need a client, maybe think of it as a divine imperative triggering the Builder's actions, although I suspect theologians would call it more an act of God's free will.

No matter. Something sparks God the Father to generate God the Son, like the Builder class would create the complex Product object requested by the Client object, while protecting the client from the complexities involved. (And there certainly are complexities in the Trinity!)

But one flaw in this imagery is that, fundamentally, God the Father and God the Son are both of the same Class. A Builder does not make other Builders. The best software analogy for them both being the same class might be the Constructor method, which creates an instance of the same Class.

Not only that, this Builder pattern imagery sounds like a one-and-done action, something that happens just once, after which the thing is built. That can make us think that there was a time before the Son existed, that the Son once was not but that now he has been created.

This would make the Son a mere creature, however, and not divine. The doctrine of the Trinity insists that this begetting / begotten relationship is timeless and eternal; the Father is eternally generating the Son, to be like himself, that is, divine.

If God is a Singleton like we said last time, eternal generation might be like someone coding the God-Singleton to call its internal constructor on every external reference, rather than reusing the eternally-existing (from the caller's perspective) instance.

Whatever the label, it is to this first Person that we credit the creation of everything – you and me, plants and animals, stars and planets, and all matter and energy in the entire universe. Which of course is not like a Singleton or Factory or Builder design pattern. There may not be a good Software Development comparison for that! There is more we could say about the Trinity and Software Development, but I will stop here for now.

Peace,
Steve

Popular posts from this blog

How to do Git Rebase in Eclipse

This is an abbreviated version of a fuller post about Git Rebase in Eclipse. See the longer one here : One side-effect of merging Git branches is that it leaves a Merge commit. This can create a history view something like: The clutter of parallel lines shows the life spans of those local branches, and extra commits (nine in the above screen-shot, marked by the green arrows icon). Check out this extreme-case history:  http://agentdero.cachefly.net/unethicalblogger.com/images/branch_madness.jpeg Merge Commits show all the gory details of how the code base evolved. For some teams, that’s what they want or need, all the time. Others may find it unnecessarily long and cluttered. They prefer the history to tell the bigger story, and not dwell on tiny details like every trivial Merge-commit. Git Rebase offers us 2 benefits over Git Merge: First, Rebase allows us to clean up a set of local commits before pushing them to the shared, central repository. For this

Java 8: Rewrite For-loops using Stream API

Java 8 Tip: Anytime you write a Java For-loop, ask yourself if you can rewrite it with the Streams API. Now that I have moved to Java 8 in my work and home development, whenever I want to use a For-loop, I write it and then see if I can rewrite it using the Stream API. For example: I have an object called myThing, some Collection-like data structure which contains an arbitrary number of Fields. Something has happened, and I want to set all of the fields to some common state, in my case "Hidden"

Git Reset in Eclipse

Using Git and the Eclipse IDE, you have a series of commits in your branch history, but need to back up to an earlier version. The Git Reset feature is a powerful tool with just a whiff of danger, and is accessible with just a couple clicks in Eclipse. In Eclipse, switch to the History view. In my example it shows a series of 3 changes, 3 separate committed versions of the Person file. After commit 6d5ef3e, the HEAD (shown), Index, and Working Directory all have the same version, Person 3.0.

Code Coverage in C#.NET Unit Tests - Setting up OpenCover

The purpose of this post is to be a brain-dump for how we set up and used OpenCover and ReportGenerator command-line tools for code coverage analysis and reporting in our projects. The documentation made some assumptions that took some digging to fully understand, so to save my (and maybe others') time and effort in the future, here are my notes. Our project, which I will call CEP for short, includes a handful of sub-projects within the same solution. They are a mix of Web APIs, ASP MVC applications and Class libraries. For Unit Tests, we chose to write them using the MSTest framework, along with the Moq mocking framework. As the various sub-projects evolved, we needed to know more about the coverage of our automated tests. What classes, methods and instructions had tests exercising them, and what ones did not? Code Coverage tools are conveniently built-in for Visual Studio 2017 Enterprise Edition, but not for our Professional Edition installations. Much less for any Commun

Scala Collections: A Group of groupBy() Examples

Scala provides a rich Collections API. Let's look at the useful groupBy() function. What does groupBy() do? It takes a collection, assesses each item in that collection against a discriminator function, and returns a Map data structure. Each key in the returned map is a distinct result of the discriminator function, and the key's corresponding value is another collection which contains all elements of the original one that evaluate the same way against the discriminator function. So, for example, here is a collection of Strings: val sports = Seq ("baseball", "ice hockey", "football", "basketball", "110m hurdles", "field hockey") Running it through the Scala interpreter produces this output showing our value's definition: sports: Seq[String] = List(baseball, ice hockey, football, basketball, 110m hurdles, field hockey) We can group those sports names by, say, their first letter. To do so, we need a disc