Die Wiederverwendbarkeit ist ein Merkmal eines guten Software-Designs .
Ist die Wiederverwendbarkeit ein akzeptabler Glanz ("kurze Notation der Bedeutung") für ein gutes Software-Design? Warum?
Die Wiederverwendbarkeit ist ein Merkmal eines guten Software-Designs .
Ist die Wiederverwendbarkeit ein akzeptabler Glanz ("kurze Notation der Bedeutung") für ein gutes Software-Design? Warum?
Antworten:
Die Wiederverwendung ist ein Indikator für gutes Design. Dies zeigt an, dass die Kopplung des Systems locker genug ist und die Kohäsion einer bestimmten Einheit hoch genug ist, um die Wiederverwendung zu erleichtern, ohne auf Abhängigkeitsprobleme zu stoßen oder den größten Teil des Codes neu schreiben zu müssen.
Wiederverwendbarkeit ist weitgehend eine Illusion. Es ist nachweislich unmöglich, die "Wiederverwendbarkeit" einer Einheit zu messen, ohne vorher zu wissen, wo oder wie sie verwendet werden soll. Viele Entwickler werden versuchen , "wiederverwendbare" Komponenten zu entwerfen und später oft herausfinden, dass die spezifischen Aspekte, die sie versucht haben, "flexibel" zu machen, genau diejenigen sind, die nicht sein mussten.
Ich würde einen anderen "Glanz" verwenden: Testbarkeit.
Jetzt bin ich kein Befürworter von TDD, und ich habe auch nicht das Bedürfnis, alles und jeden zu testen. Wenn Sie jedoch Tests für eine Komponente schreiben, erhalten Sie sehr schnell eine sehr gute Vorstellung von deren Kopplungs- / Kohäsionseigenschaften. Wenn es auf Abstraktionen ankommt, dann ist das lose Kopplung; Sie werden es leicht finden, die Abhängigkeiten zu verspotten, und das deutet auf ein gutes Design hin. Wenn es einen klaren Zweck hat (siehe auch Prinzip der Einzelverantwortung ), ist sein Verhalten relativ intuitiv. Sie können leicht herausfinden, was getestet werden soll, was wiederum auf ein gutes Design hindeutet.
Das garantiert natürlich kein gutes Design; Die tatsächliche Implementierung oder sogar die gesamte Architektur kann für den angegebenen Zweck völlig ungeeignet sein. Aber zumindest sagt es Ihnen, dass Sie nicht mit Spaghetti-Code oder God Objects arbeiten.
Bitte versuchen Sie nicht, wilde Vermutungen über die "Wiederverwendbarkeit" einer Komponente anzustellen, insbesondere nicht als Beweis für "gutes Design". Dies können Sie erst im Nachhinein feststellen, wenn es tatsächlich wiederverwendet wird. Bis dahin hat sich das Design möglicherweise erheblich geändert.
Nein.
Wiederverwendbarkeit ist eine gute Funktion, da sie die zukünftige Entwicklung beschleunigen kann. (Obwohl in der Praxis nur sehr wenige Unternehmen sehen, dass die zukünftige Entwicklung fast so schnell beschleunigt wird, wie sie es sich erhofft hatten.) Jede bedeutende Software enthält jedoch Teile, die für diese Anwendung spezifisch sind. Wenn Personen ohne Domain-Erfahrung versuchen, wiederverwendbare Software zu schreiben, verschleiern sie dieses Teil normalerweise und reduzieren die Leistung, ohne dass es tatsächlich gelingt, es wiederverwendbar zu machen.
Daher ist gutes Design modular aufgebaut und nur dann wiederverwendbar, wenn Sie sehen, dass das Teil wiederverwendet werden kann, und wenn Sie über das Fachwissen verfügen, um tatsächlich Wiederverwendbarkeit zu erreichen. An anderer Stelle sollten Sie versuchen, die Dinge sauber zu machen, aber sich keine Sorgen um die Wiederverwendbarkeit machen. (Außer im Hinterkopf, wo Sie Notizen machen, damit Sie auf einem zukünftigen System eine Idee haben, wie Sie diese wiederverwendbar machen können.)
Ich glaube (und das ist meine persönliche Überzeugung), dass die Beziehung zwischen Wiederverwendbarkeit und gutem Design nicht reflexiv ist, daher lautet die grundlegende und einfache Antwort nein . Wenn Sie an guten Design-Anleitungen interessiert sind, lesen Sie diesen Wikipedia-Artikel.
Ein gutes Software-Design muss wiederverwendbar sein, zumindest in einigen Kernbereichen. Ich denke, dass nur sehr wenige Leute den Quellcode tatsächlich wiederverwenden, da es äußerst komplex ist, den Kern eines Systems so zu gestalten, dass er in vielen verschiedenen Kontexten wiederverwendbar ist (Und ich sage das aus Erfahrung)
Stellen Sie sich eine Klasse mit einer großen Anzahl von Verantwortlichkeiten vor (auch bekannt als Blob), die alle Aufgaben, die Sie benötigen, gut ausführt, aber ohne jegliche Überlegungen zum Design. Vielleicht haben Sie den Fall gesehen. Die meisten Leute mit einer solchen Klasse würden es immer und immer wieder benutzen und ich denke, wir müssen uns einig sein, dass es Wiederverwendung ist, designlose Wiederverwendung.
Ich hoffe, ich habe meine Erklärungen nicht zu sehr durcheinander gebracht
Ich denke, ein besserer Indikator für gutes Design ist die Einhaltung grundlegender Ideen wie das Prinzip der Einzelverantwortung und die Aufrechterhaltung des Zusammenhalts jeder Komponente. Durch die Verwendung von Abstraktionen mit einer sauberen und übersichtlichen Oberfläche und die Einhaltung des Liskov-Substitutionsprinzips fördern wir die Wiederverwendung, ohne vorherzusagen, was wiederverwendet wird und was nicht.
Das Festhalten an diesen grundlegenden Entwurfsprinzipien erleichtert das Testen und die Wiederverwendung von Code .
Gutes Design == gutes Design, Wiederverwendbarkeit ist ein Nebenprodukt.
Wiederverwendbarkeit ist oft ein implizites Entwurfsziel. Wenn Sie eine Komponente erstellen können, oder eine ganze Design, in einer solchen Art und Weise , dass sie später wiederverwendet werden kann, es scheint offensichtlich , dass Sie das tun sollten. Was nicht immer offensichtlich ist, ist, dass es viel Zeit und Mühe (und Geld) kosten kann, etwas wiederverwendbar zu machen, und der Nutzen der Wiederverwendbarkeit muss daher gegen seine Kosten abgewogen werden.
Ein wiederverwendbares Design, dessen Herstellung doppelt so viel kostet und / oder doppelt so lange dauert als das, was der Kunde benötigt, ist aus Kundensicht kein gutes Design, insbesondere wenn der Kunde keine Wiederverwendbarkeit benötigt.
Es gibt eine Reihe ähnlicher Attribute, die häufig als implizite Entwurfsziele angesehen werden, da sie offensichtlich gut erscheinen:
Kosten minimieren
Minimierung der Entwicklungszeit
Komplexität minimieren
Maximierung der Zuverlässigkeit
Diese Dinge sind alle objektiv gut, aber für einen bestimmten Kunden zu einem bestimmten Zeitpunkt möglicherweise nicht immer wichtig. Daher ist es wichtig, die Bedürfnisse Ihres Kunden vollständig zu verstehen (auch wenn dieser Kunde nur Ihr Chef ist). Es gibt eine Reihe von Aphorismen, die uns an diese Tatsache erinnern sollen (z. B. "Fertig ist besser als perfekt" und "Gut, billig, schnell: wählen Sie zwei aus"), aber es ist immer noch leicht, in die Falle zu tappen, es zu versuchen Machen Sie Software, die in jeder Hinsicht großartig ist, obwohl sie in jeder Hinsicht nicht immer benötigt wird.
Um zur Titelfrage zu gelangen: Nein , Wiederverwendbarkeit ist nicht gleichbedeutend mit gutem Design. Die Wiederverwendbarkeit kann eine nützliche Komponente eines bestimmten guten Designs sein, jedoch nur dann, wenn dies erforderlich ist.
Nicht unbedingt. Wenn Sie etwas wiederverwendbar machen, das eindeutig nie wiederverwendet wird, dann ist das schlechtes Design.
Wenn Sie beispielsweise eine Datei mit Daten schreiben, die für Ihr Unternehmen eindeutig ist und die Daten einmal an einen anderen Ort importiert werden sollen, warum sollten Sie sie dann wiederverwendbar machen?
Wenn Ihr Framework jedoch noch keinen hat, muss der Code zum Schreiben in eine Datei möglicherweise wiederverwendbar sein. Das wäre gutes Design.
Ich würde nein sagen, hauptsächlich, weil es nur ein kleines Codesegment beschreibt. Ich habe festgestellt, dass die Benutzerfreundlichkeit im Kern und an den Außenkanten des Versorgungsgebiets am wichtigsten ist, nicht so sehr dazwischen. Ich werde einige Beispiele für Dinge geben, bei denen ich denke, dass Wiederverwendbarkeit eine nützliche Metrik für Qualitätsdesign ist.
Kernmaterial
Utility Stuff
Für das CRUD-Material, das 70-80% der meisten Apps ausmacht, halte ich die Wiederverwendbarkeit einfach nicht für eine wertvolle Metrik.