2010-03-25 12 views
9

Una de las preguntas que me pidieron fue que tengo una tabla de base de datos con los siguientes columnasnecesitan pensamientos en mi pregunta de la entrevista - .NET, C#

pid - unique identifier 
orderid - varchar(20) 
documentid - int 
documentpath - varchar(250) 
currentLocation - varchar(250) 
newlocation - varchar(250) 
status - varchar(15) 

tengo que escribir AC# app para mover los archivos de la ubicación actual a la ubicación nueva y la columna de estado de actualización como 'SUCCESS' o 'FAILURE'.

Esta fue mi respuesta

  1. crear una lista de todos los registros utilizando LINQ

  2. Crear un objeto de comando que sería realizar mover archivos

  3. usando foreach, invocar un delegado para mover los archivos -

  4. use endinvoke para capturar cualquier excepción y actualizar el db accordin gli

me dijeron que el patrón de comando y delegado no se ajustaban a la factura aquí - yo era aksed para pensar y poner en práctica un patrón GoF más favorable.

No estoy seguro de lo que estaban buscando - En este día y edad, los candidatos mantienen mucha información en la cabeza, ya que uno siempre tiene Google para encontrar una respuesta y encontrar una solución.

+9

Francamente, no veo cómo se aplican los patrones de GoF aquí. Esto suena como un trivial programa de 20 líneas con algunas subrutinas que usan un ORM como Linq to SQL o EF, y no más de 50 líneas en raw ADO.NET. – Aaronaught

+2

Estoy con Aaronaught en este caso, parece demasiado simple para exigir un patrón GoF significativo. Si le dan un poco más de información, como la cantidad de registros que podría esperar en la base de datos, es posible que pueda tomar algunas buenas decisiones. La idea del comando + borrar fue una solución de estilo de entrevista bastante admirable, esta pregunta, si me permite decirlo ... – LorenVS

+0

Utilicé delegados, ya que no tenía idea de cuántos registros había y con los delegados podía irme con fuego y olvidarme rutina – uno

Respuesta

3

Estoy de acuerdo con el comentario anterior de Aaronaught. Para un problema como este, a veces puede pensar demasiado y tratar de hacer algo más de lo que realmente necesita hacer.

Dicho esto, el único patrón de GoF que se me ocurrió fue "Iterator". En su primera declaración, dijo que leería todos los registros en una lista. Lo único que podría ser problemático con eso es tener millones de estos registros. Probablemente desee procesarlos de una manera más sucesiva, en lugar de leer toda la lista en la memoria. El patrón Iterator le daría la capacidad de iterar sobre la lista sin tener que conocer el mecanismo subyacente (base de datos) de almacenamiento/recuperación. La implementación subyacente del iterador podría recuperar uno, diez o cien registros a la vez, y distribuirlos a la lógica comercial a pedido. Esto también proporcionaría algún beneficio de prueba, ya que podría probar su otra lógica "comercial" utilizando un tipo diferente de almacenamiento subyacente (por ejemplo, la lista en memoria), para que las pruebas de su unidad sean independientes de la base de datos.

+0

Andy: ¿me puede guiar a cualquier muestra que crea que valga la pena que explique el uso del patrón de iterador como sugiere? – uno

+0

No conozco ninguna muestra de que pueda señalarlo, pero probablemente podría escribir algo para probarlo. Eche un vistazo al artículo "Iterador" en Wikipedia, tiene algunos ejemplos más simples sobre cómo se implementa normalmente un iterador, y puede extenderlo desde allí para tener una búsqueda de base de datos subyacente. –

2

Una comprensión profunda de los patrones es algo que definitivamente debería tener como desarrollador: no debería tener que ir a Google para determinar qué patrón "usar" porque no tendrá tiempo suficiente para comprender realmente ese patrón entre cuando empiezas a leer sobre eso y cuando lo aplicas.

Los patrones son principalmente sobre las fuerzas de comprensión y la variación de encapsulado. Es decir, las fuerzas crean ciertos tipos de variación y tenemos formas bien entendidas de encapsular esos tipos de variación. Un "patrón" es un cuerpo de comprensión sobre qué fuerzas conducen a qué tipo de variación y qué métodos de encapsulación se adaptan mejor a ellas.

Tengo un amigo que estaba impartiendo un curso sobre patrones y de repente se le ocurrió que podía resolver un problema determinado "usar" (que significa "implementar la técnica encapsulante de") cada patrón en su libro de texto. Realmente hizo un gran trabajo ayudando a llevar a casa el hecho de que encontrar la técnica correcta es más importante que saber cómo aplicar una técnica.

El Comando patrón, por ejemplo, comienza con una comprensión que a veces queremos variar cuando algo sucede. En estos casos, queremos desacoplar la decisión de qué hacer a partir de la decisión de cuándo hacerlo. En este ejemplo, no veo ninguna indicación de que cuando su comando se debe ejecutar varía en absoluto.

De hecho, realmente no veo nada que varíe, por lo que es posible que no haya ningún patrón en el problema. Si sus entrevistadores decían que sí, entonces también podrían aprender algo.

Anywho ... Yo recomendaría Patrones de diseño Explicación por Shalloway and Trott. Obtendrá una comprensión más profunda de para qué son realmente los patrones y cómo lo ayudan a hacer su trabajo y, la próxima vez que le digan que está "usando" el patrón incorrecto, es posible que esté en condiciones de educarlos. Eso parece ir bastante bien para mí ... aproximadamente el 20% del tiempo. :)

+0

Max: ¿tu amigo publica sus diapositivas? encontré esto: http://stackoverflow.com/questions/782690/pattern-books-for-c-vb-net-developers Mi pensamiento acerca de Google era más que ver con las características etc, como tratar de determinar alguna expresión lambda que alguien más ya pudo haber resuelto y publicado en su blog – uno

+0

Esto fue todo en una pizarra. Tienes razón en que esas preguntas tontas sobre tecnología son, bueno, tontas. Estaba hablando sobre los patrones de tu pregunta. –

+0

... pero siempre estoy contento de discutirlo en un foro más apropiado. Mira el Yahoo! Grupo LeanProgramming; ese sería probablemente un buen lugar para una discusión en profundidad sobre los patrones. –

0

Preferiría decir que el entrevistador quería que usara (o mencione) los principios de diseño orientado a objetos SOLID aquí, y en ese proceso podría usar algún patrón de diseño.

Por ejemplo, podríamos hacer un diseño como el siguiente que se adhiere a SRP, OCP y DIP.

internal interface IStatusRecordsToMove 
{  
    List<IRecord> Records { get; } 
} 

internal interface IRecord 
{ 
    string Status { get; set; } 
} 

internal interface IRecordsMover 
{ 
    ITargetDb TargetDb { get; } 
    void Move(IStatusRecordsToMove record); 
} 

internal interface ITargetDb 
{ 
    void SaveAndUpdateStatus(IRecord record); 
} 

class ProcessTableRecordsToMove : IStatusRecordsToMove 
{ 
    public List<IRecord> Records 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

internal class ProcessRecordsMoverImpl : IRecordsMover 
{ 
    #region IRecordsMover Members 

    public ITargetDb TargetDb 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public void Move(IStatusRecordsToMove recordsToMove) 
    { 
     foreach (IRecord item in recordsToMove.Records) 
     { 
      TargetDb.SaveAndUpdateStatus(item); 
     } 
    } 

    #endregion 
} 

internal class TargetTableBDb : ITargetDb 
{ 
    public void SaveAndUpdateStatus(IRecord record) 
    { 
     try 
     { 
      //some db object, save new record 
      record.Status = "Success"; 
     } 
     catch(ApplicationException) 
     { 
      record.Status = "Failed"; 
     } 
     finally 
     { 
      //Update IRecord Status in Db 
     } 
    } 
} 
Cuestiones relacionadas