Das Mimikri Muster

“Mancher lehnt eine gute Idee bloß deshalb ab, weil sie nicht von ihm ist.”

Luis Buñuel

Immer wieder müssen Software Entwickler neue APIs aus dem Boden stampfen und sich dabei überlegen, wie sie die neue API denn gestalten wollen. Es gibt eine Unmenge von Möglichkeiten, wie man Klassen und Methoden benennt, welche Pattern die API nutzt und welches grundlegende Konzept verfolgt wird.

Ich verwende bei der Gestaltung einer neuen API gerne das Mimikri-Muster. Der Name rührt von der Fähigkeit bestimmter Tierarten her, sich als Exemplate einer anderen Art zu tarnen. Diese anderen Arten haben es meistens einfacher in der freien Wildbahn, weil sie sich gut schützen können. Mimikri deshalb, weil keine gänzlich neue API erdacht wird, sondern die Grundidee eine bereits bestehende API übernommen wird .

Im folgenden Beispiel sind einige Methodenaufrufe einer Phone-API dargestellt, mit der nationale und internationale Rufnummern, erzeugt, umgewandelt, ein- und ausgegeben werden können.

Einige Methoden zum Erzeugen von NationalPhoneNumber Instanzen.

NationalPhoneNumber national;
national = NationalPhoneNumber.of("0", "1234", "12345");
national = NationalPhoneNumber.parse("01234 12345");
national = NationalPhoneNumber.parse("(01234) 12345", PhoneNumberFormatter.E_123);

Einige Methoden zum Erzeugen von InternationalPhoneNumber Instanzen.

InternationalPhoneNumber international;
international = InternationalPhoneNumber.of("00", "49", "0", "1234", "12345");
international = InternationalPhoneNumber.of("00", "49", national);
international = national.toInternational("00", "49");
international = InternationalPhoneNumber.parse("+49 5223 14862");

Dazu einige weitere Methoden um Instanzen dieser Klassen untereinander zu konvertieren.

international = nationalPhoneNumber.toInternational("00", "49");
international = nationalPhoneNumber.toInternational(Locale.GERMANY);
national = NationalPhoneNumber.from(international);
national = NationalPhoneNumber.from(national);

Und zum Schluss noch eine Hilfsklasse für die Ein- und Ausgabe.

international = PhoneNumberFormatter.ofPattern("iiiccc nnn sss[-eee]").parse("0049 5223 14862");
String output = PhoneNumberFormatter.DIN_5005.format(international);

Wenn man diese API anschaut, kommt sie einem recht vertraut vor und die Zurückhaltung bei der Nutzung wird sehr gering sein.

Woher kommt diese hohe Akzeptanz ein bislang völlig unbekannten API? Diese API folgt in ihrer Form der Java Time API. Die NationalPhoneNumber und die InternationalPhoneNumber finden dort ihre Vorbilder in LocalDateTime und ZonedDateTime und der PhoneNumberFormatter ist eine einfache Version des DateTimeFormatters.

Das Mimikri-Muster hat eine ganze Reihe von Vorteilen für Software Entwickler. Die Design Phase der API verkürzt sich, die Akzeptanz ist bei den Kollegen häufig höher und deren Einarbeitungzeit sinkt. Auch lernt der Entwickler eine Menge, wenn er sich mit den Details etablierter APIs beschäftigt.