Wie organisieren Sie Ihre Projekte? [geschlossen]

148

Haben Sie einen bestimmten Stil bei der Organisation von Projekten?

Zum Beispiel erstelle ich gerade ein Projekt für ein paar Schulen hier in Bolivien. So habe ich es organisiert:

TutoMentor (Solution)
TutoMentor.UI   (Winforms project)
TutoMentor.Data (Class library project)

Wie genau organisieren Sie Ihr Projekt? Haben Sie ein Beispiel für etwas, das Sie organisiert haben und auf das Sie stolz sind? Können Sie einen Screenshot des Lösungsbereichs freigeben?

Im UI-Bereich meiner Anwendung habe ich Probleme, ein gutes Schema zu finden, um verschiedene Formulare zu organisieren und wo sie hingehören.


Bearbeiten:

Was ist mit dem Organisieren verschiedener Formulare im .UI-Projekt? Wo / wie soll ich eine andere Form gruppieren? Es ist eine schlechte Idee, sie alle in der Stammebene des Projekts zu platzieren.


quelle
Wow, ein 450er Kopfgeld !?
Mateen Ulhaq
2
@muntoo: Ja, ich bin wirklich an ein paar tollen Antworten interessiert. :)
Es sollte ausdrücklich darauf hingewiesen werden, dass Sie nach C # fragen. Ich persönlich sehe die Tags nie.
Pithikos
Eine typische Struktur des .Net-Repository finden Sie unter gist.github.com/davidfowl/ed7564297c61fe9ab814
Michael Freidgeim,
2
Wie immer werden viele gute Fragen aus XYZ-Gründen geschlossen. Möglicherweise haben wir noch viele andere gute Antworten.
Mohammed Noureldin

Antworten:

107

Wenn ich ein Projekt entwerfe und die Architektur entwerfe, gehe ich von zwei Richtungen aus. Zuerst schaue ich mir das Projekt an und bestimme, welche Geschäftsprobleme gelöst werden müssen. Ich schaue auf die Leute, die es benutzen werden und beginne mit einem groben UI-Design. An diesem Punkt ignoriere ich die Daten und schaue nur, was die Benutzer verlangen und wer sie verwenden wird.

Sobald ich ein grundlegendes Verständnis dafür habe, wonach sie fragen, stelle ich fest, welche Kerndaten sie bearbeiten, und beginne mit einem grundlegenden Datenbanklayout für diese Daten. Dann beginne ich, Fragen zu stellen, um die Geschäftsregeln zu definieren, die die Daten umgeben.

Wenn ich von beiden Seiten unabhängig voneinander beginne, kann ich ein Projekt so auslegen, dass beide Seiten miteinander verschmelzen. Ich versuche immer, die Entwürfe so lange wie möglich getrennt zu halten, bevor ich sie zusammenführe, aber denke dabei an die Anforderungen der einzelnen Entwürfe.

Sobald ich ein solides Verständnis für jedes Ende des Problems habe, beginne ich mit der Gliederung des Projekts, das erstellt wird, um das Problem zu lösen.

Sobald das Grundlayout der Projektlösung erstellt ist, überprüfe ich die Funktionalität des Projekts und richte einen Basissatz von Namespaces ein, die je nach Art der ausgeführten Arbeit verwendet werden. Dies können Dinge wie Konto, Einkaufswagen, Umfragen usw. sein.

Hier ist das grundlegende Lösungslayout, mit dem ich immer beginne. Wenn die Projekte genauer definiert werden, verfeinere ich sie, um den spezifischen Anforderungen jedes Projekts gerecht zu werden. Einige Bereiche können mit anderen zusammengeführt werden, und ich kann bei Bedarf einige spezielle Bereiche hinzufügen.

Lösungsname

.ProjectNameDocuments
    For large projects there are certain documents that need to be kept with
    it. For this I actually create a separate project or folder within the 
    solution to hold them.
.ProjectNameUnitTest
    Unit testing always depends on the project - sometimes it is just really 
    basic to catch edge cases and sometimes it is set up for full code 
    coverage.  I have recently added graphical unit testing to the arsenal.
.ProjectNameInstaller
    Some projects have specific installation requirements that need to be 
    handled at a project level.
.ProjectNameClassLibrary
    If there is a need for web services, APIs, DLLs or such.
.ProjectNameScripts (**Added 2/29/2012**)
    I am adding this because I just found a need for one in my current project.  
    This project holds the following types of scripts: SQL (Tables, procs, 
    views), SQL Data update scripts, VBScripts, etc.
.ProjectName
    .DataRepository 
        Contains base data classes and database communication.  Sometimes 
        also hold a directory that contains any SQL procs or other specific 
        code.  
    .DataClasses
        Contains the base classes, structs, and enums that are used in the 
        project.  These may be related to but not necessarily be connected
        to the ones in the data repository.
    .Services 
        Performs all CRUD actions with the Data, done in a way that the 
        repository can be changed out with no need to rewrite any higher 
        level code.
    .Business
        Performs any data calculations or business level data validation,
        does most interaction with the Service layer.
    .Helpers
        I always create a code module that contains helper classes.  These 
        may be extensions on system items, standard validation tools, 
        regular expressions or custom-built items.  
    .UserInterface
        The user interface is built to display and manipulate the data.  
        UI Forms always get organized by functional unit namespace with 
        additional folders for shared forms and custom controls.
Amy Patterson
quelle
Beste Antwort bisher!
Genieße das Kopfgeld, deine Antwort hat mir enorm geholfen.
3
@Amy sind sie alle Projekte? Oder nur die Top-Level-Artikel? Ich bin ziemlich neu in .Net und habe Probleme bei der Entscheidung, ob etwas ein Projekt oder ein Unterordner eines Projekts sein soll.
Carson Myers
1
@Carson Myers Jedes Element der obersten Ebene ist ein Projekt. Das Element der zweiten Ebene ist ein Ordner innerhalb eines Projekts. Einige der Elemente der obersten Ebene sind Projekte, die in DLLs kompiliert werden, auf die die anderen Projekte bei Bedarf verweisen.
Amy Patterson
3
@Amy Ihre Antwort hat mir sehr gut gefallen, sehr ausführliche Erklärung. Aber ich habe in einigen Beispielen Leute gesehen, die DataRepository, DataClasses, Services, Business usw. in verschiedene Projekte unterteilt haben, anstatt in verschiedene Ordner im selben Projekt. Was würden Sie dazu sagen? Was sind die Vor- / Nachteile zwischen den beiden Optionen? Vielen Dank!
Emzero
66

Ich teile meine Projekte gerne in Ebenen ein

Auf diese Weise ist es einfacher, zyklische Abhängigkeiten zu verwalten. Ich kann beispielsweise garantieren, dass kein Projekt versehentlich das View-Projekt (Layer) importiert. Ich neige auch dazu, meine Schichten in Unterschichten aufzubrechen. So haben alle meine Lösungen eine Liste von Projekten wie folgt:

  • Produkt.Kern
  • Produkt.Modell
  • Produkt.Präsentant
  • Produkt.Persistenz
  • Product.UI
  • Produktvalidierung
  • Produktbericht
  • Product.Web

Sie sind die größeren "Bausteine" meiner Anwendung. Dann organisiere ich in jedem Projekt logischer in Namespaces, aber es variiert sehr. Für die Benutzeroberfläche versuche ich beim Erstellen vieler Formulare, in räumlichen Abschnitten zu denken und dann Namespaces für jeden "Raum" zu erstellen. Nehmen wir an, es gibt eine Reihe von Benutzersteuerelementen und Formularen für die Benutzereinstellungen, für die ich einen Namespace namens UserPreferences habe und so weiter.

Alex
quelle
Was ist mit: Produkt - Kern - Modell - Präsentator - Persistenz - Benutzeroberfläche - Validierung - Bericht - Web
Daniel Fisher lennybacon
Ich halte das Corefür ziemlich gefährlich, weil es zu einem monolithischen Code-Design führt, bei dem die meisten logischen Abläufe möglicherweise nicht ausgeführt werden Core. Beispiel: Eine Logik, die nicht wie ein Modell, ein Präsentator, eine Persistenz, eine Benutzeroberfläche, eine Validierung, ein Bericht oder ein Web klingt, wird auf natürliche Weise verwendet Core.
Yeo
@Yeo Dies kann beide Seiten wiedergeben, indem Sie Ihr CoreProjekt entweder in einen monolithischen Müll verwandeln oder eine Lösung mit Hunderten von Projekten vermeiden . Es liegt in der Verantwortung des Entwicklers, diese Entscheidung zu treffen. Keine Projektstruktur kann schlechte Programmierer davor bewahren, schlechte Dinge zu tun.
Alex
1
@Prokurors ja, normalerweise in Product.Core befindet sich die "Kern" -Geschäftslogik des Systems. Die "UI Business-Logik" sollte in Product.Presenter gehen. Wenn Ihr System beispielsweise feststellt, dass eine Schaltfläche deaktiviert werden muss, während bestimmte Daten geladen werden, bezeichne ich dies als "UI-Geschäftslogik" und füge dies dem Präsentator hinzu. Die "Kerngeschäftslogik" steht in direktem Zusammenhang mit Ihrem Kernmodell (oder Domänenmodell). Ein Nachrichtensystem kann festlegen, dass die maximale Anzahl von Zeichen 140 Zeichen beträgt. Dies ist eine Logik, die zum Kern Ihres Unternehmens gehört.
Alex
2
Inwiefern unterscheidet sich das Produkt von der Benutzeroberfläche oder dem Web?
Dopatraman
19

Projekte organisieren

Normalerweise versuche ich, meine Projekte nach Namespace zu unterteilen, wie Sie sagen. Jede Schicht einer Anwendung oder Komponente ist ein eigenes Projekt. Wenn es darum geht, wie ich meine Lösung in Projekte aufteilen möchte , konzentriere ich mich auf die Wiederverwendbarkeit und die Abhängigkeiten dieser Projekte. Ich denke darüber nach, wie andere Mitglieder meines Teams das Projekt nutzen werden, und ob andere Projekte, die wir später erstellen, von der Verwendung einer Komponente des Systems profitieren könnten.

Zum Beispiel ist es manchmal ausreichend, nur dieses Projekt zu haben, das eine ganze Reihe von Frameworks (E-Mail, Protokollierung usw.) enthält:

MyCompany.Frameworks

In anderen Fällen möchte ich möglicherweise Frameworks in Teile aufteilen, damit sie einzeln importiert werden können:

MyCompany.Frameworks.Networking
MyCompany.Frameworks.Logging
MyCompany.Frameworks.SomeLOBFramework

Formulare organisieren

Das Organisieren von Formularen unter einem UI-Projekt ändert sich wirklich, wenn Ihr Projekt erweitert wird.

  • Klein - Ein einfacher Formularordner kann für ein sehr kleines Projekt ausreichen. Manchmal können Sie Strukturen wie Namespaces überentwickeln und die Dinge komplizierter machen, als sie sein müssen.

  • Mittel bis groß - Hier beginne ich normalerweise, meine Formulare in Funktionsbereiche zu unterteilen. Wenn ich einen Teil meiner App habe, der 3 Formulare zum Verwalten eines Benutzers enthält, und einige, die Fußballspiele und -ergebnisse verfolgen, dann habe ich einen Bereich Formulare> Benutzer und einen Bereich Formulare> Spiele oder ähnliches. Es hängt wirklich vom Rest des Projekts ab, wie viele Formen ich habe, um zu bestimmen, wie feinkörnig ich es aufteile.

Denken Sie daran, dass am Ende des Tages Namespaces und Ordner zur Verfügung stehen, die Ihnen helfen, die Dinge schneller zu organisieren und zu finden.


Es hängt wirklich von Ihrem Team, Ihren Projekten und dem ab, was für Sie einfacher ist. Ich würde vorschlagen, dass Sie im Allgemeinen separate Projekte für jede Schicht / Komponente Ihres Systems erstellen, aber es gibt immer Ausnahmen.

Anleitungen zur Systemarchitektur finden Sie auf der Website "Patterns and Practices" von Microsoft.

Ryan Hayes
quelle
12

Wenn ich Code in .NET schreibe, besteht eine eindeutige Tendenz zu Clustern verwandter Funktionen. Jeder von ihnen kann einige Untergruppen desselben haben. Ich mag es, die Hauptgruppen physisch aufzuteilen - eine davon pro VS-Projekt. Ich unterteile dann weiter logisch mit Hilfe von Baugruppen. Nach diesem Muster sieht eines meiner aktuellen Projekte so aus:

  • Wadmt (Lösung)
    • Wadmt.Common
    • Wadmt.Data
      • Wadmt.Data.MySql
      • Wadmt.Data.SqlServer
      • Wadmt.Data.Oracle
    • Wadmt.Domain
    • Wadmt.Services
    • Wadmt.Tests
      • Wadmt.Tests.Common
      • Wadmt.Tests.Domain
      • Wadmt.Tests.Services
      • Wadmt.Tests.Integration
    • Wadmt.Web

Hoffentlich ist das nützlich für Sie. Das Ausmaß der Trennung hat mich einige Zeit gekostet, um es herauszufinden.

Grant Palin
quelle
4
Ich würde "Wadmt" reduzieren. Halten Sie das Dateisystem trocken. Das hilft sehr bei der Arbeit an der Konsole ...
Daniel Fisher Lennybacon
7

Es ist gut, einen Plan für die Organisation Ihrer Lösungen zu haben, und es gibt verschiedene Möglichkeiten, dies zu tun. Wir verfügen über einige Funktionen, die für mehrere Projekte gemeinsam genutzt werden, wodurch auch die Konsistenz für unsere Benutzer gewährleistet wird. Die Projektorganisation hängt davon ab, was wir tun. Im Kern werden wir haben:

Company (solution)
  Company.Common (shared library)
  Company.Project (Main application UI)
  Company.Project.UnitTests (Unit tests for all project modules)
  Company.Project.IntegrationTests (integration tests for all project modules)
  Company.Project.AutomationTests (tests that invoke the UI)

Von dort hängt es wirklich vom Setup ab. Wenn wir sowohl eine Client-Anwendung als auch ein Web-Front-End haben (nützlich zum Sammeln von Nutzungsergebnissen im Klassenzimmer oder für andere Forschungszwecke), benötigen wir ein Projekt mit dem gemeinsam genutzten Code (dh den Datenobjekten, die serialisiert werden).

  Company.Project.Model (ORM and business logic layer)
  Company.Project.Webapp (Web frontend/web service layer)
  Company.Project.WebClient (client code for web services)

Bei Bedarf können weitere Teilprojekte hinzugefügt werden. Wie gesagt, es kommt wirklich auf das Projekt an. Einige Projekte sind sehr einfach und benötigen nur Kernelemente. Wir versuchen, eine willkürliche Projekttrennung zu bekämpfen, daher ist eine Unterteilung nach Ebenen wirklich sinnvoll. Die Ebenen werden dadurch definiert, was für Projekte, Lösungen oder Plugins / Erweiterungen gemeinsam genutzt werden muss.

Berin Loritsch
quelle
6

Es ist interessant, dass so viele Leute hier nicht an TROCKEN denken. Es ist ein paar Mal in meinem Leben vorgekommen, dass Entwickler Verzeichnisstrukturen erstellt haben, die aus diesem Grund nicht erstellt werden konnten. Halten Sie den Projektnamen von Lösungs- und Projektverzeichnissen fern!

Also hier ist mein Weg:

{drive}:\{customer}\{apps|libs|tools}\{project}
  - cer
  - res
  - src
   - Common
   - Data
   - UI
   - Logic
   - Logic._Tests  
Daniel Fisher Lennybacon
quelle
Was ist DRY? Abkürzung für etwas?
Pithikos
1
@ Pithikos Es ist eine Abkürzung für Don't Repeat Yourself
Pero P.
2
was ist Logic? Konnte der CommonOrdner keine Logik enthalten ?
Dopatraman
1
Ich habe resuable Sachen in Common gelegt. Einige könnten auch Framework oder Core sagen ...
Daniel Fisher lennybacon
2

Wenn ich meine Anwendung entwerfe, sehe ich sie immer als Module mit einigen Abhängigkeiten zwischen ihnen. Wenn ich an ein Design denke, verwende ich eine Bottom-up- Strategie, um es zu entwickeln. Ich entwickle jedes Modul und dann bekomme ich sie zusammen arbeiten.

Nun, diese Module sind Projekte unter meiner Lösung (normalerweise Klassenbibliotheken ). Jedes Modul hat einen anderen Namespace und ein eigenes Design (mit Klassen usw.).

Eines dieser Module ist die GUI ( Graphical User Interface ).

Ich verwende auch immer ein Revision Control- Tool, um die Änderungen in jedem Projekt zu verfolgen. Ich schlage Git vor . Es ist Open Source, verteilt und kostenlos zu benutzen.

Oscar Mederos
quelle
1

Jedes Mal, wenn ich ein neues Projekt beginne, erhalte ich eine umfassende Beschreibung dessen, was es tun soll. Dieser Input hilft mir, indem er mir einen Kontext bietet. Daher denke ich, welche Methode am besten (oder am besten geeignet) ist, um die Projektziele zu erreichen. An diesem Punkt beginne ich zu überlegen, in welchen Entwurfsmustern ich die beabsichtigte Lösung finden kann. Hier beginne ich mit der Organisation des Projekts unter Berücksichtigung der Entwurfsmuster, die ich für das Projekt übernehmen werde.

Einige Beispiele:

  1. Wenn sich das Projekt nur auf das Erstellen von Eingabedatenbildschirmen bezieht. Höchstwahrscheinlich würde ich ein MVC-Muster verwenden.
  2. Wenn das Projekt als Hochleistungs-Benutzeroberfläche verwendet werden soll, die meist mehrere Plattformen unterstützt, ist ein MVVM-Entwurfsmuster hilfreich.

Denken Sie daran, dass Sie jedes Mal gezwungen sind, Ihr Projekt auf eine bestimmte Weise zu organisieren.

Hier ist eine Lektüre für Sie:

.Net Design Patterns .

Entwurfsmuster .

Objektorientiertes Design .

Hoffe das hilft.

El Padrino
quelle