Ist Wiederverwendbarkeit ungefähr gleichbedeutend mit gutem Design?

10

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?

Matthew Rodatus
quelle
Ich würde argumentieren, dass Flexibilität wichtiger ist. Eine zugrunde liegende Architektur zu haben, die versucht, der Realität Rechnung zu tragen, dass sich etwas wahrscheinlich ändern oder später hinzugefügt wird, ist meiner Meinung nach der Schlüssel. Die Wiederverwendbarkeit ist zu diesem Zeitpunkt fast kostenlos.
Pemdas
Ihre Nutzung von Flexibilität klingt genau nach Wiederverwendbarkeit.
Matthew Rodatus
"Wiederverwendbarkeit ist die Wahrscheinlichkeit, dass ein Segment des Quellcodes erneut verwendet werden kann, um neue Funktionen mit geringfügigen oder keinen Änderungen hinzuzufügen" - en.wikipedia.org/wiki/Reusability
Matthew Rodatus
Ich bin beeindruckt, dass die meisten der folgenden Antworten Nein sagen . Dies wäre jetzt erst vor ein paar Jahren der Fall gewesen (na ja ... 5-10 Jahre), als die Wiederverwendbarkeit der letzte Schrei war, was sehr wünschenswert war.
Martin Wickman
@ MartinWickman Wiederverwendbarkeit ist gut, aber nicht kostenlos.
Caleb

Antworten:

13

Nein.

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.

Aaronaught
quelle
Gute Antwort. Sie haben die Frage beantwortet, die ich hätte stellen sollen: "Was ist ein guter Glanz für gutes Software-Design?"
Matthew Rodatus
+1: Besonders für "Wiederverwendbarkeit ist größtenteils eine Illusion".
Kramii
Es ist nur ein Indikator für gutes Design, wenn Wiederverwendbarkeit ein Ziel ist. Oft ist ein Ziel, wenn eine implizite, aber viel Zeit und Geld zu verdienen Komponenten wiederverwendbar , wenn sie nicht sein müssen nur verschwenderisch ist.
Caleb
5

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.)

Übrigens
quelle
Was ist mit automatisierten Tests? Sind Unit-Tests nicht eine Form der Wiederverwendung?
Matthew Rodatus
@ Matthew-Rodatus: Unit-Tests sind Teil Ihrer Software. Die Wiederverwendung bezieht sich normalerweise auf die Wiederverwendung von Code in einer anderen Software.
Btilly
Guter Punkt. Ich denke, ich verwende "Wiederverwendbarkeit" in einem ontologischen Sinne, was verwirrend ist. Beachten Sie jedoch, dass die Merkmale der Wiederverwendbarkeit auch Merkmale des testbaren Codes sind: en.wikipedia.org/wiki/Reusability
Matthew Rodatus
1
@ matthew-rodatus: Wiederverwendbarkeit ist nicht "Hat diese Wäscheliste von Funktionen." Wenn Sie versuchen, auf diese Weise die Wiederverwendbarkeit zu erreichen, werden Sie schwer scheitern. Vertrau mir in dieser Sache.
Btilly
Guter Punkt. Ich sehe jetzt, dass ich die Frage, die ich stellen wollte, nicht gestellt habe, aber es ist immer noch ein interessanter Dialog.
Matthew Rodatus
4

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

David Conde
quelle
Deshalb habe ich "Glanz" gesagt (womit ich meine, dass Wiederverwendbarkeit praktisch das meiste, aber nicht alles erfasst, was wir unter gutem Design verstehen).
Matthew Rodatus
Mein Punkt ist, dass Sie Wiederverwendbarkeit benötigen, um ein gutes Design zu haben , aber viele "wiederverwendbare" Code-Deos bedeuten nicht, dass Sie ein gutes Design haben, also würde ich immer noch nein
David Conde
Das macht Sinn. Ich bin mir nicht sicher, ob ich damit einverstanden bin, aber +1 für eine gut durchdachte Antwort.
Matthew Rodatus
2

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.

Larry Hector
quelle
1

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.

Caleb
quelle
0

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.

pdr
quelle
Woher wissen Sie sicher, ob etwas niemals wiederverwendet wird?
Matthew Rodatus
1
@ Matthew - Das wäre meine Definition eines guten Designers: Jemand, der diese Frage normalerweise richtig stellt
pdr
0

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

  • Webform-Vorlagen, mit denen eine Seite einfach und konsistent hinzugefügt werden kann (oder für jede Art von Benutzeroberfläche)
  • Entwerfen Sie Musterhelfer wie eine ViewModel-Basisklasse, die in allen meinen MVVM-Anwendungen enthalten sein wird

Utility Stuff

  • E-Mail-Klasse, die eine SMTP-Nachricht sendet (verwenden Sie diese ständig)
  • Eine GIS-Entfernungsrechnerklasse (wird in einer Reihe unserer Apps verwendet)

Für das CRUD-Material, das 70-80% der meisten Apps ausmacht, halte ich die Wiederverwendbarkeit einfach nicht für eine wertvolle Metrik.

Morgan Herlocker
quelle