Al diseñar un proyecto y diseñar la arquitectura, comienzo desde dos direcciones. Primero miro el proyecto que se está diseñando y determino qué problemas de negocios deben resolverse. Miro a las personas que lo usarán y empiezo con un diseño de interfaz de usuario crudo. En este punto, estoy ignorando los datos y solo estoy mirando lo que los usuarios piden y quién los usará.
Una vez que tengo una comprensión básica de lo que están pidiendo, determino cuáles son los datos centrales que manipularán y comienzo un diseño de base de datos básico para esos datos. Luego empiezo a hacer preguntas para definir las reglas comerciales que rodean los datos.
Al comenzar desde ambos extremos de forma independiente, puedo diseñar un proyecto de una manera que combine los dos extremos. Siempre trato de mantener los diseños separados por el mayor tiempo posible antes de fusionarlos, pero tengo en cuenta los requisitos de cada uno a medida que avanzo.
Una vez que tengo una buena comprensión sólida de cada extremo del problema, comienzo a diseñar la estructura del proyecto que se creará para resolver el problema.
Una vez que se crea el diseño básico de la solución del proyecto, miro la funcionalidad del proyecto y configuro un conjunto base de espacios de nombres que se utilizan según el tipo de trabajo que se realiza. Esto puede ser cosas como cuenta, carrito de compras, encuestas, etc.
Aquí está el diseño de la solución básica con la que siempre empiezo. A medida que los proyectos se definen mejor, lo refino para satisfacer las necesidades específicas de cada proyecto. Algunas áreas pueden fusionarse con otras y puedo agregar algunas especiales según sea necesario.
SolutionName
.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.