March 15, 2010

Roman Stoffel

Managing 1:N and N:N Object Relations

object relationsWhen you design a domain model you normally have lots of 1:n and n:n relations. Many developers are quite familiar how to translate such relations into a relational model. But how do you translate such relations into an object-model? There’s no hard guideline for that. In this post I explain what I usually do.

The Domain Model

For the examples I use a this small domain-model. Our application has authors, which write posts. An author has multiple posts and a post has only one author. Each post can have multiple tags and a tag is used for multiple posts.

The Possibilities

The majority of object oriented language give two tools for this job, references and collections. And therefore a lot of possibilities.

  1. Referencing from the ‘child’. In our example the post would have a reference to the author.
  2. Referencing from the ‘parent’. In our example the author would have a collection of all its posts.
  3. Bidirectional reference, in our example the post has a reference to the author and the author a collection of his posts.

And in the n:n scenario all this possibilities above also apply. Just that each participant uses collections.

Navigation-Paths Dictate

Which one of the 3 possibilities do you pick? The main criteria is how you’re application navigates through the data. For example when you’re accessing the blog posts and only want to know who has written this post, you add a reference to the author. When your always getting a post via its author, you add a collection of posts to the author. And when your application uses both navigation paths, you use a bidirectional relation.

The same applies for the post-tag relationship. When you only want to know which tag a post has, you add a collection to the post with the tags. When you want to know which post have a certain tag, you add a collection of all posts to the tag.

Bidirectional References: A “chicken or the egg” dilemma

As soon as you have bidirectional references, you cannot avoid a ‘chicken or the egg’-dilemma. You have to create one instance first and then later assign it. Sometimes it’s easy solvable by adding a factory-method to the parent-class. Like this: (Link for Rss) But often there’s no clear ‘parent’ or natural order. Especially in n:n relations. For this cases I use my special extension-methods. Let’s start with a simple class which represents the author and a post (Link for Rss).

Then I ‘upgrade’ the properties and methods with extension-methods to make them relation-aware. Basically on each property/method I also state what happens to the relationship-partner. Note that you shouldn’t expose the collections directly. Instead only expose it a read-only IEnumerable and provide additional, domain-specific manipulation-methods. Here’s the code (Link for Rss). Now I can assign, add or remove the object freely, and it’s ensured that the relation is in a consistent state (Link for Rss).

Of course this also works for n:n-relations. For example we start with the relation between tags and posts (Link for Rss). Again, we ‘upgrade’ the add and remove method for the relations (Link for Rss).

And oh wonder, we can freely add and remove and the relation is kept in a consistent state (Link for Rss).

Implementation of the Extension Methods

As you can imagine, the implementation isn’t pretty. Especially to avoid endless recursion, some hacks are required. I don’t want to go into detail here (maybe another time). You can take a look at the source yourself. Here it is:  the extension, the tests, tuple class.

There a certainly cleaner ways to achieve something similar, like special relation-collections. But for my projects this solution is more than enough.

Conclusion

Managing object-relations can be very easy or can be pain. When you have reference in one direction it’s straight forward. But as soon as bidirectional references are required, it can be tricky.

Anyway, critic, tips for improvements or links to good articles on this topic are welcome.

by gamlerhart at March 15, 2010 23:37

CoCaman

Bill for Bill: Money Wasted

Send Microsoft A Bill For Optimizing Your Website For The Internet Explorer.

BillForBill is a new and fun way to display the amount of money that was wasted worldwide to optimize any website for the Internet Explorer browser by Microsoft.
All you have to do is connect your Twitter or Facebook account and enter the dollar value of your lost time.

How long will it take, until 1 million dollars is reached?

Related Posts

by CoCaman at March 15, 2010 14:33

March 12, 2010

Rico Steffen

Vorher und nacher!

Bevor Sunrise meinen Blog fand (15 - 20 Zugriffe / Tag): :-)


Nachdem Sunrise meinen Blog fand (Spitze mit 165 Zugriffen): *g*

by Silver at March 12, 2010 16:53

March 11, 2010

Roman Stoffel

Games Outside the Box, Analog Computers, Read-Write-Costs etc.

by gamlerhart at March 11, 2010 23:37

Fabio Ferrari

Gelesen: Muhammad Yunus – Banker der Armen

Vertrauen heisst auf Latein „credere“, das Ursprungswort unseres Kredits. Die Welt gibt Kredite nur an Besitzende – Muhammad Yunus mit seiner Bank für die Armen nur an Besitzlose. Die Welt vertraut in Gelddingen nur Menschen, die bereits Geld haben – der Friedensnobelpreisträger schenkt jenen Menschen volles Vertrauen, die nichts haben, und setzt damit bei ihnen eine erstaunliche Kreativität frei. Der Wirtschaftswissenschaftler aus Bangladesch machte das radikale Querdenken zugunsten der Schwächsten der Welt zum erfolgreichen Modell eines neuen Sozialunternehmertums. Dank seiner Pionierleistung wurden bislang weltweit mehr als 100 Millionen Mittellose, vor allem Frauen, zu Unternehmern. Yunus entschloss den Ärmsten den Zugang zu sozialer Absicherung, Strom und modernen Kommunikationsmitteln, kurz zu einem Leben der Hoffnung.

Yunus will verändern, viel verändern, daran lässt er keinen Zweifel. Und er will überzeugen. Er will klarmachen, dass Lösungen praktisch umsetzbar sind, die bisher undenkbar erscheinen. Dafür setzt er die Mittel scharfer intellektueller Logik ein, gepaart mit der Gestik partnerschaftlichen Lernens. Er setzt niemanden herab, sondern hört immer mit höchster Aufmerksamkeit zu, so als wollte er niemals irgendwo die Lernchance, die in jeder menschlichen Begegnung steckt, versäumen. Er ist nicht der Besserwisser. Aber er hört besser zu als die anderen. Und er pocht darauf, dass jeder Mensch dieselbe Achtsamkeit, dieselbe Qualität des Zuhörens verdient. Yunus ist der Überzeugung, dass ein Grossteil der heutigen Weltprobleme dadurch entstanden sind, dass wir eine Hierarchie des Zuhörens schufen, in der nur so geannte Experten wirklich zählen und sich Gehör verschaffen.

Wie kann man bis heute in den Vorlesungssälen ehrenwerter Universitäten und in den Berichten renommierter Finanzinstitutionen von „Trickle-down-Effekten“ sprechen, die angeblich den Ärmsten zugutekommen, wenn man die Reichen – zusätzlich zu ihren spektakulären Gewinnen – noch weiter mit der Verbesserung ihrer Rahmenbedingungen motiviert, während man gleichzeitig das Ausbeutungssystem der Zinspraxis schlicht ignoriert? Der Schock, der den Professor traf, war zweifach. Einmal musste er die Nutzlosigkeit der traditionellen Volkswirtschaftslehre für die Lebenssituation der Armen einsehen. Und dann folgte bei Yunus der Schock über die Ignoranz seiner Gelehrtenzunft gegenüber dieser hoffnungslosen Ausbeutungssituation, in der die Ärmsten gefangen waren. Dieser Schock wurde noch einmal gesteigert, als er durch eine simple Befragung der Betroffenen feststellte, wie wenig eigentlich erforderlich war, um diesen Mechanismus der Armut zu durchbrechen. Er beauftragte eine Studentin, herauszufinden, wie hoch der Kredit wäre, den die Dorfbewohner bräuchten, um sich aus den Fängen der Zwischenhändler und Geldverleiher zu befreien und sich die Rohstoffe für ihre Arbeit selbst zu kaufen. Die Studentin kam mit einer Namensliste von 42 Personen zurück, die in der Summe ganze 856 Taka bäruchten – den Gegenwert von 27 US-Dollar! So lächerlich gering war der Preis für den Ausweg aus dem Teufelskreis der Armut. Er entschloss sich, diese 27 Dollar mit der Massgabe zu verleihen, das die Kreditnehmer diese Darlehen zurückzahlen sollten, sobald sie dazu in der Lage waren.

Die erste grosse, ja vielleicht entscheidenede Erkenntnis für die Entwicklung des gesamten Grameen Konzeptes war: Arme Menschen verfügen zwar über keine dinglichen Sicherheiten, also keine Sicherheiten in Form von Gebäuden oder sonstigen Sachwerten, die sie zur Übereignung an die Bank anbieten können für den Fall, dass sie ihren Kredit nicht zurückzahlen können. Sie verfügen dafür aber über eine viel bessere Sicherheit: ihren schicksalserprobten Überlebenswillen. Für diese Menschen ist ein Kredit die vermutlich einzige Chance, die sie in ihrem Leben erhalten, um aus eigener Kraft einer ansonsten hoffnungslosen Situation zu entkommen.

Ein weiterer wichtiger Sicherheitsfaktor für die einzigartigen Rückzahlungsquoten der Grameen Bank erwies sich etwas Überraschendes: das Geschlecht. Die Erfahrungen zeigten, dass Männer bei sonst gleichen Rahmenbedingungen ihre Kredite zu 85 Prozent zurückzahlten. Die Frauen kamen auf nahezu 100 Prozent. Bei der Grameen Bank sind die Verhältnisse auf den Kopf gestellt: 94 Prozent der Kreditnehmer sind weiblichen Geschlechts. Und diese sind damit zum allergrösten Teil gleichzeitig auch die Inhaberinnen der Grameen Bank, denn diese gehört zu 94 Prozent den Ärmsten selbst (sechs Prozent müssen aus rechtlichen Gründen in Bangladesch beim Staat verbleiben).

In einem Interview wurde Yunus gefragt: ” Hatte Ihr Kleinkreditkonzept denn keine Feinde?” “Doch, alle”, antwortete Yunus mit einer selbstverständlichen, fast heiteren Ruhe, als wäre es das Normalste der Welt, dass man alle gegen sich hat, wenn man Neues und Innovatives umzusetzen versucht. Im Buch schilderte er dann, wie die Wucherer in Existenzängste verfielen, erzählte von ihren aggressiven Wutattacken, als es plötzlich viel billigere Kredite gab, er berichtete, wie die Männer um ihre Vormachtstellung bangten, als ihre Frauen sich plötzlich  von Ängsten um die allgemeine Moral gepackt wurden, als die Frauen zunehmen mehr Selbstbewusstsein an den Tag legten, er machte klar, wie die Behöreden plötzlich allerlei Bedenken äusserten ob der vielen neuen Entwicklungen, die das Kleinkreditwesen anstiess, und wie sich schliesslich auch die Hilfswerke durch ein Konzept angegriffen fühlten, das soziale Probleme ausgerechnet durch Banking lösen wollte. Kurz gesagt: Alle waren dagegen.

muhammad

Mit den Kleinkrediten befreit er die Ärmsten der Armen aus den Zwängen von Wucherern, fehlender Bildung und wirtschaftlicher Abhängigkeit. Dadurch schafft er eine langzeitige Entwicklungshilfe, aber nicht aus der Sicht einer Entwicklungsorganisation sondern aus der Sicht eines Sozialunternehmens. Mit der Grameen Bank hat er einen Weg gefunden, Millionen von armen Familien zu einer besseren Zukunft zu führen. Das Buch geht detailliert auf die Chancen und Problemen dieser Kleinkredite ein. Für mich ist das Buch etwas langatmig geschrieben, weshalb ich primär das Interview auf 3Sat empfehle.

Philosophie der Kreditgebung- Muhammad Yunus im Gespräch

Film

by Fabio Ferrari at March 11, 2010 07:54

March 10, 2010

Giu

Run This!

"Add a button to let your readers run snippets of code directly from your blog and see the results interactively.[...]". Pretty neat web application. It runs code snippets pretty fast and it's very easy to use (A WordPress plugin is available). Be sure to check out the examples on the page. It surely would be cool (and useful, too) if snippet hosting sites (like http://gist.github.com) would use this service to run the snippets. I actually didn't install the plugin yet, but I can imagine that WordPress users who have already installed the Dean's Code Highlighter plugin will have some issues with using the Run This! plugin, since both use the <pre lang="...-construct for pasting snippets.

#

by giu at March 10, 2010 18:21

March 09, 2010

Giu

Inverse Graphing Calculator

Quoted from the page: "[...]The way the IGC works is, you type something you'd like as your curve, like 'Hello World' or 'I love you'. The IGC produces an *equation* which has this phrase as its graph!". In the first version of the IGC, the equation was shown as a PNG in LaTeX style (the image name actually contained the LaTeX code), but the author removed it (surely because of the traffic the IGC got, since I couldn't load the IGC a few hours ago). I would love to see the code behind this thing. Pretty interesting!

#

by giu at March 09, 2010 22:17

Alexander Boesch

aptitude search

Ich brauche deine Hilfe, denn hier (Tansania) komme ich mangels fehlender Testinfrastruktur nicht weiter. Falls du also ein aptitude (je neuer desto besser) zur Hand hast, kannst Du mir vielleicht das erklären:
aptitude search libstdc
Einen Haufen Resultate
aptitude search libstdc++
Einen Haufen Resultate
aptitude search libstdc++6
Kein Resultat
aptitude search libstdc++5
Kein Resultat

Suche ich nach einem anderen Paket mit vollem Namen funktionierts aber:
aptitude search geany
Ein Resultat.

und so weiter.

Getestet mit aptitude Version 0.4.11.11-1~lenny1

by alexander at March 09, 2010 13:12