2009-08-18 5 views
4

Ich fragte this question über Microsoft .NET Libraries und die Komplexität seines Quellcodes. Nach dem was ich lese, kann das Schreiben von allgemeinen Bibliotheken und das Schreiben von Anwendungen zwei verschiedene Dinge sein. Wenn Sie Bibliotheken schreiben, müssen Sie über den Kunden nachdenken, der buchstäblich jeder sein könnte (vorausgesetzt, dass ich die Bibliothek für den Gebrauch in der Öffentlichkeit freigebe).Wie schreiben Sie gute, sehr nützliche Allzweckbibliotheken?

Welche Praktiken oder Theorien oder Techniken sind nützlich, wenn Sie lernen, Bibliotheken zu schreiben? Wo lernst du Code wie in der .NET-Bibliothek zu schreiben? Das sieht nach einer "schwarzen Kunst" aus, von der ich nicht viel weiß.

Antwort

0

Ich würde anfangen, mehr in Entwurfsmuster zu suchen. Sie werden wahrscheinlich nicht viel Nutzen für einige von ihnen finden, aber wenn Sie tiefer in Ihr Bibliotheksdesign kommen, werden die Muster anwendbarer. Ich würde auch eine Kopie von NDepend abholen - ein großartiges Werkzeug zur Code-Messung, das Ihnen helfen könnte, die Dinge besser zu entkoppeln. Sie können .NET-Bibliotheken als Beispiel verwenden, aber ich persönlich finde, dass ich sie aufgrund ihrer Komplexität nicht als gutes Design-Beispiel ansehe. Schauen Sie sich auch einige Open-Source-Projekte an, um zu sehen, wie sie strukturiert und strukturiert sind.

9

Das ist eine ziemlich subjektive Frage, aber hier ist eine objektive Antwort. Das Framework Design Guidelines Buch (sicher sein, die 2. Ausgabe zu bekommen) ist ein sehr gutes Buch darüber, wie man effektive Klassenbibliotheken schreibt. Der Inhalt ist sehr gut und die oft abweichenden Anmerkungen sind zum Nachdenken anregend. Jeder Laden sollte eine Kopie dieses Buches zur Verfügung haben.

+0

Absolut richtig. In diesem Buch erfahren Sie, wie Sie hoch wiederverwendbare Frameworks erstellen sollten. –

2

Krzysztof Cwalinas Blog ist ein guter Startpunkt. Sein Buch, Framework Design Guidelines: Konventionen, Idiome und Patterns für wiederverwendbare .NET-Bibliotheken, ist wahrscheinlich die definitive Arbeit für Best Practices im .NET-Bibliotheksdesign.

http://blogs.msdn.com/kcwalina/

5

Ein Ratschlag, oft von Bibliothek Autoren ignoriert, Kosten zu internalisieren. Wenn etwas schwer ist, sollte die Bibliothek es tun. Zu oft habe ich gesehen, dass die Autoren einer Bibliothek den Konsumenten der API etwas hartes vorschieben, anstatt sie selbst zu lösen. Suchen Sie stattdessen nach den schwierigsten Dingen und stellen Sie sicher, dass die Bibliothek sie erledigt oder zumindest sehr einfach macht.

4

ich von Effective C++ von Scott Meyers paraphrasiert wird, was ich gefunden habe, die besten Ratschläge, die ich habe:

Adhere zum Prinzip der geringsten Erstaunen: streben Klassen, deren Operatoren und Funktionen zur Verfügung zu stellen haben eine natürliche Syntax und eine intuitive Semantik. Behalten Sie die Konsistenz mit dem Verhalten der eingebauten Typen: Im Zweifelsfall tun Sie es wie die Ints.

Erkennen, dass alles, was jemand tun kann, sie tun werden. Sie werfen Ausnahmen, sie ordnen sich selbst Objekte zu, sie benutzen Objekte, bevor sie ihnen Werte geben, sie geben Objekten Werte und benutzen sie nie, sie geben ihnen riesige Werte, sie geben ihnen winzige Werte geben sie ihnen Nullwerte. Im Allgemeinen wird jemand es tun, wenn es kompiliert wird. Als Ergebnis machen Sie Ihre Klassen einfach zu verwenden richtig und schwer falsch zu verwenden. Akzeptieren Sie, dass Clients Fehler machen, und gestalten Sie Ihre Klassen so, dass Sie solche Fehler verhindern, erkennen oder korrigieren können.

Streben Sie nach tragbaren Code.Es ist nicht viel schwieriger, portable Programme zu schreiben, als unportable zu schreiben, und nur selten wird der Unterschied in der Leistung signifikant genug sein, um nicht tragbare Konstrukte zu rechtfertigen.

Selbst Programme, die für benutzerdefinierte Hardware entwickelt wurden, werden oft portiert, da die Standardhardware im Allgemeinen innerhalb weniger Jahre ein gleichwertiges Leistungsniveau erreicht. Durch das Schreiben von tragbarem Code können Sie problemlos zwischen Plattformen wechseln, Ihre Kundenbasis erweitern und mit der Unterstützung offener Systeme prahlen. Es erleichtert auch die Wiederherstellung, wenn Sie bei den Gewinnspielen des Betriebssystems falsch liegen.

Entwerfen Sie Ihren Code, so dass , wenn Änderungen erforderlich sind, die Auswirkungen lokalisiert wird. Kapsel so viel wie du kannst; Machen Sie Implementierungsdetails privat.

4

bearbeiten: Ich Ich sehr einfach bemerkt fastwhat cherouvim had posted dupliziert; Das tut mir leid! Aber wir stellen fest, dass wir uns auf verschiedene Reden von Bloch beziehen, auch wenn das Thema genau dasselbe ist. (Cherouvim im Zusammenhang mit einem Vortrag im Dezember 2005, ich bis Januar 2007.) Nun, ich werde diese Antwort hier hinterlassen - Sie sind wahrscheinlich am besten, indem Sie sowohl und sehen, wie seine Botschaft und Art der Präsentation hat sich entwickelt:)


FWIW, würde Ich mag von Joshua Bloch auf diese Google Tech Talk-zu-Punkt, der ein sehr angesehener Mann in der Java-Welt ist, und jemand, der Reden und geschrieben ausführlich über API-Design gegeben hat. (Oh, und einige außergewöhnlich gute Allzweck-Bibliotheken entwickelt, wie der Java Collections Framework!)

Joshua Bloch, Google Tech Talk, 24. Januar 2007:
"How To Design A Good API and Why it Matters" (das Video ist etwa 1 Stunde lang)

Sie auch viele der gleichen Ideen in seinem Artikel lesen Bumper-Sticker API Design (aber ich empfehle immer noch die Präsentation zu beobachten!)

(Sehen Sie von der .NET-Seite kommen, ich hoffe, Sie tun nicht Lass seinen Java-Hintergrund ins Wa eintauchen y zu viel :-) Das ist wirklich nicht Java-spezifisch für den größten Teil)

Edit:. Hier ist eine andere 1½ minute bit of wisdom von Josh Bloch auf, warum schreiben Bibliotheken ist hart, und warum es immer noch wert Mühe darin setzen (Skaleneffekte) - als Antwort auf eine Frage, die sich im Grunde fragt: "Wie schwer kann es sein". (Teil einer Präsentation über die Google Collections-Bibliothek, die ebenfalls absolut sehenswert ist, aber eher Java-zentriert.)

2

Die wichtigste Regel ist, API-Design genau wie UI-Design zu behandeln: Sammeln Sie Informationen darüber, wie Ihre Benutzer wirklich sind Nutzen Sie Ihre UI/API, was sie hilfreich finden und was sich ihnen in den Weg stellt. Verwenden Sie diese Informationen, um das Design zu verbessern. Beginnen Sie mit Benutzern, die API-Abwanderung tolerieren und die API nach und nach stabilisieren können.

ich ein paar Notizen über das geschrieben, was ich über API-Design hier gelernt haben: http://www.natpryce.com/articles/000732.html

0

Ein paar getrennte Punkte:

.NET Framework nicht eine Klassenbibliothek ist. Es ist ein Framework. Es ist eine Reihe von Typen, die nicht nur Funktionalität bieten, sondern auch um Ihren eigenen Code erweitert werden können.Zum Beispiel bietet es Ihnen die abstrakte Klasse Stream und mit konkreten Implementierungen wie die NetworkStream Klasse, aber es bietet Ihnen auch die WebRequest Klasse und die Möglichkeiten, es zu erweitern, so dass WebRequest.Create("myschema://host/more") eine Instanz Ihrer eigenen Klasse hervorbringen kann WebRequest, die ihre eigene GetResponse Methode haben kann, die ihre eigene Klasse zurückgibt, die von WebResponse abgeleitet wird, so dass das Aufrufen von GetResponseStream Ihre eigene Klasse zurückgibt, die von Stream abgeleitet wird!

Und Ihre Anrufer müssen nicht wissen, dass dies hinter den Kulissen geschieht! Ein separater Punkt ist, dass für die meisten Entwickler das Erstellen einer wiederverwendbaren Bibliothek nicht das Ziel ist und nicht das Ziel sein sollte. Das Ziel sollte sein, den Code zu schreiben, der notwendig ist, um Anforderungen zu erfüllen. In diesem Prozess kann wiederverwendbarer Code gefunden werden. In diesem Fall sollte es in eine separate Bibliothek ausgelagert werden, in der es in Zukunft wiederverwendet werden kann.

Ich gehe weiter (wenn erlaubt). Ich werde normalerweise warten, bis ich zwei Teile des Codes finde, die das gleiche tun oder sich überschneiden. Vermutlich haben beide Codeteile alle ihre Komponententests bestanden. Ich werde dann den gemeinsamen Code in eine separate Klassenbibliothek ausrechnen und alle Komponententests erneut ausführen. Unter der Annahme, dass sie noch bestehen, habe ich mit der Erstellung von wiederverwendbarem Code begonnen, der funktioniert (da die Komponententests immer noch bestehen).

Dies steht im Gegensatz zu einer Lektion, die ich in der Schule gelernt habe, als das Ergebnis eines ganzen Projekts eine schöne wiederverwendbare Bibliothek war - ohne Code, um es wiederzuverwenden.

(Natürlich, ich bin sicher, dass es funktioniert hätte, wenn jeder Code hat es verwendet ...)

Verwandte Themen