Frage

Der Umfang des Projekts ich arbeite wird erweitert. Die Anwendung ist recht einfach, aber zur Zeit richtet sich an eine ganz bestimmte Nische. Für die unmittelbare Zukunft habe ich gebeten worden, um das Projekt gabeln einen neuen Markt und weiter zu entwickeln, die beiden Projekte im Tandem abzuzielen.

Beide Projekte werden funktionell ähnlich sein, so gibt es ein sehr starker Anreiz ist viel von der Mut des ursprünglichen Projekts zu verallgemeinern. Ich bin sicher, auch werde ich mehr Märkte in naher Zukunft Targeting (die Märkte sind geografisch).

Das Problem ist ein bisheriger Betreuer des Projektes viele Annahmen gemacht, dass es in seinen ursprünglichen Markt binden. Es wird ziemlich viel Refactoring nehmen die generische vom Markt bestimmten Code zu trennen.

Um die Dinge komplizierter mehrere Vorschläge gemacht worden, machen herumgereicht, wie die Projekte für die wachsende Zahl der Märkte zu organisieren:

  1. Jeder Markt ist ein eigenständiges Projekt, Gemeinsamkeiten zwischen den Projekten zu einer gemeinsam genutzten Bibliothek bewegt werden, werden Projekte zum Einsatz unabhängig.
  2. erweitern das bestehende Projekt mehrere Zielmärkte, Funktionalität Begrenzung basierend auf erworbene Lizenz.
  3. Erstellen Sie eine übergeordnete Anwendung und Redesign-Projekte als Plugins, separat erhältlich

Alle drei Vorschläge haben Verdienst und im Idealfall würde Ich mag der codeto flexibel genug sein, um strukturieren, dass jeder von ihnen ist möglich, mit kleineren Anpassungen. Vorschlag 3 scheint die entmutigend zu sein, da es erfordern würde, eine Plugin-Architektur zu bauen. Die ersten beiden Vorschläge sind ein wenig plausibel.

Gibt es gute Ressourcen auf die Vor- und Nachteile dieser verschiedenen Architekturen?

Was sind die Vor- und Nachteile auf Code zwischen Projekten Versen Kopieren teilen und Forking?

War es hilfreich?

Lösung

Forking ist in der Regel gehen Sie ein schnelleres Ergebnis zunächst zu bekommen, aber fast immer gehen herum und beißen Sie in der Wartung - Fehlerbehebungen und Funktionserweiterungen von einer Gabel in den anderen Gabeln verloren gehen, und schließlich findet man sich werfen out ganze Gabeln sind und deren Eigenschaften an die „beste“ Gabel erneut hinzuzufügen. Vermeiden Sie es, wenn Sie können.

Bewegen Sie sich auf:. All drei Optionen arbeiten kann, aber sie haben Kompromisse in Bezug auf der Build-Komplexität, die Kosten der Instandhaltung, Bereitstellung, Kommunikations-Overhead und die Menge an Refactoring Sie tun müssen,


1. Jeder Markt ist ein eigenständiges Projekt

Eine gute Lösung, wenn Sie gleichzeitig für mehrere Märkte sein werden zu entwickeln.

Vorteile:

  • Es ermöglicht Entwickler für den Markt A die A bauen zu brechen, ohne die laufenden Arbeiten an B zu stören
  • Es macht es viel weniger wahrscheinlich, dass eine Änderung für den Markt A gemacht wird einen Fehler für den Markt B verursachen

Nachteile:

  • Sie haben die Zeit nehmen, den gemeinsamen Code zu trennen
  • Sie haben die Zeit zu nehmen, parallel einzurichten baut
  • Änderungen an den freigegebenen Code jetzt mehr Aufwand haben, da sie beiden Teams beeinflussen.

2. Erweitern Sie das bestehende Projekt mehr Märkte

Ziel

Kann gemacht werden für eine ganze Weile in Ordnung zu arbeiten. Wenn Sie vorhaben, auf Meldungen zu einem Zeitpunkt für einen Markt zu arbeiten, mit einem kleinen Team, könnte es die beste Wahl sein.

Vorteile:

  • Die Lizenz der Arbeit ist wahrscheinlich sowieso wertvoll, auch wenn man in Richtung (1) bewegen, oder (3).
  • Die einzige Code-Basis ermöglicht Refactoring in allen Märkten.

Nachteile:

  • Auch wenn Sie arbeiten nur auf etwas für Markt A, müssen Sie bauen und den Code für die Märkte B, C und D sowie zu versenden - in Ordnung, wenn Sie eine kleine Code-Basis haben, aber immer ärgerlich, wie Sie bekommen in die tausende von Klassen
  • Änderungen an einem Marktrisiko, den Code für andere Märkte brechen
  • Änderungen an einem Markt erfordern andere Märkte erneut getestet werden

3. Erstellen Sie eine übergeordnete Anwendung und Redesign-Projekte als Plugins

Man fühlt sich technisch süß, und kann Ihnen erlauben, mehr Code zu teilen.

Vorteile:

  • Alle Vorteile von (1), möglicherweise plus:
    • klarere Trennung der gemeinsamen und marktspezifischen Code
    • können Sie erlauben, zu einer öffentlichen API zu bewegen, die einige Ihrer Arbeit auf Ihren Kunden und / oder Verkauf von lukrativen Serviceprojekten Offloading
    • erlauben würde,

Nachteile:

  • Alle Nachteile (1) plus erfordert noch mehr Refactoring.

Ich würde vermuten, dass (2) ist eine Art, wo man sich jetzt finden, abgesehen von der Lizenzierung. Ich denke, es ist okay, es für eine Weile zu bleiben, aber einige Mühe in die Richtung zu bewegen (1) - den gemeinsamen Code in ein separates Projekt zu bewegen, auch wenn es alle zusammen gebaut ist, zum Beispiel versuchen, die Abhängigkeiten von Markt stellen Sie sicher, Code zu gemeinsamen Code sind alle in eine Richtung.

Ob Sie am Ende (1) oder (3) ist abhängig von Art. es kommt meist darauf an, wer ist „in charge“ - den gemeinsamen Code oder den marktspezifischen Code? Die Grenze zwischen einem Plugin und eine Controller-Klasse, die eine gemeinsam genutzte Komponente konfiguriert, können ziemlich verschwommen sein. Mein Rat wäre, lassen Sie den Code, den Sie sagen, was es braucht.

Andere Tipps

1) NEIN! Sie wollen nicht, verschiedene Zweige derselben Codebasis verwalten ... Weil so häufig wie der Code sein kann, möchten Sie umfassende Änderungen vornehmen, und ein Projekt „im Moment“ nicht so wichtig sein wie die anderen , und dann werden Sie einen Zweig wächst schneller als die anderen bekommen .... Einsatz Schneeball ball~~POS=HEADCOMP.

2) Dies ist mehr oder weniger der Industriestandard. Big Konfigurationsdatei begrenzen Dinge basierend auf Lizenz / Konfiguration. Es kann die App ein bisschen umständlich, aber solange der Code über sich gegenseitig ausschließende Sachen beschwert und alle Entwickler sind in ständiger Kommunikation über die neuen Funktionen und wie sie in der gesamten Anwendung kräuseln, sollten Sie tun, in Ordnung. Dies ist auch am einfachsten zu hacken, wenn das ein Anliegen ist.

3) Das auch "kann die Arbeit. Wenn Sie C # verwenden, sind Plugins relativ einfach, man muss nur über Abhängigkeit Hölle kümmern. Wenn die Plugins des Werdens zirkular interdependant keine Chance hat (das heißt, ein erfordert b c erfordert erfordert a), dann wird dies schnell explodieren und Sie werden zurückkommen (ganz einfach) zurück zu # 2.

Die besten Ressourcen, die Sie haben, sind wahrscheinlich die letzten Erfahrungen Ihrer Mitarbeiter an verschiedenen Projekten, und die Erfahrung der Menschen darüber auf hier oder Slashdot Jammer oder wo auch immer. Gewiß ist die billigste.

Pros des Teilens Code: Eine Änderung ändert alles. Einheitliche Datenmodell. Es gibt nur eine Wahrheit. (Viel einfacher für alle auf der gleichen Seite zu sein)

Cons des Teilens Code: Eine Änderung ändert alles .. Sei vorsichtig. Wenn ein Fehler in es ist, es wirkt sich auf alles.

Pros des Kopierens / Forking: Normalerweise schneller eine bestimmte Funktion für einen bestimmten Kunden zu implementieren. Schneller zu hacken, wenn man diese Annahme A realisiert nur für Märkte B und C, nicht D.

Cons des Kopierens / Forking: Ein oder mehrere der kopierten Projekte werden schließlich scheitern, wegen einem Mangel an Zusammenhalt in Ihrem Code. Wie oben gesagt: Gravierende Änderungen viel länger dauern

.

Viel Glück.

Du hast gesagt, „Kopieren und Forking“, die mich vielleicht denken führt, dass Sie nicht in Betracht gezogen haben, in einem Versionskontrollsystem wie SVN dieses „fork“ als Zweig zu verwalten. Durch es auf diese Weise tun, wenn Sie den Zweig Refactoring eine andere Branche zu empfangen, können Sie diese Änderungen zurück in den Hauptstamm mit Hilfe des Versionskontrollsystem zusammenführen.

Wenn Sie eine langfristige Strategie, den Übergang zu einer einzigen App folgen, wo alle Variationen von einer Konfigurationsdatei gesteuert werden (oder einer SQLite-Konfigurationsdatenbank), dann dieser Ansatz wird Ihnen helfen. Sie müssen nichts verschmelzen, bis Sie sicher sind, dass Sie es für beide Branchen verallgemeinert haben, so können Sie immer noch zwei einzigartige Systeme bauen, so lange, wie Sie benötigen. Aber Sie sichern sie nicht in eine Ecke, weil sie alle in einem Quellcode Baum, der Stamm für die Legacy-Industrie, und ein Zweig für jede neue Industrie.

Wenn Ihr Unternehmen wirklich will mehrere Branchen atack, dann glaube ich nicht, dass die Konfigurationsdatenbanklösung all Ihren Bedürfnissen gerecht wird. Sie werden noch spezielle Code-Module irgendeine Art haben müssen. Eine Plug-in-Architektur ist eine gute Sache in setzen, weil sie helfen, vor allem, wenn Sie ein Scripting-Engine wie Python in Ihre App einbinden. Aber ich glaube nicht, dass Plugins der Lage sein wird, alle Ihre Code Variation Anforderungen gerecht zu werden, wenn Sie in die „Tausende von Klassen“ Skala erhalten.

Sie benötigen einen pragmatischen Ansatz zu nehmen, die eine separate App heute für die neue Industrie aufzubauen erlaubt, aber macht es relativ einfach, die Verbesserungen in die bestehenden App zu fusionieren, wie Sie gehen. Sie können nie das Nirwana eines einzelnen Stammes mit Tausenden von Klassen und verschiedenen Branchen erreichen, aber Sie werden zumindest haben die Komplexität gezähmt, und nur mit wirklich wichtigen Veränderungen zu tun haben, wo es echte Unterschiede in der Industrie notwendig ist.

Wenn ich an deiner Stelle wäre, würde ich auch jeder suchen und alle Funktionen in der App, die in Betracht gezogen werden könnte „Berichterstattung“ und versuchen, sie heraus Faktor, vielleicht sogar in eine aus dem Regal Reporting-Tool.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top