2010-03-25 14 views
9

Una delle domande che mi è stato chiesto è che ho una tabella del database con i seguenti colonnebisogno di pensieri per la questione intervista - .net, C#

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

devo scrivere aC# applicazione per spostare i file da currentlocation to newlocation e aggiorna la colonna di stato come "SUCCESS" o "FAILURE".

Questa è stata la mia risposta

  1. creare un elenco di tutti i record utilizzando LINQ

  2. Creare un oggetto di comando che sarebbe eseguire spostare i file

  3. utilizzando foreach, richiamare un delegato per spostare i file -

  4. uso EndInvoke per catturare qualsiasi eccezione e aggiornare il db Accordin gly

mi hanno detto che modello di comando e delegato non contenere il disegno di legge qui - ero aksed a pensare e realizzare un modello più favorevole GoF.

Non so che cosa stavano cercando - In questo giorno ed età, fanno i candidati tengono un sacco di informazioni sulla testa come una sempre ha google per trovare una risposta e venire con la soluzione.

+9

Francamente non vedo come si applicano i modelli GoF qui. Sembra un semplice programma a 20 linee con poche subroutine che utilizzano un ORM come Linq a SQL o EF e non più di 50 righe in ADO.NET non elaborato. – Aaronaught

+2

Sono con Aaronaught su questo, sembra troppo semplice per richiedere un pattern GoF significativo. Se ti viene data qualche informazione in più, come il numero di record che potresti aspettarti nel database, potresti riuscire a prendere delle buone decisioni. Il comando + cancella idea è stata una soluzione ammirevole in stile intervista questa domanda se posso dirlo anch'io ... – LorenVS

+0

Ho usato i delegati, dato che non avevo idea di quanti record ci fossero e con i delegati potevo andare con il fuoco e dimenticare routine – uno

risposta

3

I sorta di accordo con il commento di Aaronaught sopra. Per un problema di questo tipo, a volte è possibile prevederlo e provare a fare qualcosa di più di quello che è effettivamente necessario fare.

Detto questo, quello modello GoF che è venuto in mente era "Iterator." Nella tua prima affermazione, hai detto che avresti letto tutti i record in una lista. L'unica cosa che potrebbe essere problematica è che hai milioni di questi record. Probabilmente vorrai elaborarli in un modo più successivo, piuttosto che leggere l'intera lista in memoria. Il pattern Iterator ti darà la possibilità di scorrere l'elenco senza dover conoscere il meccanismo di archiviazione/recupero sottostante (database). L'implementazione sottostante dell'iteratore potrebbe recuperare uno, dieci o cento record alla volta e assegnarli alla logica aziendale su richiesta. Ciò fornirebbe qualche beneficio test così, perché si potrebbe verificare l'altra logica "business" utilizzando un diverso tipo di archiviazione sottostante (ad esempio in memoria lista), in modo che i test di unità sarebbero indipendenti dal database.

+0

Andy: puoi guidarmi a qualsiasi campione che ritieni sia degno che spiegherebbe l'uso del pattern iteratore come suggerisci? – uno

+0

Non so di un campione in cui posso puntare anche te, ma potresti probabilmente scrivere qualcosa tu stesso per provarlo. Dai un'occhiata all'articolo "Iterator" su Wikipedia, ci sono alcuni esempi più semplici su come un iteratore viene normalmente implementato, e puoi estenderlo da lì per avere una ricerca del database sottostante. –

2

Una conoscenza approfondita dei pattern è qualcosa che dovresti assolutamente avere come sviluppatore - non dovresti avere bisogno di andare su Google per determinare quale pattern usare, perché non avrai abbastanza tempo per capire veramente quel modello tra quando inizi a leggerlo e quando lo applichi.

modelli sono per lo più di capire le forze e incapsulare variazione. Cioè, le forze creano certi tipi di variazione e abbiamo modi ben compresi di incapsulare questo tipo di variazione. Un "modello" è un corpo di comprensione su quali forze portano a quali tipi di variazione e quali metodi di incapsulamento indirizzano meglio quelli.

Ho un amico che insegnava un corso sui modelli e improvvisamente lo colpì che avrebbe potuto risolvere un dato problema "usando" (che significa "che attua la tecnica di incapsulamento di") ogni modello nel suo libro di testo. Ha fatto davvero un ottimo lavoro per aiutare a portare a casa il fatto che trovare la tecnica giusta è più importante sapere come applicare una tecnica.

Il Comando modello, per esempio, inizia con una comprensione che a volte vogliamo variare quando succede qualcosa. In questi casi, vogliamo disaccoppiare la decisione su cosa fare dalla decisione di quando farlo. In questo esempio, non vedo alcuna indicazione sul fatto che quando il comando debba essere eseguito possa variare.

In effetti, non vedo davvero nulla che varia in modo da non avere alcun modello nel problema. Se i tuoi intervistatori stavano dicendo che c'erano, allora potrebbero anche imparare a fare qualcosa.

Anywho ... I'd recommend Design Patterns Explained di Shalloway e Trott. Avrai una comprensione più profonda di quali sono realmente gli schemi e di come ti aiutano a svolgere il tuo lavoro e, la prossima volta che ti dicono che stai "utilizzando" il modello sbagliato, potresti essere in grado di educarli. Ciò sembra andare piuttosto bene per me ... circa il 20% delle volte. :)

+0

Max: il tuo amico pubblica le sue diapositive? ho trovato questo: http://stackoverflow.com/questions/782690/pattern-books-for-c-vb-net-developers Il mio pensiero su google era più legato alle funzionalità ecc., Come cercare di determinare qualche espressione lambda che qualcun altro potrebbe aver già risolto e pubblicato sul proprio blog – uno

+0

Questo era tutto su una lavagna. Hai ragione che quelle sciocche domande sulla tecnologia sono, beh, stupide. Stavo parlando della parte degli schemi della tua domanda. –

+0

... ma sono sempre lieto di discuterne in un forum più appropriato. Dai un'occhiata a Yahoo! Gruppo LeanProgramming; probabilmente sarebbe un buon posto per una discussione approfondita sui modelli. –

0

Direi piuttosto che l'intervistatore voleva che tu usassi (o menzioni) i principi di progettazione orientata agli oggetti dello SOLID, e in quel processo potresti usare un modello di progettazione.

Ad esempio, è possibile creare un progetto come di seguito che aderisce a SRP, OCP e 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 
     } 
    } 
}