2008-09-19 5 views

Antwort

15

Absturz nur Software: http://www.usenix.org/events/hotos03/tech/full_papers/candea/candea_html/ Zusammenfassung

Crash nur Programme abstürzen sicher und schnell erholen. Es gibt nur einen Weg, um solche Software zu stoppen - indem Sie sie abstürzen - und nur eine Möglichkeit, sie aufzuzeigen - indem Sie die Wiederherstellung einleiten. Crash-only-Systeme werden aus reinen Crash-Komponenten erstellt, und transparente Revisionen auf Komponentenebene blenden systeminterne Komponentenabstürze von Endbenutzern aus. In diesem Papier wir befürworten ein Crash-Only-Design für Internet-Systeme, die zeigen, dass es zu zuverlässiger, berechenbarer Code und schnellere, effektivere Wiederherstellung führen kann. Wir stellen Ideen vor, wie man solche Crash-Only-Internet-Dienste aufbauen kann, indem man erfolgreiche Techniken zu ihrem logischen Extrem bringt.

1

Nein, das ist über DP Bücher und dieser Thread ist über die bestimmten Muster.

Interpreter und Flyweight kommt aus dem Gang of 4 Buch.

Ich halte Bridge und Mediator mächtige und tiefe Muster in der SW-Entwickler-Toolbox.

+0

Ich mag Ihren Beitrag, aber Sie können eine Erklärung über das Muster hinzufügen, das Sie beschreiben. –

5

Es ist eher ein Anti-Pattern, aber ich habe gesehen, was ich das "Keep it all an einem Ort" -Muster nennen. Es war eine große Anwendung, in der alle Variablen, die nicht lokal waren, für jede Klasse, JEDE Klasse, in einer einzigen Klasse namens P (für Parameter) gespeichert wurden. Nebenbei bemerkt wurden alle statischen Variablen in einer Klasse namens ... Warten Sie auf ... S.

Wie auch immer, dieses Projekt wuchs ziemlich groß, und plötzlich funktionierte nichts. (Ich wurde um diese Zeit eingestellt). Erstaunlicherweise stürzte das Programm nicht ab, es hatte nur Tonnen von Nebenwirkungen, die die Anwendung verrückt machten. Wie Sie sich vorstellen können, sind mehrere Threads, die alle auf P zugreifen und Variablen ändern, ohne Sperren oder Synchronisation vorhanden.

Ich sage dir, es war wirklich ein unvergesslicher Anblick.

Das Unternehmen eröffnete ein neues Büro und stellte 3 Leute ein, um es zu besetzen, ich bin einer von ihnen. Wir bekamen das Programm und sollten es reparieren. Wir verbrachten Tage damit, nur herumzusitzen und uns auf die Stirn zu schlagen. Ich habe jetzt einen durchdringenden Handabdruck auf meinem Gesicht.

Andere Funnies ... Variable namens "FudgeFactor". Ich weiß immer noch nicht, was das ist.

Methode nächste ASCII-Zeichen ...

char getNextChar(char previous) { 

switch (previous) 
case 'a': return b; 
case 'b': return c; 
... 
case 'z': return a; 
} 

Wie auch immer zu bekommen, dass meine lustige Muster ist ... mit einigen zusätzlichen Seite in lustig geworfen.

+1

Erinnert mich an einige Post auf "der täglichen wtf" :-) –

2

Besucher stecken mich das erste Mal, wenn sie auf Arbeits ein graph-schweres Programm, als sehr elegante Möglichkeit, Operationen an komplexen Strukturen durchzuführen.

neben mvc (das ist kein pattern per se), ist dies der "König der Muster" in Bezug auf seine Komplexität und das Potenzial, Probleme zu lösen.

2

Die Fluent Interface von Fowler ist ein ziemlich interessantes Muster. Ich hatte schon immer eine Schwäche für abstrakte Fabriken, Strategien und das State Pattern. Wenn ich kann, habe ich vor kurzem ein "Muster" kodifiziert, das ich Friend Class Pattern nenne, das einige interessant oder nützlich finden könnten, um die Sichtbarkeit von privaten Feldzugriffen in Sprachen zu beschränken, die keine C++ - Stil-Freundklassen haben.

+0

Hmm, fließend. Linq ist dafür gebaut. – Dykam

+1

Ich weiß nicht, dass ich Linq als fließende Schnittstelle beschreiben würde. Meiner Erfahrung nach sind fließende Interfaces normalerweise so gestaltet, dass die Anrufe wie ein englischer Ausdruck gelesen werden können. Die Methoden einer fließenden Schnittstelle sind oft extrem zustandsbehaftet - wenn man die gleiche Methode zu unterschiedlichen Zeiten aufruft, ergeben sich sehr unterschiedliche Ergebnisse. Bei Linq geht es mehr darum, eine Pipeline zu erstellen, die zur Verarbeitung eines Datensatzes verwendet wird. Keine der Linq-Methoden mutiert irgendeinen Zustand - sie geben einfach ein neues Objekt zurück. Und Linq Methoden fühlen sich mehr "Methode" als "Phrase" y für mich. Aber das ist nur meine Meinung. –

0

Das interessanteste Designmuster, das Sie jemals treffen werden, ist eines, das Sie aus offensichtlichen Gründen selbst erstellt haben.

Das soll nicht heißen, dass es das beste Designmuster sein wird, nur das interessanteste.

+2

Nicht ich. Sobald ich etwas geschaffen habe, auch wenn ich ziemlich stolz darauf bin, wird es trivial und daher völlig uninteressant. Es sind Dinge, die ich noch nicht kenne, die interessant sind. – ChrisA

0

Ich habe nie den Punkt des Visitor-Musters gesehen, bis ich den Java-Bytecode direkt über die Bibliothek ASM manipulieren musste. Es war erstaunlich, wie sehr das Muster vereinfachte, was sonst eine wirklich komplexe Aufgabe gewesen wäre.

Das Muster wird auch in den meisten Java-IDEs verwendet, wenn Sie Ihr eigenes Refactoring-Plugin schreiben möchten. Sie stellen ein Besucherobjekt bereit, und es wird um die AST übergeben, um die erforderlichen Änderungen vorzunehmen.

2

Nicht so sehr ein Muster, aber Dependency Injection und Umkehrung der Steuer

4

Im letzten Jahr habe ich bereits in LANSA geschrieben Wartung auf einer Windows-Anwendung zu tun, wo der Schwerpunkt, indem alle Steuerelemente auf tabstop verwaltet wird = false mit Ausnahme von zwei versteckten Schaltflächen (PrevFocus und NextFocus). Wenn ein Formular geladen wird, wird der Fokus auf ein Feld gesetzt, und der Name dieses Feldes wird in einer Tracking-Variablen (etwa "FocusField") gespeichert. Wenn der Benutzer den Fokus ändert, wird das GotFocus-Ereignis der entsprechenden Schaltfläche ausgeführt. Innerhalb dieser Funktion befindet sich eine case-Anweisung (wählen Sie die Option FocusField). Basierend auf dem aktuell fokussierten Feld wird die Validierungslogik ausgeführt und möglicherweise wechselt der Fokus zu einem anderen Feld.

Die GotFocus-Ereignisse für die meisten Steuerelemente betrachten den aktuellen Wert von FocusField und rufen dann eine LostFocus-Funktion auf, die dieselbe Fallanweisung für FocusField ausführt, sodass das zuvor fokussierte Feld validiert wird.

Wie Sie wahrscheinlich erraten können, ist es dadurch unmöglich, die Benutzeroberfläche von der Logik zu trennen, und eine unglaubliche lästige Arbeit zu halten. Umschreiben diese Formen eine einfache Validate-Methode zu verwenden, die alle Eingänge und lassen die normalen tabbing validiert Eigenschaften (TabOrder, TabStop, etc.) tun, um ihre Magie in der Regel in 50% ige Reduktion der Code und die deutlich zuverlässigere Formen geführt hat.

Ich habe keine Ahnung, wo dieses Muster entstanden, obwohl es von der RPG/Green-Screen-Programmierer gedreht WinForms-Entwickler, die die Anwendung geschrieben erdacht worden sein.

2

Ich erinnere mich, als ich zum ersten Mal über die flyweight pattern in der GOF gelesen. Das Beispiel, das sie verwenden, ist ein Textverarbeitungsprogramm; Sie weisen auf die Nachteile hin, ein unabhängiges Objekt zur Darstellung jedes Zeichens zu verwenden. Das Fliegengewichtmuster fördert die Trennung von gemeinsam nutzbarem, intrinsischem, unveränderlichen Zustand von einem nicht übertragbaren, extrinsischen, veränderbaren Zustand. Für mich war es zu dieser Zeit eines dieser "Aha!" Momente, die meinen Horizont wirklich erweitert haben und bis heute meine Entwürfe beeinflusst haben.

Ein Freund von mir schlug vor, dass das Strategie-Muster im Wesentlichen das Vorläufermuster ist. Viele der anderen Muster (Bridge, Decorator, Proxy, State, ...) sind nur raffiniertere Anwendungen von Strategy. Ich erinnere mich, dass ich schon lange mit ihm gestritten habe, dass zwischen Strategie und Staat tatsächlich ein Unterschied besteht.