Ein Freund von mir arbeitet für eine kleine Firma an einem Projekt, das jeder Entwickler hassen würde: Er ist unter Druck gesetzt, so schnell wie möglich zu veröffentlichen, er ist der einzige, der sich anscheinend um technische Schulden kümmert, der Kunde hat keinen technischen Hintergrund usw.
Er erzählte mir eine Geschichte, die mich über die Angemessenheit von Designmustern in Projekten wie diesem nachdenken ließ. Hier ist die Geschichte.
Wir mussten Produkte an verschiedenen Stellen auf der Website anzeigen. Beispielsweise könnten Content Manager die Produkte, aber auch die Endbenutzer oder die Partner über die API anzeigen.
Manchmal fehlten Informationen in den Produkten: Beispielsweise hatten einige von ihnen keinen Preis, als das Produkt gerade erstellt wurde, aber der Preis war noch nicht festgelegt. Einige hatten keine Beschreibung (die Beschreibung ist ein komplexes Objekt mit Änderungsprotokollen, lokalisiertem Inhalt usw.). Einigen fehlten Versandinformationen.
Inspiriert von meinen jüngsten Lesungen über Entwurfsmuster, hielt ich dies für eine hervorragende Gelegenheit, das magische Null-Objekt-Muster zu verwenden . Also habe ich es geschafft und alles war glatt und sauber. Man musste nur anrufen
product.Price.ToString("c")
, um den Preis anzuzeigen oderproduct.Description.Current
die Beschreibung anzuzeigen ; Keine bedingten Dinge erforderlich. Bis der Stakeholder eines Tages bat, ihn in der API anders anzuzeigen, indem er einennull
in JSON hatte. Und auch anders für Content-Manager, indem "Preis nicht angegeben [Ändern]" angezeigt wird. Und ich musste mein geliebtes Null-Objekt-Muster ermorden, weil es nicht mehr nötig war.Auf die gleiche Weise musste ich ein paar abstrakte Fabriken und ein paar Erbauer entfernen. Schließlich ersetzte ich mein wunderschönes Fassadenmuster durch direkte und hässliche Aufrufe, da sich die zugrunde liegenden Schnittstellen drei Monate lang zweimal täglich änderten und sogar der Singleton mich verließ als die Anforderungen besagten, dass das betroffene Objekt je nach Kontext unterschiedlich sein musste.
Mehr als drei Wochen Arbeit bestanden darin, Designmuster hinzuzufügen und sie dann einen Monat später zu zerreißen, und mein Code wurde schließlich zu einer Spaghetti, die von niemandem, einschließlich mir, gepflegt werden konnte. Wäre es nicht besser, diese Muster überhaupt nicht zu verwenden?
In der Tat musste ich mich mit Projekten befassen, bei denen sich die Anforderungen ständig ändern und die von Personen vorgegeben werden, die den Zusammenhalt oder die Kohärenz des Produkts nicht wirklich berücksichtigen. In diesem Zusammenhang spielt es keine Rolle, wie agil Sie sind, Sie erhalten eine elegante Lösung für ein Problem, und wenn Sie diese schließlich implementieren, stellen Sie fest, dass sich die Anforderungen so drastisch geändert haben, dass Ihre elegante Lösung nicht mehr passt länger.
Was wäre die Lösung in diesem Fall?
Verwenden Sie keine Entwurfsmuster, hören Sie auf zu denken und schreiben Sie Code direkt?
Es wäre interessant, eine Erfahrung zu machen, bei der ein Team Code direkt schreibt, während ein anderes Team vor dem Tippen zweimal darüber nachdenkt und das Risiko eingeht, einige Tage später das ursprüngliche Design wegwerfen zu müssen: Wer weiß, vielleicht haben beide Teams das gleiche technische Schulden. Ohne solche Daten würde ich nur behaupten, dass es sich nicht richtig anfühlt , Code ohne vorherige Überlegung bei der Arbeit an einem 20-Mann-Monat-Projekt zu tippen.
Behalten Sie das Designmuster bei, das keinen Sinn mehr ergibt, und versuchen Sie, weitere Muster für die neu erstellte Situation hinzuzufügen?
Dies scheint auch nicht richtig. Muster werden verwendet, um das Verständnis des Codes zu vereinfachen. Wenn Sie zu viele Muster eingeben, wird der Code zu einem Chaos.
Überlegen Sie sich ein neues Design, das die neuen Anforderungen berücksichtigt, und überarbeiten Sie dann langsam das alte Design in das neue?
Als Theoretiker und derjenige, der Agile bevorzugt, bin ich total begeistert. In der Praxis, wenn Sie wissen, dass Sie jede Woche zum Whiteboard zurückkehren und den Großteil des vorherigen Designs wiederholen müssen und der Kunde einfach nicht genug Geld hat, um Sie dafür zu bezahlen, und auch nicht genug Zeit zum Warten Das wird wahrscheinlich nicht funktionieren.
Also irgendwelche Vorschläge?