2009-06-12 5 views
4

Mein C++ - Projekt wird größer. Wir verwenden auch cmake, um jetzt zu bauen. Ich möchte die Anwendung in Bibliotheken zu unterteilen, so dass sie für die Prüfung verknüpft werden können, um das Anwendungspaket vorbereitet, usw. Im Moment würde ich meinen Code in Bibliotheken wie folgt aufteilen:C++ - Anwendung in Bibliotheken teilen

  • Kern
  • GUI
  • Dienstprogramme
  • io (XML-Analyse/outputing verwenden von Druckfunktionen von Klassen in Kern)
  • Tests (Unit-Tests)
  • Simulator (testet den Kern)
  • 0 (diese von Kern und anderen Komponenten verwendet werden)

Eine Alternative wäre, basierend auf der Verzeichnisstruktur zu teilen - eine Bibliothek für jedes Verzeichnis. Aber aus meiner früheren Erfahrung führt es zu zu vielen Bibliotheken und dann werden Bibliotheksabhängigkeiten während der Verknüpfung schwer zu handhaben.

Gibt es Best Practices in dieser Hinsicht?

Antwort

5

Setzen Sie sich mit einem Stück Papier hin und entscheiden Sie Ihre Bibliotheksarchitektur.

Die Bibliothek sollte als eine Reihe von Ebenen entworfen werden.

  • A libary auf Ebene A (die Basis) sollte dependencioes nur auf Systembibliotheken haben und nur dann, wenn es
  • Eine Bibliothek auf Ebene B auf Ebene A. auf Bibliotheken müssen, können Abhängigkeiten von Bibliotheken auf der Ebene A haben und System libararies und nur dann, wenn es muss auf Bibliotheken auf Ebene B.
  • etc

Jede Bibliothek einen kompletten Job auf seiner bestimmten Ebene darstellen soll. Die Dinge auf der unteren Ebene haben in der Regel kleinere Jobs, aber viele davon. Eine Bibliothek auf einer höheren Ebene sollte eine vollständige Aufgabe erneut bereitstellen. dh keine lib für windows-objekte und eine lib für events. Auf dieser Ebene ist der Job hier handline alle Interaktion mit einem Fenster (dazu gehört, wie es mit Ereignissen interagiert).

Sie scheinen einige resonierbare funktionelle Gruppen identifiziert zu haben. Der einzige, der etwas verdächtig ist, ist io. Wenn Sie wirklich einige generische IO-Routinen haben, die echte Funktionalität bieten. Aber wenn es nur die IO für eine Reihe von verschiedenen Objekten gruppiert, würde ich das verwerfen (es hängt alles von der Verwendung ab).

Also ist der nächste Schritt, die Beziehung zwischen ihnen zu identifizieren.

Wie für die Verwendung von Verzeichnisstrukturen. Normalerweise ist alles in einem Verzeichnis in derselben Bibliothek vorhanden, aber dies schließt nicht die Beweglichkeit anderer Verzeichnisse aus, die ebenfalls vorhanden sind. Ich würde vermeiden, die Hälfte der Klassen in Verzeichnis in libA und die andere Hälfte der Klassen in libB usw. setzen

+0

Von mir meinte ich Parsing und Ausgabe von XML (oder einem anderen Format) usw. Ich würde die Fabriken und Druckfunktionen von Klassen im Kern verwenden. –

+0

Ich sage nicht, dass es falsch ist. Sie müssen sich den Code anschauen und eine Entscheidung treffen. Wenn die Fabriken und Druckfunktionen erheblich genug sind, um eine Geldbuße zu rechtfertigen. –

1

Scheint vernünftig.

würde ich fragen, was Ihre unit_tests Bibliothek tun sollen. Angesichts einer Sammlung von "Projekten" erstellen libA, libB, libC ... Ich würde erwarten, einige übereinstimmende Projekte testA testB testC zu sehen (ob sie Bibliotheken oder ausführbare Dateien erstellen, hängt davon ab, ob die gebauten Tests eigenständig laufen oder in einige Test Runner geladen werden)).

Ich bin auch von „Dienstprogramme“ Bibliotheken etwas vorsichtig. Diese scheinen auf lange Sicht eine überraschende Fähigkeit zu haben, Schmerzen und Leiden zu verursachen. Zum Beispiel hat Ihre IO-Bibliothek möglicherweise keine andere Abhängigkeit als die Utilities-Bibliothek. Eines Tages möchten Sie die E/A-Bibliothek in einem anderen Projekt auf einer anderen Plattform wiederverwenden. Das einzige Problem ist, dass Sie jetzt auch alle Utilities-Bibliotheken portieren müssen (von denen IO nicht zu 90% verwendet wird) oder die 10% davon trennen, von denen IO tatsächlich abhängt. Manchmal ist es besser, Bibliotheken etwas abhängiger zu machen, auf Kosten von Code-Duplizierung.

+0

Ich stimme dem überein, was Sie über die Bibliothek "Dienstprogramme" sagen. Aber hoffentlich ist das Beispiel, das Sie geben, ein kleineres Problem, da wir bereits auf Windows mit Visual Studio Compiler und Linux mit g ++ bauen. –

2

Sie sollten eine Lese von Groß C++ Software Design von John Lakos haben.

Sie können es nicht lesen können, bevor Sie Ihre Arbeit beginnen, aber Sie sollten dieses Buch auf Ihrer Liste setzen.

Ansonsten raten Martin York ist Klang.

Eine weitere Sache, aber ich würde empfehlen, ein Tool wie doxygen Aufnehmen, dass Sie Abhängigkeitsdiagramme Ihre Code-Basis geben kann. Wenn Sie diese Art der Umstrukturierung tun, sollten Sie sich von den zirkulären Abhängigkeiten zwischen Ihren Bibliotheken befreien. Lakos beschreibt eine Vielzahl von Möglichkeiten, Abhängigkeiten abzubauen - einige offensichtlich, andere weniger.

+1

Ich finde das Buch von Lakos zu ausführlich. In dem Buch ist es schwierig, saubere, nützliche und nicht intuitive Tipps von unsauberen, nutzlosen und offensichtlichen Tipps zu trennen. Es würde mich interessieren, ob jemand die guten Teile des Buches extrahiert hat. –

+0

Oh ja, es ist ziemlich ausführlich! Bis zu dem Punkt, langweilig zu sein. Auf der anderen Seite sind einige echte Edelsteine ​​drin, und nein, ich kenne keine genauere Version. :( –